- 마지막 업데이트
점검/업데이트
이해하기
스토브 SDK가 제공하는 점검/업데이트 기능을 이용하면 게임서버 점검을 설정·해제하거나 게임 버전을 관리하여 업데이트를 제어할 수 있어요.
스토브 SDK는 이용자의 앱(클라이언트) 안에서 동작해요. 앱을 켤 때 점검 중이거나 새 업데이트가 나왔다면 이용자에게 안내 팝업을 보여줘요.
다만, 스토브 기능 이외에 게임서버에서 직접 관리해야 하는 부분이 포함되어 있어 함께 구현이 필요해요.
SDK는 앱 실행 시점에만 점검/업데이트를 확인해요
ㆍ 확인은 앱 실행(initialize) 시 한 번뿐이며, 플레이 도중에는 실시간으로 감지하지 않아요.
ㆍ 플레이 중 점검 감지(Heartbeat), 접속 중 이용자 Kick은 게임서버에서 직접 구현해야 해요.
기능 제공 주체
점검/업데이트 기능은 스토브(SDK)와 게임(CP사)이 역할을 나누어 제공해요.
| 기능 | 제공 주체 | 설정 위치 |
|---|---|---|
| SDK initialize 시 점검 여부 판단 및 팝업 노출 | SDK (스토브) | 파트너스 |
| 플랫폼 화이트리스트 여부 판단 및 접속 차단 | SDK (스토브) | 파트너스 |
| 앱 업데이트 여부 판단 및 팝업 노출 | SDK (스토브) | 파트너스 |
| 게임 리소스(CDN) 업데이트 여부 판단 | 게임 (CP사) | 게임 운영툴 |
| 게임서버 점검 여부 판단 및 화이트리스트 관리 | 게임 (CP사) | 게임 운영툴 |
| 이용자 Kick 및 게임 점검 팝업 노출 | 게임 (CP사) | 게임 운영툴 |
PC는 스토브 PC 클라이언트가 점검·업데이트 안내를 자동 처리해요
스토브 PC 클라이언트로 실행되는 게임은 점검·앱 업데이트 안내를 클라이언트가 자동으로 노출하므로, 위 SDK 팝업 연동은 주로 모바일에 해당해요. 게임서버 기반 점검·Kick·리소스 업데이트는 플랫폼과 무관하게 구현해야 해요.
모바일 플랫폼 점검 시 주의사항
- 모바일 플랫폼의 특성상 점검 시 이용자에게는 다양한 예외 상황이 발생할 수 있어요.
- 점검 설정·이용자 Kick 시 서버와의 통신이 없는 구간에 위치하는 경우 (예: 로비화면, 싱글 플레이 진행 중)
- 점검 시작 전 앱을 백그라운드에 내려놓았던 경우 — 점검 시작 전 앱 백그라운드 → 점검 중 앱 포그라운드 접속 등의 상황이 발생할 수 있어요.
- 물리적으로 네트워크가 끊기는 구간에 위치하는 경우 (예: 비행모드, 지하철)
- 서버 기반의 점검·업데이트 기능이 없거나 처리가 되어 있지 않으면 아래와 같은 문제가 발생할 수 있어요.
- 이용자 Kick이 되지 않은 일부 이용자가 점검 중 게임에 접근/Play 하는 문제 발생
- 앱 실행 시에만 리소스 업데이트를 체크하여 일부 이용자들이 리소스 업데이트를 받지 못하는 상황
- 위와 같은 문제를 방지하기 위해 게임서버에서는 다음 항목을 반드시 구현해야 해요.
- 게임서버 점검 설정 (진입 차단)
- 서버 기반의 이용자 Kick 구현
- 앱 업데이트 버전 / 업데이트 옵션
- 리소스 업데이트 버전 / 업데이트 옵션
연동 가이드
사전 준비
| 항목 | 내용 |
|---|---|
| 파트너스 점검 설정 | 파트너스에서 서비스 점검 및 업데이트 관리 설정 필요. |
| 게임서버 점검 구현 | 게임서버 점검 설정(진입 차단), 이용자 Kick, 앱·리소스 업데이트 버전 관리 구현 필요. |
기본 연동 구조
스토브 SDK 초기화(initialize) 시 점검·업데이트 여부를 확인해 상황에 맞는 안내 팝업을 자동으로 노출해요. 스토브가 제공하는 팝업은 이용자 안내용 단순 팝업이며, 게임 내 점검 안내·이용자 Kick·입력 차단과 서버 레벨 점검은 게임에서 별도로 구현해야 해요.
점검/업데이트 구현 시 주의하세요
SDK는 최초 앱 실행(initialize) 시에만 점검/업데이트 정보를 최소한으로 제공하므로, 이후 흐름은 게임서버에서 제어해야 해요.
점검·업데이트 흐름
이용자가 게임에 진입할 때 스토브 SDK와 게임서버가 순서대로 점검·업데이트를 판단하는 전체 순서예요.
앞 단계(①~⑤)는 스토브 SDK가 플랫폼 차원에서, 뒤 단계(⑥~⑨)는 게임서버가 게임 차원에서 처리해요.
| 순서 | 동작 상세 | 기능제공 주체 |
|---|---|---|
| ① | SDK initialize 시 스토브 백엔드 서비스 호출하여 점검여부 판단. 최초 앱 실행시에만 점검여부를 내려줌. | SDK (스토브) |
| ② | 플랫폼 화이트리스트 여부 판단. (플랫폼 화이트리스트는 파트너스에서 등록) | SDK (스토브) |
| ③ | 플랫폼 화이트리스트 아닐 시 SDK 점검팝업 노출 / 접속 차단. | SDK (스토브) |
| ④ | SDK initialize 시 스토브 백엔드 서비스 호출하여 앱 업데이트 여부 판단. | SDK (스토브) |
| ⑤ | 앱 업데이트 존재 시 SDK 업데이트 팝업 노출. | SDK (스토브) |
| ⑥ | 게임 리소스(CDN 리소스 패치) 업데이트 여부 판단. | 게임 (CP사) |
| ⑦ | 게임서버 점검여부 판단. | 게임 (CP사) |
| ⑧ | 게임서버 화이트리스트 여부 판단. (게임 화이트리스트는 게임 운영툴에서 등록) | 게임 (CP사) |
| ⑨ | 게임서버 화이트리스트 아닐 시 게임 점검팝업 노출 / 접속 차단. | 게임 (CP사) |
전체 흐름에서 점검 또는 업데이트가 실제로 발생했을 때, 각 상황을 어떻게 처리하는지 나눠 정리했어요.
| 순서 | 동작 상세 | 기능제공 주체 |
|---|---|---|
| ① | 파트너스 점검 설정 (SDK 점검 설정). | 파트너스 (스토브) |
| ② | 게임서버 점검 설정 (서버 점검 설정). | 게임 운영툴 (CP사) |
| ③ | 이용자 Kick. | 게임 운영툴 (CP사) |
| ④ | Kick 팝업 노출 → 앱 종료 or 재실행 처리. | 게임 (CP사) |
| ⑤ | Kick 시점에 처리되지 않은 이용자가 게임 접근 시 - 게임서버 다운(작업중) 상태인 경우: 에러 팝업 노출 → 앱 종료 or 재실행 처리. |
게임 (CP사) |
| ⑥ | Kick 시점에 처리되지 않은 이용자가 게임 접근 시 - 게임서버 실행(라이브 검증중) 상태인 경우: 게임서버 점검여부 확인 → 게임 점검팝업 노출 → 앱 종료 or 재실행 처리. |
게임 (CP사) |
앱(클라이언트)·리소스(CDN) 업데이트가 존재하는 경우의 흐름이에요. 업데이트 점검 시 Kick 처리가 되지 않은 이용자가 게임에 접근하거나, 점검 없이 앱·리소스 업데이트만 적용하는 상황에 해당해요.
| 순서 | 동작 상세 | 기능제공 주체 |
|---|---|---|
| ① | 앱 업데이트(버전 업데이트) 설정. | 파트너스 (스토브) |
| ② | 리소스 업데이트(리소스 버전 업데이트) 설정. | 게임 (CP사) |
| ③ | 업데이트를 받지 않은 이용자(클라이언트)와 게임서버 통신 발생. | 게임 (CP사) |
| ④ | 앱 버전 비교 — 최신 버전이 아닌 경우 ⑤단계 진행, 최신 버전인 경우 ⑨단계 진행. | 게임 (CP사) |
| ⑤ | 필수 업데이트 여부 확인 — 필수인 경우 ⑥단계, 선택인 경우 ⑥단계 진행 (단, 강제 업데이트가 아닌 경우 접속 중인 이용자는 Kick 하지 않음). |
게임 (CP사) |
| ⑥ | 필수 업데이트를 적용시키기 위해 이용자 Kick 진행 (전체 이용자 Kick X). | 게임 (CP사) |
| ⑦ | 앱 재실행 → 타이틀 화면에서 SDK 앱 업데이트 팝업 노출 → 앱 업데이트 진행. | 게임 (CP사) |
| ⑧ | 리소스 업데이트 존재 여부 확인 — 존재할 경우 ⑨단계, 존재하지 않을 경우 게임 접속. | 게임 (CP사) |
| ⑨ | 리소스 버전 비교 — 최신 버전이 아닌 경우 ⑩단계, 최신 버전인 경우 게임 접속. | 게임 (CP사) |
| ⑩ | 필수 업데이트 여부 확인 — 필수인 경우 ⑪단계, 선택인 경우 게임 접속 (강제 업데이트가 아닌 경우 접속 중인 이용자는 Kick 하지 않음). |
게임 (CP사) |
| ⑪ | 필수 리소스 업데이트를 적용시키기 위해 이용자 Kick 진행 (전체 이용자 Kick X). | 게임 (CP사) |
| ⑫ | 앱 재실행 → 타이틀 화면에서 리소스 업데이트 팝업 노출 → 리소스 다운로드 진행 → 다운로드 완료 후 게임 접속. | 게임 (CP사) |
개발하기
SDK 연동
SDK 초기화(initialize) 결과로 점검 또는 앱 업데이트 상태가 감지되면, OperationUI.handleResult를 호출해 SDK가 제공하는 안내 UI를 노출하고 이후 게임 흐름을 제어해요.
사전 준비
- AuthUI 모듈 의존성:
OperationUI는 AuthUI 모듈에 포함돼요. 프로젝트(Androidbuild.gradle, iOSPodfile/SPM, Unity/Unreal 패키지)에 AuthUI 의존성이 추가돼 있는지 확인하세요. - 파트너스 설정 완료: 파트너스에서 서비스 점검과 업데이트 관리를 미리 설정하세요. 클라이언트는
initialize응답으로 이 설정을 받아 화면을 분기해요. - 호출 컨텍스트:
handleResult는 화면을 띄우기 위해 살아있는 Activity(Android) /UIViewController(iOS)가 필요해요. 호출 시점에 해당 컨텍스트가 finish/dismiss 되지 않았는지 확인 후 호출하세요. - 게임서버 측 구현: SDK 점검 정보는 최초
initialize시점에만 응답하므로, 게임서버 진입 차단·이용자 Kick·리소스 버전 검증은 별도로 구현하세요. (자세한 내용은 트러블슈팅 참고)
개발 흐름
- 게임 시작 시
Auth.initialize(Android) /[SGSAuth initialize:](iOS) /Auth.Initialize(Unity·Unreal)를 호출하세요. - 콜백으로 받은
Result(errorCode 포함)를 그대로OperationUI.handleResult(activity, result) { ... }에 전달하세요. OperationUI가errorCode를 분기해 적절한 화면을 자동으로 노출해요.Auth.MaintenanceError(30003) → 점검 안내 화면Auth.AppUpdateError(30004) → 앱 업데이트 안내 화면 (필수/선택 옵션에 따라 동작 분기)- 그 외 권한·계정 관련 에러 → 해당 안내 화면 (제재, 휴면, 탈퇴 등)
- 이용자 인터랙션(확인/업데이트 이동/앱 종료)이 끝나면
listener콜백이 호출돼요. 콜백 안에서handled.isSuccessful()여부로 게임 진입(로그인 → 캐릭터 선택 → 로비) 흐름을 이어가세요. Auth.initialize자체가 점검·업데이트가 아닌 사유(네트워크 오류 등)로 실패한 경우 재시도 로직을 별도로 구현하세요.
트러블슈팅
점검·업데이트 정보는 initialize 시점에만 제공돼요
SDK는 최초 앱 실행(initialize) 시에만 점검/업데이트 상태를 응답해요. Heartbeat나 실시간 이용자 Kick은 SDK가 제공하지 않으므로, 게임서버 측에서 진입 차단·Kick 로직을 반드시 별도로 구현하세요. SDK 팝업은 이용자 안내용으로만 활용하고, 강제 종료/재시작 처리는 게임 측에서 책임지세요.
| 에러 코드 / 상황 | 원인 | 조치 |
|---|---|---|
Auth.MaintenanceError (30003) | 파트너스 점검 설정 활성 | OperationUI.handleResult에 Result를 전달해 SDK 점검 화면을 노출하세요. 콜백 안에서는 게임에 진입시키지 말고 앱을 종료하거나 재시작 화면으로 보내세요. |
Auth.AppUpdateError (30004) | 파트너스 업데이트 관리에서 신규 버전 설정 | OperationUI.handleResult 호출 → 필수 업데이트인 경우 이용자 입력을 차단(뒤로가기 비활성, 확인 시 스토어 이동/앱 종료)하세요. 게임서버에서도 클라이언트 버전 검증으로 구버전 접속을 거부하세요. |
OperationUI.handleResult 호출했는데 화면이 안 뜸 | 호출 시점에 Activity가 finish됐거나 Fragment가 detach된 상태 | 호출 직전에 Android는 !isFinishing && !isDestroyed, iOS는 viewController가 presentedViewController로 살아있는지 확인 후 호출하세요. Fragment 버전을 쓴다면 fragment.isAdded == true 시점에서만 호출하세요. |
| 백그라운드 → 포그라운드 복귀 시 점검 팝업 누락 | SDK 점검 정보는 initialize 시점에만 응답됨. 포그라운드 복귀는 initialize를 다시 타지 않음 | 포그라운드 복귀 시점에 게임서버 응답으로 점검 여부를 확인하고 자체 점검 안내 화면을 띄우세요. SDK에 의존하지 말고 게임 측 라이프사이클 훅(onResume, applicationDidBecomeActive)에서 처리하세요. |
| 일부 이용자가 점검 중에도 게임 접속됨 | 클라이언트 점검만 적용된 상태(서버 진입 차단 미구현) | 게임서버에 점검 모드 플래그를 두고, 모든 게임서버 API 응답에서 점검 여부를 검증해 차단하세요. 클라이언트 정보는 위변조 가능하므로 신뢰하지 말고, 점검 판단의 최종 권한은 서버에 두세요. |
| 필수 업데이트인데 이용자가 무시하고 게임 진입 | 클라이언트 단의 강제 업데이트 화면 입력 차단 누락, 또는 게임서버가 구버전 클라이언트를 차단하지 않음 | OperationUI 콜백에서 이용자가 업데이트를 거부하면 finish()/exit(0)로 앱을 종료시키세요. 동시에 게임서버에서 클라이언트 버전 헤더를 검증해 구버전 접속을 거부하세요. |
| 리소스(CDN) 업데이트가 일부 이용자에게 적용 안 됨 | 앱 실행 시점에만 리소스 체크가 일어나도록 구현됨 | 게임 진입 단계마다(타이틀 → 로비 진입 등) 리소스 버전을 게임서버에 다시 질의하고, 신규 리소스가 있으면 강제 다운로드 화면으로 분기하세요. |
| 화이트리스트로 등록된 운영진 계정도 점검 화면에 막힘 | 플랫폼/게임 화이트리스트 미등록 또는 잘못된 시스템에 등록 | 플랫폼 화이트리스트는 파트너스에서, 게임 화이트리스트는 게임 운영툴에서 각각 별도 등록하세요. 두 시스템은 독립적으로 동작하므로 운영진 계정은 양쪽 모두 등록하는 것을 권장해요. |
샘플 코드
using Stove.Auth;
using Stove.AuthUI;
Auth.Initialize(initRequest, (Result result) => {
OperationUI.HandleResult(activity, result, (Result handled) => {
if (handled.IsSuccessful()) {
// 게임 진입 흐름 진행 (로그인 → 캐릭터 선택 → 로비)
} else {
// 사용자가 종료/취소 선택 → 앱 종료 처리
}
});
});