이 문서는 Legacy Kakao SDK for iOS(이하 Legacy iOS SDK)를 사용한 푸시 알림 기능 구현 방법을 안내합니다.
푸시 토큰 등록, 보기, 삭제는 Android와 iOS SDK도 지원하지만, 푸시 알림을 보내는 기능은 REST API로만 지원합니다. 또한 Apple Push Notification service(APNs), Firebase Cloud Messaging(FCM) 인증 정보를 내 애플리케이션(이하 앱) 정보에 미리 등록해두어야 합니다. 인증 정보 발급 및 등록 방법은 설정하기를 참고합니다.
최신 버전의 Kakao SDK for Android/iOS는 푸시 알림 기능을 지원하지 않습니다. 푸시 알림 기능을 구현하려면 REST API, Legacy Android, Legacy iOS SDK를 사용해야 합니다.
푸시 알림을 보내거나 받으려면 iOS 애플리케이션(이하 앱)의 코드에 APNs 등록 및 푸시 토큰 발급 기능을 구현해야 합니다. 디바이스(Device)에 발급된 기기별 푸시 토큰은 언제든지 바뀔 수 있기 때문에, 앱 실행 시 항상 UIApplication
의 registerForRemoteNotificationTypes
메소드를 통해 푸시 토큰 재등록을 해야 합니다.
푸시 토큰이 성공적으로 등록되면 Application Delegate의 didRegisterForRemoteNotificationsWithDeviceToken
메소드를 통해 기기별 푸시 토큰을 전달 받을 수 있습니다. 전달 받은 푸시 토큰은 iOS SDK의 푸시 토큰 등록 기능 또는 REST API 푸시 토큰 등록을 통해 카카오 푸시 서비스에 등록해야 합니다.
아래 예제는 APNs 등록 및 푸시 토큰 발급 과정을 보여줍니다. 단계별로 사용해야 할 메소드와 처리 방법을 참고합니다.
//============================================
// Application Delegate에서 작성
//============================================
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setupAPNS:application];
...
...
// Override point for customization after application launch.
return YES;
}
// Push 토큰 등록 성공
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"================ device token:%@", deviceToken);
//다른 VC에서 참조위해 프로퍼티로 저장한다.
self.deviceToken = deviceToken;
}
// Push 토큰 등록 실패
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"error in registration. Error: %@", error);
}
// 앱 실행 중 Push 수신 시 처리할 부분
- (void) application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*) userInfo {
NSLog(@"Received Push Notification: %@", [userInfo description]);
// 후 처리 구현
}
- (void)setupAPNS:(UIApplication *)application {
if (@available(iOS 10.0, *)) {
if ([UNUserNotificationCenter class] != nil) {
// iOS 10 or later
// For iOS 10 display notification (sent via APNS)
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert|UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:authOptions
completionHandler:^(BOOL granted, NSError * _Nullable error) {
}];
}
}
else {
// iOS 10 notifications aren't available; fall back to iOS 8-9 notifications.
UIUserNotificationType allNotificationTypes =
(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge);
UIUserNotificationSettings *settings =
[UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil];
[application registerUserNotificationSettings:settings];
}
[application registerForRemoteNotifications];
}
APNs 등록 및 푸시 알림 관련 상세 설명은 Apple 푸시 알림 공식 가이드를 참고합니다.
앱이 실행 및 사용 중이지 않고 백그라운드(Background)에 있을 때, iOS 시스템은 알림, 뱃지(Badge), 소리(Sound) 등으로 푸시 알림합니다.
푸시 알림을 사용자가 탭(Tap)하면, iOS 시스템이 해당 앱을 실행하고 Application Delegate의 didFinishLaunchingWithOptions
메소드를 실행합니다. 앱이 실행 및 사용 중이라면 didReceiveRemoteNotification
메소드를 호출합니다.
푸시 알림을 받았을 때 필요한 처리가 올바르게 이뤄지도록 iOS 시스템이 실행하는 메소드의 상세 내용을 구현해야 합니다. 다음 예제는 앱이 실행 중인 경우 호출하는 didReceiveRemoteNotification
메소드에서 푸시 알림 수신 시 동작을 구현하는 부분을 보여줍니다.
//============================================
// Application Delegate에서 작성
//============================================
// 앱 실행 중 Push 수신 시 처리할 부분
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self setupAPNS:application];
self.viewController = [[ViewController alloc] init];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
navController.navigationBarHidden = YES;
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
// Override point for customization after application launch.
return YES;
}
보다 상세한 코드 및 설명은 Apple 푸시 알림 공식 가이드의 "Handling Remote Notifications"를 참고합니다.
푸시 알림을 받을 사용자의 푸시 토큰(디바이스 토큰)을 카카오 푸시 서비스에 등록하는 API입니다. 이 기능은 현재 사용자가 로그인한 기기에서 발급 받은 푸시 토큰을 등록하는 기능으로, 푸시 토큰 등록을 요청하기 전에 사용자가 카카오 로그인을 완료한 상태여야 합니다.
만약 사용자가 로그인하지 않은 상태에서 푸시 토큰이 발급됐다면, 카카오 로그인 후 해당 푸시 토큰을 등록할 수 있도록 값을 보관해두어야 합니다.
다음 예제를 참고합니다.
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSData* deviceToken = appDelegate.deviceToken;
[KOSessionTask pushRegisterDeviceWithToken:deviceToken completionHandler: ^(BOOL success, NSInteger expiredAt, NSError* error) {
if (error) {
NSLog(@"failed request - error: %@", error);
}
else {
NSLog(@"succeeded reginster push token request - token: %@", deviceToken);
}
}];
iOS SDK가 제공하는 푸시 토큰 등록 기능은 REST API와 다른 점이 있습니다.
응답으로 받는 expiredAt
값은 푸시 토큰의 남은 유효기간을 일 단위로 알려줍니다. 값이 -1인 경우에는 유효기간이 무제한이라는 의미입니다. 푸시 토큰의 유효기간 갱신을 위해 앱 실행 및 로그인 시 푸시 토큰 갱신 및 재등록을 하는 방식을 권장합니다.
Name | Type | Description |
---|---|---|
expiredAt | NSInteger |
푸시 토큰의 남은 유효기간, 일 단위 |
카카오 푸시 서비스에 등록된 사용자의 푸시 토큰의 정보를 확인하는 API입니다. 사용자가 현재 로그인한 기기 외에 다른 기기에서 등록한 푸시 토큰의 정보도 확인할 수 있습니다. 사용자가 카카오 로그인을 완료한 상태여야 하며, 요청 결과에 따른 처리를 구현해야 합니다. 다음 예제를 참고합니다.
[KOSessionTask pushGetTokensTaskWithCompletionHandler:^(NSArray *tokens, NSError *error) {
if (error) {
NSLog(@"failed request - error: %@", error);
}
else {
NSLog(@"succeeded get all push token request.");
for (KOPushTokenInfo* tokenInfo in tokens) {
NSLog(@"devideId=%@, token=%@", tokenInfo.deviceId, tokenInfo.pushToken);
}
}
}];
푸시 토큰 보기 요청에 성공하면, 카카오 플랫폼에 현재 로그인한 사용자 앞으로 등록된 푸시 토큰들의 정보를 받습니다. 응답은 KOPushTokenInfo
객체를 포함한 NSArray
입니다.
Name | Type | Description |
---|---|---|
userId | NString |
등록된 푸시 토큰의 회원번호, 1~((2^63)-1) 범위의 정수만 사용 가능 Deprecate, uuid 를 사용하도록 변경 |
uuid | NString |
등록된 푸시 토큰의 회원번호, 1~((2^63)-1) 범위의 정수만 사용 가능 |
pushToken | NString |
등록된 푸시 토큰 |
pushType | NString |
푸시 토큰의 종류, apns 또는 fcm |
createdAt | NString |
푸시 토큰 생성 시간 |
updatedAt | NString |
푸시 토큰 갱신 시간 |
* userId: Deprecated, 사용자 고유 ID(String), uuid를 사용하도록 변경
카카오 푸시 서비스에 등록한 푸시 토큰을 삭제하는 API입니다. 카카오 푸시 서비스에서 현재 기기의 푸시 토큰만 지우거나, 현재 로그인한 사용자의 모든 푸시 토큰을 지울 수 있습니다. 이 기능은 카카오 푸시 서비스에 등록된 푸시 토큰만 삭제하고 기기의 푸시 토큰을 삭제하지 않습니다.
iOS SDK의 푸시 알림은 현재 로그인한 사용자 정보 기반으로 동작하므로, 사용자가 카카오 로그인을 완료한 후 푸시 토큰 삭제 기능을 이용할 수 있습니다.
현재 로그인한 사용자 및 기기의 푸시 토큰을 삭제하려면 pushDeregisterDeviceWithToken
으로 기기별 푸시 토큰 정보를 전달해 요청합니다. 이 방법은 특정 기기에서만 푸시를 받지 않도록 설정하거나, 사용자가 로그아웃할 때 사용합니다.
현재 로그인한 사용자의 모든 기기 푸시 토큰을 삭제하려면 pushDeregisterAllDeviceWithCompletionHandler
로 요청합니다. 이 기능은 사용자가 모든 기기에서 푸시를 받지 않도록 설정했을 때, 서비스에서 탈퇴했을 때 사용합니다.
Name | Type | Description |
---|---|---|
deviceToken | NSData |
현재 카카오 로그인한 사용자 및 기기의 푸시 토큰 |
AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSData* deviceToken = appDelegate.deviceToken;
[KOSessionTask pushDeregisterDeviceWithToken:deviceToken completionHandler: ^(BOOL success, NSError* error) {
if (error) {
NSLog(@"failed request - error: %@", error);
}
else {
NSLog(@"succeeded dereginster push token request - token: %@", deviceToken);
}
}];
[KOSessionTask pushDeregisterAllDeviceWithCompletionHandler: ^(BOOL success, NSError* error) {
if (error) {
NSLog(@"failed request - error: %@", error);
}
else {
NSLog(@"succeeded dereginster all push token request.");
}
}];
나에게 푸시 알림 보내기를 하려면 사용자가 카카오 로그인한 상태여야 합니다. iOS SDK의 푸시 알림 보내기 기능은 스팸 목적으로 악용되거나 보안 문제를 일으킬 수 있어 사용자 본인에게만 전송 가능합니다. 다른 사용자에게 푸시 알림을 보내려면 REST API의 푸시 알림 보내기 API를 사용해야 합니다.
수신자 제한은 사용자 고유 ID로 판별하므로, 현재 로그인한 사용자의 다른 기기로는 푸시 알림을 보낼 수 있습니다. REST API 푸시 알림 보내기의 파라미터 정보를 참고해 푸시 메시지를 구성한 뒤 보내기 요청해야 합니다.
// 푸시 알림에 같이 보낼 custom 정보
NSDictionary* customField =
[NSDictionary dictionaryWithObjectsAndKeys:
@"value1", @"key1",
@"value2", @"key2",
nil];
// iOS기기가 받을 데이터 구성하기
KakaoPushMessagePropertyForApns* forApns =
[[KakaoPushMessagePropertyForApns alloc]
initWithBadgeCount:10
sound:@"default"
pushAlert:YES
messageString:@"푸시 잘 갑니까?"
customField:customField];
// Android 기기가 받을 데이터 구성하기
KakaoPushMessagePropertyForFcm* forFcm =
[[KakaoPushMessagePropertyForFcm alloc]
initWithCollapse:@"collapse_id_1234"
delayWhileIdle:NO
returnUrl:@"http://www.example.com/fcm_feedback"
customField:customField];
// SDK의 푸시 전송 메소드로 넘길 파라미터 값
KakaoPushMessageObject* pushMsg = [[KakaoPushMessageObject alloc]
initWithApnsProperty:forApns
fcmProperty:forFcm];
// 푸시 전송
[KOSessionTask pushSendMsg:pushMsg completionHandler:^(BOOL success, NSError* error){
if (error) {
NSLog(@"failed request - error: %@", error);
}
else {
NSLog(@"succeeded push message request");
}
}];
푸시 알림 보내기 요청에 성공 시 응답으로 전달 받는 값은 없습니다. 성공 응답은 푸시가 기기까지 제대로 전송되었음을 보장하지 않습니다. APNs, FCM의 서버 상태가 좋지 않을 경우 푸시 알림이 제대로 전송되지 않을 수도 있습니다.
보내기 실패한 경우에는 요청 시 전달한 return_url
로 실패 내역을 피드백 받을 수 있습니다. 실패 피드백은 사용자 고유 ID(uuid), 기기 고유 ID(device_id), 푸시 토큰, 실패 시각을 포함합니다. FCM의 경우, 푸시 토큰 갱신을 위한 새 푸시 토큰 값을 포함하는 경우가 있습니다.
iOS SDK는 푸시 알림 기능 동작을 참고할 수 있는 PushSample
예제 앱을 포함합니다. 다음은 예제 앱을 사용하기 위한 실행 환경과 준비 사항에 대해 설명합니다.
예제 앱은 iOS 기기에서 실행해야 합니다. 시뮬레이터에서 실행하면 기기별 푸시 토큰과 푸시 알림을 받을 수 없습니다.
카카오디벨로퍼스(Kakao Developers, 이하 개발자 웹사이트)의 [내 애플리케이션] > [푸시 알림] 설정 메뉴는 APNs Development SSL 인증서를 지원하지 않습니다. 따라서 APNs Production SSL 인증서만 등록 가능합니다. APNs Production SSL 인증서만 지원하므로 기기에서 푸시 샘플을 올바로 작동시키기 위해서는 빌드(Build) 시 Code Signing
을 Developer
가 아닌, Distribution
용으로 지정해야 합니다.
${PRODUCT_NAME:rfc1034identifier}
추가your.unique.bundle.id.${PRODUCT_NAME:rfc1034identifier}
URL scheme
에 적용, URL Scheme 설정 참고kakao0123456789abcdefghijklmno
KAKAO_APP_KEY
속성을 앞서 등록한 앱의 네이티브 앱 키로 변경Distribution
인증서 선택Provisioning Profile
선택