페이지 이동경로
  • 문서>
  • 푸시 알림>
  • Legacy iOS

푸시 알림

Legacy iOS

이 문서는 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)에 발급된 기기별 푸시 토큰은 언제든지 바뀔 수 있기 때문에, 앱 실행 시 항상 UIApplicationregisterForRemoteNotificationTypes 메소드를 통해 푸시 토큰 재등록을 해야 합니다.

푸시 토큰이 성공적으로 등록되면 Application DelegatedidRegisterForRemoteNotificationsWithDeviceToken 메소드를 통해 기기별 푸시 토큰을 전달 받을 수 있습니다. 전달 받은 푸시 토큰은 iOS SDK의 푸시 토큰 등록 기능 또는 REST API 푸시 토큰 등록을 통해 카카오 푸시 서비스에 등록해야 합니다.

아래 예제는 APNs 등록 및 푸시 토큰 발급 과정을 보여줍니다. 단계별로 사용해야 할 메소드와 처리 방법을 참고합니다.

Application Delegate
//============================================
//  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];
}
Apple 공식 가이드

APNs 등록 및 푸시 알림 관련 상세 설명은 Apple 푸시 알림 공식 가이드를 참고합니다.

푸시 알림 받기 설정

앱이 실행 및 사용 중이지 않고 백그라운드(Background)에 있을 때, iOS 시스템은 알림, 뱃지(Badge), 소리(Sound) 등으로 푸시 알림합니다.

푸시 알림을 사용자가 탭(Tap)하면, iOS 시스템이 해당 앱을 실행하고 Application DelegatedidFinishLaunchingWithOptions 메소드를 실행합니다. 앱이 실행 및 사용 중이라면 didReceiveRemoteNotification 메소드를 호출합니다.

푸시 알림을 받았을 때 필요한 처리가 올바르게 이뤄지도록 iOS 시스템이 실행하는 메소드의 상세 내용을 구현해야 합니다. 다음 예제는 앱이 실행 중인 경우 호출하는 didReceiveRemoteNotification 메소드에서 푸시 알림 수신 시 동작을 구현하는 부분을 보여줍니다.

Application Delegate
//============================================
//  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 공식 가이드

보다 상세한 코드 및 설명은 Apple 푸시 알림 공식 가이드의 "Handling Remote Notifications"를 참고합니다.

푸시 토큰 등록하기

푸시 알림을 받을 사용자의 푸시 토큰(디바이스 토큰)을 카카오 푸시 서비스에 등록하는 API입니다. 이 기능은 현재 사용자가 로그인한 기기에서 발급 받은 푸시 토큰을 등록하는 기능으로, 푸시 토큰 등록을 요청하기 전에 사용자가 카카오 로그인을 완료한 상태여야 합니다.

만약 사용자가 로그인하지 않은 상태에서 푸시 토큰이 발급됐다면, 카카오 로그인 후 해당 푸시 토큰을 등록할 수 있도록 값을 보관해두어야 합니다.

다음 예제를 참고합니다.

Sample
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와 다른 점이 있습니다.

  • 카카오 로그인 사용자 정보 기반으로 동작하므로 사용자 고유 ID(uuid 또는 user_id)를 입력 받지 않습니다.
  • 기기 고유 ID(device_id)는 푸시 토큰 값을 그대로 사용합니다.

응답으로 받는 expiredAt 값은 푸시 토큰의 남은 유효기간을 일 단위로 알려줍니다. 값이 -1인 경우에는 유효기간이 무제한이라는 의미입니다. 푸시 토큰의 유효기간 갱신을 위해 앱 실행 및 로그인 시 푸시 토큰 갱신 및 재등록을 하는 방식을 권장합니다.

Response
Name Type Description
expiredAt NSInteger 푸시 토큰의 남은 유효기간, 일 단위

푸시 토큰 보기

카카오 푸시 서비스에 등록된 사용자의 푸시 토큰의 정보를 확인하는 API입니다. 사용자가 현재 로그인한 기기 외에 다른 기기에서 등록한 푸시 토큰의 정보도 확인할 수 있습니다. 사용자가 카카오 로그인을 완료한 상태여야 하며, 요청 결과에 따른 처리를 구현해야 합니다. 다음 예제를 참고합니다.

Sample
[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입니다.

KOPushTokenInfo
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

푸시 토큰 보기 요청의 파라미터 중 userId는 다른 푸시 API와 동일한 이름을 가지도록 uuid로 변경되었습니다. userId는 일정 유예기간 경과 후 제거 예정입니다(deprecated).

푸시 토큰 삭제하기

카카오 푸시 서비스에 등록한 푸시 토큰을 삭제하는 API입니다. 카카오 푸시 서비스에서 현재 기기의 푸시 토큰만 지우거나, 현재 로그인한 사용자의 모든 푸시 토큰을 지울 수 있습니다. 이 기능은 카카오 푸시 서비스에 등록된 푸시 토큰만 삭제하고 기기의 푸시 토큰을 삭제하지 않습니다.

iOS SDK의 푸시 알림은 현재 로그인한 사용자 정보 기반으로 동작하므로, 사용자가 카카오 로그인을 완료한 후 푸시 토큰 삭제 기능을 이용할 수 있습니다.

현재 로그인한 사용자 및 기기의 푸시 토큰을 삭제하려면 pushDeregisterDeviceWithToken으로 기기별 푸시 토큰 정보를 전달해 요청합니다. 이 방법은 특정 기기에서만 푸시를 받지 않도록 설정하거나, 사용자가 로그아웃할 때 사용합니다.

현재 로그인한 사용자의 모든 기기 푸시 토큰을 삭제하려면 pushDeregisterAllDeviceWithCompletionHandler로 요청합니다. 이 기능은 사용자가 모든 기기에서 푸시를 받지 않도록 설정했을 때, 서비스에서 탈퇴했을 때 사용합니다.

Parameter
Name Type Description
deviceToken NSData 현재 카카오 로그인한 사용자 및 기기의 푸시 토큰
Sample: 현재 카카오 로그인한 사용자 및 기기의 푸시 토큰 삭제
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);
    }
}];
Sample: 현재 카카오 로그인한 사용자의 모든 기기 푸시 토큰 삭제
[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 푸시 알림 보내기의 파라미터 정보를 참고해 푸시 메시지를 구성한 뒤 보내기 요청해야 합니다.

Sample
// 푸시 알림에 같이 보낼 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 기기에서 실행해야 합니다. 시뮬레이터에서 실행하면 기기별 푸시 토큰과 푸시 알림을 받을 수 없습니다.

APNs Production SSL 인증서 사용

카카오디벨로퍼스(Kakao Developers, 이하 개발자 웹사이트)의 [내 애플리케이션] > [푸시 알림] 설정 메뉴는 APNs Development SSL 인증서를 지원하지 않습니다. 따라서 APNs Production SSL 인증서만 등록 가능합니다. APNs Production SSL 인증서만 지원하므로 기기에서 푸시 샘플을 올바로 작동시키기 위해서는 빌드(Build) 시 Code SigningDeveloper가 아닌, Distribution용으로 지정해야 합니다.

준비 사항

Apple 개발자 웹사이트에서 할 일
  • 앱 등록
  • Push Notification 설정에서 Production SSL 인증서 추가
  • Distribution(Ad Hoc) Provisioning Profile 생성
개발자 웹사이트에서 할 일
  • 앱 생성 또는 수정
  • iOS 플랫폼 추가 후 번들 ID(Bundle Identifier) 입력, 마지막 부분은 "PushSample"로 해야 함
    예) your.unique.bundle.id.PushSample
  • Push 사용 여부 Enable 및 APNs Production SSL 인증서 등록
PushSample 앱 수정
  • 샘플에 포함된 번들 ID를 앱 생성 시 iOS 플랫폼에 추가했던 번들 ID로 수정하고, PushSample 앱을 의미하는 ${PRODUCT_NAME:rfc1034identifier} 추가
    예) your.unique.bundle.id.${PRODUCT_NAME:rfc1034identifier}
  • 앞서 등록한 앱의 네이티브 앱 키(Native App Key)를 URL scheme에 적용, URL Scheme 설정 참고
    예) kakao0123456789abcdefghijklmno
  • KAKAO_APP_KEY 속성을 앞서 등록한 앱의 네이티브 앱 키로 변경
    예) 0123456789abcdefghijklmno
  • [Build Settings] > [Code signing]에서 Distribution 인증서 선택
  • Apple 개발자 웹사이트에서 생성한 Provisioning Profile 선택

더보기