- 마지막 업데이트
푸시
이해하기
푸시 알림은 게임을 켜지 않은 이용자의 단말기 화면으로 새 소식을 전하는 메시지예요. 스토브는 iOS, Android, Fire OS에서 푸시 발송 기능을 제공해요.
발송 방법은 두 가지예요. 스토브 파트너스(웹 콘솔)에서 직접 보내거나 예약하는 방법, 게임 서버에서 API로 보내는 방법이에요.
대상은 마켓·월드·국가 전체로 보내거나, 회원ID로 묶은 그룹에 골라 보낼 수 있어요.
제공 범위
푸시 서비스는 아래 3가지 메시징 서비스를 지원해요.
| 서비스 | 대상 단말 | 설명 |
|---|---|---|
| FCM | Android | Firebase Cloud Messaging |
| APNS | iOS | Apple Push Notification Service |
| ADM | Fire OS(Amazon) | Amazon Device Messaging |
푸시 발송 방식
서버에서 직접 푸시를 발송하는 경우 아래 두 가지 방식을 지원해요.
| 발송 방식 | 설명 |
|---|---|
| 개별 발송 | 특정 회원에게 개별 푸시 발송 |
| 그룹 발송 | 특정 게임이나 마켓에 단체 푸시 발송 |
Member_no와 guid 사용 기준
ㆍ 스토브 플랫폼은 이용자를 Member_no(숫자형)로 식별해요.
ㆍ 일부 게임은 guid를 식별자로 사용하며, 이 경우 Member_no 필드에 guid 값이 전달돼요.
푸시 설정 구조
푸시 서비스는 아래 3단계로 구성돼요.
| 단계 | 구분 | 내용 |
|---|---|---|
| 1단계 | 파트너스 및 콘솔 설정 | 마켓별(Google/Apple) 푸시 인증 키 발급 및 파트너스 등록 |
| 2단계 | SDK 연동 | 플랫폼별(Android/iOS/Unity/Unreal) 푸시 수신 설정 및 SDK 적용 |
| 3단계 | 서버 연동 (선택) | 게임 서버에서 직접 푸시 발송이 필요한 경우 REST API 연동 |
글로벌 푸시 정책
한국 외 글로벌은 가입 시 광고성·야간 푸시 수신 동의 절차가 없어, 별도 동의 없이 푸시를 발송할 수 있어요.
글로벌 이용자에게 야간 푸시 ON/OFF 기능 제공 금지
ㆍ 글로벌 이용자는 야간 푸시 ON/OFF를 지원하지 않아요.
ㆍ 게임 설정 내 야간 푸시 ON/OFF 토글을 노출하지 않도록 해 주세요.
연동 가이드
연동 준비
| 구분 | 항목 | 설명 |
|---|---|---|
| 마켓 | 마켓별 푸시 세팅 | 각 마켓 공식 가이드 기준 푸시 환경 설정 및 인증서 발급 |
| 클라이언트 | 스토브 SDK 적용 | 푸시 수신을 위한 OS별 SDK 적용 |
| 파트너스 | 발송용 Push Key 등록 | 스토브 파트너스에 마켓별 Push Key 등록 |
| API AccessToken | API AccessToken 발급 | 스토브 API 서버 통신용 토큰 담당 퍼블리싱 기술 담당자를 통해 발급 |
기본 연동 구조
푸시 연동은 ① 마켓 인증 키 준비 → ② 파트너스 등록 → ③ SDK 연동 순서로 진행돼요.
- 마켓별 인증 키
마켓별로 발급받아야 할 인증 항목이 달라요.
마켓 필요 인증 항목 비고 Android (FCM) service account key (.json 비공개 키) Firebase Admin SDK 기반 FCM HTTP v1 사용. iOS (APNS) Private Key(.p8), Key ID, Team ID, Topic(번들 ID) iOS 13부터 토큰 인증(TOKEN) 방식만 지원. Fire OS (ADM) Amazon Device Messaging 인증 정보 Amazon Appstore로 출시하는 Fire OS 단말 대상.
FCM 발송 방식 안내
Android(FCM) 푸시 발송은 FCM HTTP v1 방식을 사용해요.
- 푸시 등록 정책
- 푸시 등록은 로그인·가입·토큰 갱신·계정 연결 완료 시 SDK 내부에서 자동으로 처리돼요. 별도 API 호출 불필요.
- 게임에서 여러 월드를 지원한다면, 마지막 접속 월드로만 푸시가 전송돼요.
- 글로벌 이용자 푸시 수신 기본값 글로벌 신규 이용자는 동의 절차 없이 가입되어, 주간·야간 푸시 수신 기본값이 모두 ON이에요.
이것만 기억하세요
ㆍ 가입 직후에는 수신값이 미설정 상태이므로, 게임 로비 등 적절한 시점에 푸시 설정 조회 API를 호출해 ON으로 맞춰 주세요.
ㆍ 글로벌 이용자는 야간 푸시를 끌 수 없으므로, 게임 설정에 야간 푸시 ON/OFF 토글을 노출하지 마세요.
ㆍ 국가 정보는 가입 국가 값 또는 GDS 접속 국가 값으로 확인할 수 있어요.
개발하기
SDK 연동
플랫폼별 초기 설정
푸시 기능을 사용하려면 각 플랫폼별로 빌드·코드 설정을 먼저 마쳐야 해요.
- Android 설정
Android(Google FCM) 푸시를 사용하기 위한 순차 설정 단계예요.
- 1. google-services.json
- Firebase Console에서 프로젝트를 선택해요.
- 앱 설정에서
google-services.json을 다운로드해요.
- 앱 설정에서
- 앱 상단 디렉토리에 복사해요.
- 2. build.gradlegroovy
repositories { google() jcenter() maven { // SDK 2.6.1부터 저장소 위치가 변경됐어요. url "https://externalnexus.iam0.com/repository/mvp" // Android Gradle Plugin 7.0 이상 사용 시 아래 옵션 추가 allowInsecureProtocol = true } mavenCentral() } dependencies { implementation 'com.stove:push-firebase:2.5.1' } apply plugin: 'com.google.gms.google-services'Push 2.4.0부터는 구글 푸시(FCM)를 사용하려면
push대신push-firebase를 적용해야 해요.
- 3. AndroidManifest.xml (채널·아이콘 설정)
아래 4개 값은 선택 사항이지만,
Small Icon과Large Icon은 설정을 권장해요. Channel Name: 설정하지 않으면 'Stove'로 설정돼요.Channel Description: 설정하지 않으면 null로 설정돼요.Small Icon: 설정하지 않으면application.icon으로 설정돼요.Large Icon: 설정하지 않으면 null로 설정돼요.xml<?xml version="1.0" encoding="utf-8"?> <manifest> <application> <meta-data android:name="com.stove.push.small_icon" android:resource="@drawable/{setYourSmallIcon}" /> <meta-data android:name="com.stove.push.large_icon" android:resource="@drawable/{setYourLargeIcon}" /> <meta-data android:name="com.stove.push.channel_name" android:value="@string/{setYourChannelName}" /> <meta-data android:name="com.stove.push.channel_description" android:value="@string/{setYourChannelDescription}" /> </application> </manifest>- 4. 앱 실행 중에 푸시 보이게 하기
foreground_notification_enabled를 설정하지 않으면 게임 실행 중에는 푸시 메시지가 보이지 않아요.xml<manifest> <application> <meta-data android:name="com.stove.push.foreground_notification_enabled" android:value="true" /> </application> </manifest>
- 5. 푸시 권한 요청 수동 제어 (
Firebase 2.5.2 / Amazon 2.5.1 / Huawei 2.5.1이상) 아래 설정을 추가하면 SDK의 자동 권한 요청을 생략하고, 앱에서 원하는 시점에 별도 처리할 수 있어요.xml<manifest> <application> <meta-data android:name="com.stove.push.request_permission_disabled" android:value="true" /> </application> </manifest>
- 1. google-services.json
- Android — 앱 실행 중 푸시 메시지 수신하기
앱 실행 중에 푸시 메시지를 수신하면 앱에 맞는 UI를 보여줄 수 있어요. 수신 데이터는 다음 키로 전달돼요.
T: TitleM: MessageI: ImageUrlL: LinkUrlE: Extra
private void SetMessageDelegate()
{
Push.SetMessageDelegate((Dictionary<string, string> dictionary) =>
{
});
}
- Android — 푸시 메시지 클릭 처리
Push 2.3.1부터는 앱에서 수신한 푸시 메시지의 클릭 처리를 위해Activity의onCreate와onNewIntent에서Push.handleIntent를 호출해야 해요.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
Push.handleIntent(applicationContext, intent)
// ...
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// ...
Push.handleIntent(applicationContext, intent)
// ...
}
- iOS 설정
- 1. Xcode Capabilities 추가하기
- Build Settings → Capabilities 화면에서 추가 버튼 클릭
- Push Notifications 검색 후 추가
- Push Notifications가 활성 상태인지 확인
- 2. 확장 푸시 알림 확장 푸시 알림 설정은 확장 푸시 알림 가이드를 참고하세요.
- 3. 등록 토큰 전달하기
AppDelegate에서 디바이스 토큰을 SDK에 전달해요.
objectivec- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[SGSPushNotificationCenter currentPushNotificationCenter] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; }- 4. 앱 실행 중 푸시 보이게 하기 —
SGSPushNotificationCenterDelegate등록
objectivec- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[SGSPushNotificationCenter currentPushNotificationCenter] setDelegate:self]; }
포그라운드 푸시 알림 표시 옵션이에요. 필요한 옵션을 조합해completionHandler에 전달하세요.옵션 설명 지원 버전 UNNotificationPresentationOptionBanner화면 상단 배너로 알림 표시 (일정 시간 후 자동 해제) iOS 14+ UNNotificationPresentationOptionList알림센터에 쌓아 나중에 확인 가능 iOS 14+ UNNotificationPresentationOptionSound알림 수신 시 사운드 재생 iOS 10+ UNNotificationPresentationOptionAlertBanner+List통합 (iOS 14+ deprecated, 미만 대응 시만 사용)iOS 10+ - 사용 예시 — 배너 + 사운드
objectivec- (void)willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { if (@available(iOS 14.0, *)) { completionHandler(UNNotificationPresentationOptionBanner | UNNotificationPresentationOptionSound); } else { completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound); } }- 사용 예시 — 배너 + 사운드 + 알림센터
objectivec- (void)willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { if (@available(iOS 14.0, *)) { completionHandler(UNNotificationPresentationOptionBanner | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionList); } else { completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionSound); } } - 1. Xcode Capabilities 추가하기
- Unity 설정
- Android 설정 — google-services.json → google_services.xml 변환
- generate_xml_from_google_services_json.py 다운로드
- 터미널에서 아래 명령어 실행
generate_xml_from_google_services_json.py -i {google-services.json 경로} -o {출력 파일 경로} -p {yourPackageName}
예시:
/Users/user/Desktop/generate_xml_from_google_services_json.py -i /Users/user/Desktop/google-services.json -o /Users/user/Desktop/google_services.xml -p com.stove.mvp
- 변환된 파일을
Plugins/Android/res/values폴더에 복사
iOS 설정 — 앱 실행 중 푸시 옵션 (info.plist)
SDK Plugin 내부에서 포그라운드 푸시 설정을 처리해요. 게임에서는 info.plist에 아래 키를 추가해 동작을 변경할 수 있어요.
| Key | Type | 기본값 | 설명 |
|---|---|---|---|
ForegroundPushEnabled | Boolean | YES | 포그라운드 푸시 사용 여부. NO로 설정 시 앱 실행 중 푸시가 표시되지 않음 |
EnablePushListOptions | Boolean | YES | 알림센터에 푸시를 쌓을지 여부. NO로 설정 시 배너 사라진 후 알림센터에서 확인 불가 |
두 키 모두
info.plist에 키가 없으면 기본값YES로 동작해요. 기본 설정을 그대로 쓸 거면 별도 추가가 필요 없어요.
설정 예시:
- 포그라운드 푸시 비활성화:
<key>ForegroundPushEnabled</key><false/> - 알림센터 비활성화:
<key>EnablePushListOptions</key><false/>
Unreal 설정
Android 설정 — google-services.json → google_services.xml 변환
- generate_xml_from_google_services_json.py 다운로드
- 터미널에서 아래 명령어 실행
generate_xml_from_google_services_json.py -i {google-services.json 경로} -o {출력 파일 경로} -p {yourPackageName}
- 변환된 파일을
Source/StoveSDK폴더에 복사
iOS Capabilities 설정
커스텀 엔진 빌드에서만 동작해요.
메뉴 → 편집 → 프로젝트 세팅 → iOS → Enable Remote Notifications Support 기능을 활성화하면 빌드 시 자동으로 Capabilities가 설정돼요.
iOS — 앱 실행 중 푸시 옵션 (info.plist)
Unity와 동일한 ForegroundPushEnabled / EnablePushListOptions 키를 info.plist에 추가해 동작을 변경할 수 있어요.
설정 방법: Unreal Editor → 편집 → 플러그인 → iOS → Extra PList Data → Additional Info plist 하단에 key-value 추가.
설정 예시:
- 포그라운드 푸시 비활성화:
<key>ForegroundPushEnabled</key><false/> - 알림센터 비활성화:
<key>EnablePushListOptions</key><false/>
푸시 등록
푸시 등록은 로그인·가입·토큰 갱신·계정 연결 완료 시 자동으로 돼요. 별도 API 호출은 필요 없어요.
- 게임에서 여러 월드를 지원한다면 마지막 접속 월드로만 푸시가 전송돼요.
ErrorCodes
| Domain | ErrorCode | Description | 조치 |
|---|---|---|---|
| com.stove.success | 0 | Success | — |
| com.stove.server | 1000 | WRONG_API_USAGE | 푸시 등록은 SDK 내부에서 자동으로 처리하는 영역이라 직접 호출이 필요 없어요. 별도로 호출하는 코드가 있다면 제거하고, 자동 등록 시점(login/register/토큰 갱신/계정 연결 완료 콜백)을 다시 점검하세요. |
| com.stove.server | 2000 | SERVICE_ERROR | 일시적 서버 오류이므로 일정 시간 후 재시도하세요. 반복 발생 시 OperationUI.HandleResult(result, ...)에 위임하고, 지속되면 스토브 운영팀에 로그와 함께 문의하세요. |
| com.stove.base.network | 10001 | NoConnectionError | 디바이스 네트워크 연결 상태를 확인하고 연결 후 재시도하도록 이용자에게 안내하세요. |
| com.stove.base.network | 10002 | TimeoutError | 네트워크 상태 안정화 후 재시도하세요. 반복되면 OperationUI.HandleResult(result, ...)에 위임해 SDK가 안내 화면을 띄우게 하세요. |
푸시 설정 조회
현재 이용자의 푸시 설정(주간/야간 알림)을 조회해요.
private void FetchPushSettings()
{
Push.FetchPushSettings((Result result, PushSettings pushSettings) =>
{
if (result.IsSuccessful)
{
bool EnabledDay = (bool)pushSettings.EnabledDay;
bool EnabledNight = (bool)pushSettings.EnabledNight;
}
});
}
ErrorCodes
| Domain | ErrorCode | Description | 조치 |
|---|---|---|---|
| com.stove.success | 0 | Success | — |
| com.stove.server | 11236 | Error : Access token is wrong. | Auth.accessToken을 다시 조회해 최신 토큰으로 재호출하세요. 동일 오류가 지속되면 로그인 흐름으로 유도해 토큰을 재발급받게 하세요. |
| com.stove.server | 12002 | Error : Data access exception. | 일시적 데이터 조회 오류이므로 잠시 후 재시도하세요. 반복 발생 시 OperationUI.HandleResult(result, ...)에 위임하고, 지속되면 스토브 운영팀에 로그와 함께 문의하세요. |
| com.stove.base.network | 10001 | NoConnectionError | 디바이스 네트워크 연결 상태를 확인하고 연결 후 재시도하도록 이용자에게 안내하세요. |
| com.stove.base.network | 10002 | TimeoutError | 네트워크 상태 안정화 후 재시도하세요. 반복되면 OperationUI.HandleResult(result, ...)에 위임해 SDK가 안내 화면을 띄우게 하세요. |
푸시 수신 설정
푸시 수신 On/Off, 야간 푸시 On/Off는 모두 **하나의 API Push.updatePushSettings(context, settings, listener)**를 호출하고 PushSettings의 enabledDay / enabledNight 값만 다르게 전달해요. 응답 콜백은 모든 케이스가 동일한 Result와 PushSettings를 반환하므로, 에러 처리는 아래 한 번의 ErrorCodes 표를 공유해요.
| 케이스 | enabledDay | enabledNight |
|---|---|---|
| 푸시 알림 On | true | null (변경 없음) |
| 푸시 알림 Off | false | false (야간도 함께 Off 필수) |
| 야간 푸시 On | null (변경 없음) | true |
| 야간 푸시 Off | null (변경 없음) | false |
푸시 알림 Off 시 야간 푸시도 함께 Off
주간 푸시를 Off하면 야간 푸시 단독 활성화 상태가 유지되지 않도록 enabledNight도 false로 함께 전달하세요.
푸시 알림 On
PushSettings(enabledDay = true, enabledNight = null)를 전달해 주간 푸시 알림을 활성화해요.
public void UpdatePushSettings()
{
PushSettings settings = new PushSettings(true, null);
Push.UpdatePushSettings(settings, (Result result, PushSettings pushSettings) =>
{
if(result.IsSuccessful)
{
bool EnabledDay = (bool)pushSettings.EnabledDay;
bool EnabledNight = (bool)pushSettings.EnabledNight;
}
});
}
푸시 알림 Off
푸시 알림을 Off하면 야간 푸시도 함께 Off 처리해야 해요.
public void UpdatePushSettings()
{
PushSettings settings = new PushSettings(false, false);
Push.UpdatePushSettings(settings, (Result result, PushSettings pushSettings) =>
{
if(result.IsSuccessful)
{
bool EnabledDay = (bool)pushSettings.EnabledDay;
bool EnabledNight = (bool)pushSettings.EnabledNight;
}
});
}
야간 푸시 On
푸시 알림이 Off 상태이면 야간 푸시를 On할 수 없어요. 먼저 푸시 알림을 On한 뒤 호출하세요.
글로벌 이용자 주의사항
글로벌 이용자의 경우 야간 푸시 ON/OFF 기능을 지원하지 않아요. 인게임 푸시 설정 화면에 야간 푸시 토글을 노출하지 않도록 처리하세요.
public void UpdatePushSettings()
{
PushSettings settings = new PushSettings(null, true);
Push.UpdatePushSettings(settings, (Result result, PushSettings pushSettings) =>
{
if(result.IsSuccessful)
{
bool EnabledDay = (bool)pushSettings.EnabledDay;
bool EnabledNight = (bool)pushSettings.EnabledNight;
}
});
}
야간 푸시 Off
주간 푸시 설정은 유지한 채 야간 푸시만 Off해요.
public void UpdatePushSettings()
{
PushSettings settings = new PushSettings(null, false);
Push.UpdatePushSettings(settings, (Result result, PushSettings pushSettings) =>
{
if(result.IsSuccessful)
{
bool EnabledDay = (bool)pushSettings.EnabledDay;
bool EnabledNight = (bool)pushSettings.EnabledNight;
}
});
}
ErrorCodes
| Domain | ErrorCode | Description | 조치 |
|---|---|---|---|
| com.stove.success | 0 | Success | — |
| com.stove.server | 11236 | Error : Access token is wrong. | Auth.accessToken을 다시 조회해 최신 토큰으로 재호출하세요. 동일 오류가 지속되면 로그인 흐름으로 유도해 토큰을 재발급받게 하세요. |
| com.stove.server | 12002 | Error : Data access exception. | 일시적 데이터 조회 오류이므로 잠시 후 재시도하세요. 반복 발생 시 OperationUI.HandleResult(result, ...)에 위임하고, 지속되면 스토브 운영팀에 로그와 함께 문의하세요. |
| com.stove.base.network | 10001 | NoConnectionError | 디바이스 네트워크 연결 상태를 확인하고 연결 후 재시도하도록 이용자에게 안내하세요. |
| com.stove.base.network | 10002 | TimeoutError | 네트워크 상태 안정화 후 재시도하세요. 반복되면 OperationUI.HandleResult(result, ...)에 위임해 SDK가 안내 화면을 띄우게 하세요. |
확장 푸시 알림 (iOS)
제목·부제목·내용·이미지를 포함한 iOS 확장 푸시(Notification Service Extension) 설정 방법을 안내해요.
안내
- iOS 10 이상에서 사용할 수 있어요. iOS 10 미만에서는 일반 Push 알림으로 표시돼요.
- 확장 푸시 알림 관련 정보는 Apple 개발자 문서에서 확인할 수 있어요.
- PushExtension을 사용하기 전에 CocoaPods 설정이 필요해요. CocoaPods 설정하기를 참고하세요.
Xcode Project 설정
- 1. Notification Service Extension Target 추가
- Xcode Project에서 + 버튼을 선택한 뒤, Target 추가 화면에서 Notification Service Extension을 선택하고 Next를 눌러요.

- 2. Product Name 및 Embed 설정
- Product Name을
NotificationServiceExtension으로 지정하고, Embed in Application 항목을 현재 게임 Project Target으로 지정한 뒤 Finish를 선택해요.

- Product Name을
- 3. 스키마 추가
- 스키마 추가 여부를 묻는 팝업이 표시되면 Activate를 선택해요.

- 4. 생성 파일 확인
- Project 내부에
NotificationServiceExtension그룹과NotificationService.h,Notification.m,Info.plist파일이 생성됐는지, Project Target에NotificationServiceExtension이 추가됐는지 확인해요.

- Project 내부에
- 5. Deployment Target 변경
- Project Target에서
NotificationServiceExtension을 선택하고, General → Deployment Info의 Target 버전을 iOS 10.0으로 변경해요. (최소 지원 버전 맞추기)

- Project Target에서
- 6. Architectures 확인
- Project Target에서
NotificationServiceExtension을 선택하고, Build Settings의 Architectures 항목이 Standard architectures로 설정됐는지 확인해요.

- Project Target에서
- 7. Capability 설정
- 확장 푸시 지표 확인을 위해 Capability 설정이 필요해요.

- 8. App Groups Capability 추가
- Build Settings → Capabilities 화면에서 추가 버튼을 클릭해요.

- App Groups를 검색해요.

- App Groups가 추가됐는지 확인해요. App Groups는
group.+ Bundle Identifier 형식으로 설정해요. (예:group.com.stove.sdk)

- 9. NotificationService.m 코드 작성
- Project 내부
NotificationServiceExtension그룹(4번 참조)의NotificationService.m파일을 열어 아래와 같이 작성해요.
- Project 내부
#import "NotificationService.h"
#import <SGSPushExtension/SGSPushExtension.h>
@interface NotificationService ()
@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
@end
@implementation NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
[NotificationServiceExtension didReceive:request withContentHandler:contentHandler];
}
- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}
@end
Release용 Provisioning Profile 생성
- 1. Apple Developer Console 접속
- Certificates, Identifiers & Profiles 항목에 들어가요.

- 2. Identifier 등록 시작
- 왼쪽 메뉴에서 Identifiers를 선택한 뒤, Identifiers + 를 선택해요.

- 3. App IDs 선택
- App IDs를 선택하고 Continue를 눌러요.

- 4. Bundle ID 입력
- Description을 입력하고, Bundle ID에 게임 Bundle ID +
.NotificationServiceExtension을 붙여 넣은 뒤 Continue를 선택해요. - Bundle ID 예시:
com.stove.xxx.NotificationServiceExtension

- Description을 입력하고, Bundle ID에 게임 Bundle ID +
- 5. 등록 완료
- Register를 선택해 등록을 마무리해요.

- 6. Identifier 등록 확인
- Identifiers 화면으로 돌아가 방금 만든 ID가 등록됐는지 확인해요.

- 7. Profile 생성 시작
- 왼쪽 메뉴에서 Profiles를 선택한 뒤, Profiles + 를 선택해요.

- 8. Distribution 유형 선택
- Distribution 항목에서 Ad Hoc, App Store 등 배포 방식에 맞게 선택한 뒤 Continue를 눌러요. (아래 가이드는 Ad Hoc 기준이에요.)

- 9. App ID 선택
- App ID 항목에서 위에서 만든 ID 값을 선택한 뒤 Continue를 눌러요.

- 10. 인증서 선택
- Provisioning Profile에 맞는 인증서를 선택한 뒤 Continue를 눌러요.

- 11. Profile 이름 입력 및 생성
- Provisioning Profile Name을 입력하고 Generate를 선택해요.

- 12. Profile 다운로드
- Profiles 페이지에서 생성한 Provisioning Profile을 확인한 뒤 Download를 선택해 로컬에 저장해요.

- 13. Xcode에 Profile 추가
- 저장된 Provisioning Profile을 더블 클릭해 Xcode에 추가해요.

- 14. Signing 설정 확인
- Xcode Project에서
NotificationServiceExtensionTarget을 선택한 뒤, Signing & Capabilities → Signing (Release) 에 Provisioning Profile이 정상 설정됐는지 확인해요.

- Xcode Project에서
App Groups 생성
- 1. App Group Identifier 등록
- Apple Developer — App Groups에 접속해요.

- 2. Group ID 생성
group.+ 게임 Bundle Identifier 형식으로 생성해요.

- 3. App ID 선택
- 게임 App ID를 선택해요.

- 4. App Groups 연결
- App Groups Edit 버튼을 선택해 생성된 App Groups를 연결해요.

이미지 푸시 전송
파트너스 센터에서 이미지 포함 푸시를 발송할 수 있어요.
- 경로: GM → PUSH알림 → PUSH알림(mo)
- 파트너스: partners.gate8.com
