푸시 알림

카카오 플랫폼 서비스에서 제공하는 iOS의 푸시 알림은 APNS(Apple Push Notification Service)를 활용합니다. 여기에서는 APNS를 사용하기 위한 일반적인 안내 및 카카오계정 로그인을 기반으로 푸시를 사용할 수 있는 방법을 소개합니다.
카카오 iOS SDK를 이용하면 카카오계정으로 로그인한 경우에 한해 별도의 사용자 아이디 관리 없이 푸시를 보낼 수 있으며, 이를 위한 푸시토큰의 등록과 삭제를 쉽게 할 수 있습니다.

카카오 푸시 서비스에 대한 전반적인 설명은 REST API의 푸시 알림 가이드를 참조해 주세요.
현재 개발 중인 서비스가 순수 카카오계정 기반이 아닌, 별도의 계정 관리 시스템 혹은 타 플랫폼이 SNS 서비스 로그인 기능도 같이 사용할 경우, 푸시 알림 기능 이용 시 직접 REST API를 호출하여 사용하는 것을 권장합니다.

시작하기 전에

카카오 플랫폼 서비스에서 제공하는 푸시 알림을 올바로 사용하기 위해서는 다음과 같은 기본 절차가 필요합니다. 해당 절차는 APNS를 사용하기 위한 일반적인 안내입니다.

  • APNS 인증서 발급
    APNS를 활용하기 위해서는 Apple에서 등록/제공되는 인증서가 필요합니다. APNS 인증서를 발급하는 절차를 설명합니다.
  • 카카오 푸시 서비스 설정
    카카오 플랫폼 서비스에서 제공하는 푸시를 사용하기 위한 설정 및 해당 APNS 인증서 등록에 대해 설명합니다.
  • APNS 등록 및 푸시 토큰 발급
    원격 알림을 위해 애플리케이션에서 APNS에 등록하고 푸시 토큰을 발급하는 앱 개발 과정을 설명합니다.
  • 푸시 알림 받기
    원격 알림을 받기 위한 애플리케이션의 앱 개발 과정을 설명합니다.

카카오계정의 로그인을 같이 활용할 경우, 푸시 개발을 좀 더 쉽게 하기 위해서 다음과 같은 기능을 제공합니다. SDK에는 해당 기능을 사용하기 위한 API 및 샘플이 포함되어 있습니다.

  • 푸시 토큰 등록: 카카오 플랫폼 서비스에서 제공하는 푸시 시스템으로 푸시 토큰을 등록합니다. 로그인된 사용자는 해당 등록으로 푸시를 받을 수 있습니다.
  • 푸시 토큰 등록 해제: 카카오 플랫폼 서비스에서 제공하는 푸시 시스템으로 푸시 토큰을 등록을 해제합니다. 사용자는 더이상 푸시를 받을 수 없습니다.
  • 푸시 토큰 정보 조회: 카카오 플랫폼 서비스에 올바로 푸시 토큰을 등록하였다면, 해당 토큰들을 조회할 수 있습니다.
  • 푸시 알림 전송: SDK를 통해 본인에게 푸시를 전송하는 방법을 설명합니다.
  • 샘플앱 실행: SDK에 포함된 샘플앱을 실행하기 위한 절차를 설명합니다.

설정하기

APNS 인증서 발급

APNS 인증서 파일은 Apple의 푸시 서비스를 이용하기 위해 푸시의 발송 서버에서 사용됩니다. 푸시의 발송 서버는 카카오 플랫폼 서비스에서 제공되며, 해당 인증서 파일을 카카오 플랫폼 서비스에 등록을 해야 합니다. 다음은 .p12 형식의 APNS 인증서 파일을 발급하는 과정을 설명합니다.

카카오 푸시 서비스에서는 .p12 형식의 APNS 인증서 파일을 지원합니다. 기존에 사용중인 APNS 인증서(.p12)를 이미 소유하고 있다면 해당 과정을 생략할 수 있습니다.

App ID 생성

각각의 iOS 애플리케이션은 유일한 애플리케이션 ID를 가지게 됩니다. 푸시 알림을 위해 APP ID를 어떻게 만드는지에 대해 설명합니다.

기존에 존재하는 App ID가 있다면 해당 과정은 생략 가능합니다.

  1. Apple에서 제공하는 개발자 센터에 로그인 합니다. Apple 개발자 센터로 이동

  2. 오른쪽 상단에 위치한 iOS 프로비저닝 포탈을 클릭합니다(iOS Developer Program > Certificates, Identifier & Profiles). push_gen_cert1

  3. ID를 포함한 목록을 보기 위해 왼쪽에 위치한 Identifiers를 클릭합니다(iOS Apps > Identifiers). push_gen_cert2

  4. 새로운 App ID를 생성하기 위해 App IDs 탭을 열고 오른쪽 위에 위치한 생성 버튼(+)을 클릭합니다(iOS App IDs > +). push_gen_cert3

  5. App ID Description에 이름을 적고, Bundle ID를 올바로 입력합니다(Wildcard(*) ID는 푸시 알림 서비스에 사용될 수 없습니다). 아래에 있는 Push Notifications의 체크박스를 선택하고 Continue 버튼을 클릭합니다. push_gen_cert4 push_gen_cert5

  6. 올바로 설정을 마쳤다면 App ID에 대한 정보를 볼 수 있습니다. Submit 버튼을 계속적으로 클릭합니다. push_gen_cert6

인증서 요청 생성

인증서 발급을 위해서는 인증서 요청 파일이 필요합니다. 해당 파일은 Mac OS X에 있는 키체인 접근(Keychain Access) 앱을 통해 생성할 수 있습니다.

  1. 키체인 접근 앱을 실행합니다. push_cert_req1

  2. 메뉴에서 키체인 접근 > 인증서 지원 > 인증 기관에서 인증서 요청을 선택합니다. push_cert_req2

  3. 필수 정보를 입력하고, "디스크에 저장됨" 체크박스를 선택합니다. 계속 버튼을 클릭합니다. push_cert_req3

  4. 인증서 요청 파일을 저장합니다. push_cert_req4

푸시 알림을 위한 App ID 설정

생성된 인증서 요청 파일을 이용하여 계속하여 Apple 개발자 센터의 푸시 설정을 할 수 있습니다. App ID가 한번 생성되면, 푸시 알림을 위한 별도의 설정이 필요합니다.

  1. App ID 목록에서 푸시 알림 설정을 위한 생성된/존재하는 App ID를 선택하여, Edit 버튼을 클릭합니다. push_cert_conf1

  2. 페이지 아래쪽의 Push Notifications 항목에서 체크박스가 Enable되어 있는지 확인합니다. 체크가 되어 있지 않다면 체크합니다. 다음 그림과 같이 두가지 형식의 인증서를 생성할 수 있습니다. Production SSL Certificate에 있는 Create Certificate 버튼을 클릭합니다. push_cert_conf2

    카카오 플랫폼 서비스의 푸시 알림을 이용하기 위해서는 반드시 Production SSL Certificate를 사용해야 합니다.

  3. 다음과 같은 설정 마법사 페이지가 나오면 Continue 버튼을 클릭합니다. push_cert_conf3

  4. 앞에서 생성 및 저장하였던 인증서 요청 파일을 선택하고, Generate 버튼을 클릭합니다. push_cert_conf4

  5. SSL 인증서 생성이 완료되었습니다. Done 버튼을 클릭합니다. push_cert_conf5

APNS 인증서 설치 및 내보내기

발급한 인증서를 카카오 푸시 서비스에 등록 하기 위해서 .p12 인증서로 내보내는 방법을 설명합니다.

  1. 위의 설정을 올바로 마쳤다면 이제 인증서를 다운로드 할 수 있습니다. 받은 인증서를 더블 클릭하면 키체인 접근 앱에 설치됩니다. push_cert_save1

  2. 키체인 접근 앱을 실행하고 로그인, 인증서 부분의 목록을 살펴보면 설치한 인증서가 보입니다. 목록에서 해당 인증서를 선택하고 펼치면 개인키가 보입니다. 해당 인증서 및 개인키까지 목록에서 선택(2개 항목 선택)하여 마우스 오른쪽 클릭으로 "2개 항목 보내기"를 선택합니다. push_cert_save2

  3. 생성될 .p12파일의 이름 및 저장할 위치를 선택합니다. push_cert_save3

  4. 내보내기를 위한 패스워드를 입력합니다. push_cert_save4

    내보내기에서는 빈 공백의 패스워드가 허용되지만, 카카오 푸시 서비스에서는 빈 공백의 암호를 지원하지 않으므로 반드시 패스워드를 입력해 주세요.

마지막 과정으로 로컬 컴퓨터의 어드민 패스워드를 입력합니다. push_cert_save5

APNS 인증서에 대한 모든 준비가 끝났습니다.

카카오 푸시 서비스 설정

카카오 푸시 서비스를 올바로 이용하기 위해서는 위에서 설정한 APNS 인증서 및 암호가 필요합니다.

설정 > 푸시 에서 푸시 사용을 켜고, 인증서를 업로드 하고 인증서 비밀번호를 설정합니다. dev_015_ios.png

선택한 인증서의 올바른 비밀번호(인증서를 내보낼 때 설정했던)를 넣어야 설정이 완료됩니다.

카카오 푸시 서비스를 이용하기 위한 기본 설정이 모두 끝났습니다.

앱 개발

APNS 등록 및 푸시 알림을 받는 부분의 보다 상세한 설명은 Apple의 푸시 알림 공식 가이드를 참조하세요.

APNS 등록 및 푸시 토큰 발급

실제로 푸시를 보내고 받기 위해서는 iOS 애플리케이션 사용자 코드에서 APNS 등록을 통해 푸시 토큰(디바이스 토큰)을 발급 받아야 합니다.

발급 받은 디바이스 토큰은 언제든 바뀔 수 있기 때문에, 애플리케이션이 실행될 때마다 항상 UIApplication의 registerForRemoteNotificationTypes: 메소드를 통해 재등록을 해주어야 합니다. 해당 등록이 성공적으로 이루어지면 app delegate안에 있는 application:didRegisterForRemoteNotificationsWithDeviceToken: 메소드를 통해 디바이스 토큰을 전달 받을 수 있습니다. 또한 해당 디바이스 토큰을 이용하여 카카오 푸시 서비스로 푸시 알림을 보낼 수 있습니다.

디바이스 토큰은 메시지를 보내는데 사용되므로, REST API를 통해 카카오 푸시 서비스로 알려주어야 합니다. 디바이스 토큰을 등록해주는 REST API를 올바로 사용하기 위해서는, 어드민 키가 필요하며 애플리케이션내에서 호출하지 않고 반드시 서버측에서 호출하도록 해야합니다.

REST API를 이용한 푸시 알림 보내기에 대한 상세한 설명은 REST API의 푸시 알림 가이드을 참조하세요.

다음은 iOS 애플리케이션에서 APNS 등록을 하고 푸시 토큰을 받는 코드의 예입니다.

//============================================
//  Application Delegate에서 작성
//============================================

- (void)application::(UIApplication *)app didFinishedLaunchingWithOptions:(NSDictionary*) launchingOptions {

    // Push Noti를 통해 앱 실행되었을 경우에 대한 처리 필요

    // Apple 서버에 푸시 토큰(Device Token) 요청
    UIApplication *sharedApplication = [UIApplication sharedApplication];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0f) {
        [sharedApplication registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIRemoteNotificationTypeSound |UIUserNotificationTypeAlert) categories:nil]];
        [sharedApplication registerForRemoteNotifications];
    } else {
        [sharedApplication registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    }
}

// Delegation methods
// Push 토큰 생성 완료
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
    [self sendProviderDeviceToken:devTokenBytes]; // custom method
}

// Push 토큰 생성 실패
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSLog(@"Error in registration. Error: %@", err);
}

보다 상세한 코드 및 내용은 Apple의 푸시 알림 공식 가이드의 "Registering to Receive Remote Notifications" 부분을 참조해 주세요.

푸시 알림 받기

푸시 알림은 다음과 같은 시나리오에서 받을 수 있습니다.

  • 애플리케이션이 foreground에서 실행되지 않았을 경우: iOS 시스템은 알림, 뱃지, 사운드 등을 통해 푸시를 알림합니다. 해당 알림을 사용자가 탭할 경우 시스템은 해당 애플리케이션을 실행하고, 해당 delegate의 application:didFinishLaunchingWithOptions: 메소드(구현되어 있을 경우)를 실행해 줍니다.
  • 애플리케이션이 실행중일 경우: 해당 delegate의 application:didReceiveRemoteNotification: 메소드가 호출됩니다.
//============================================
//  Application Delegate에서 작성
//============================================



// 앱 실행 중 Push 수신 시 처리할 부분
- (void) application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*) userInfo {

    NSLog(@"Received Push Notification: %@", [userInfo description]);
    // 후 처리 구현

}

보다 상세한 코드 및 내용은 Apple의 푸시 알림 공식 가이드의 "Handling Remote Notifications" 부분을 참조해 주세요.

푸시 토큰 등록

푸시 토큰(Device Token)을 카카오 푸시 시스템에 등록하는 기능에 대해 설명합니다. iOS SDK에서 제공하는 푸시 토큰 등록 기능은 카카오 계정으로 로그인을 통해 생성된 사용자 토큰을 기반으로 작동합니다. 따라서 푸시 토큰을 등록하기 전에 카카오 계정으로 로그인이 되어 있어야 합니다. 로그인이 안 된 상태에서 푸시 토큰 발급이 완료되었다면, 로그인 후 푸시 토큰 등록하기 위해 토큰을 잘 보관해야 합니다.

AdminKey 방식의 푸시 토큰 등록 REST API와 다른 점이 있습니다.

  • 사용자 토큰 기반으로 작동하므로 사용자 고유 ID 입력을 따로 받지 않습니다.
    (사용자 정보 요청의 사용자 아이디(ID) 참조)
  • device id는 push token의 값을 그대로 사용합니다.

completionHandler가 다른 메소드들과 다른 점이 하나 있습니다. expiredAt이라는 값이 제공되는데 이 값은 등록된 푸시 토큰이 카카오 푸시 시스템 내에서 만료되기 까지 남은 일수를 뜻합니다. 값이 -1일 경우 무제한을 의미합니다.

예제는 다음과 같습니다.


#import <KakaoOpenSDK/KakaoOpenSDK.h>

(생략)

// 디바이스 토큰 등록 시 호출
- (void) registerDeviceToken:(NSData*) deviceToken  {

    //SDK에서 제공하는 푸시 토큰 등록 메소드

    [KOSessionTask pushRegisterDeviceWithToken:deviceToken
                             completionHandler:
        ^(BOOL success, NSInteger expiredAt, NSError* error){
            // 후 처리 구현
        }];

}

푸시 토큰 등록 해제

푸시 토큰 등록 해제에는 두가지 방식이 존재합니다. 현재 기기의 푸시 토큰 등록만 해제하는 것과 현재 로그인 한 사용자의 모든 기기의 푸시 토큰을 등록 해제하는 기능이 있습니다.

현재 기기의 푸시 토큰 등록 해제하기

푸시 토큰 등록하기와 마찬가지로 로그인 기반입니다. AdminKey 방식의 푸시 토큰 삭제 REST API의 경우 device id와 사용자 고유 ID를 받지만 SDK에서는 푸시 토큰만 받습니다. SDK 내부에서 푸시 토큰 등록 시 device id에 푸시 토큰 값을 넣었으므로 등록 해제 시에도 푸시 토큰을 device id로 사용합니다.

다음과 같은 경우에 사용 권장합니다.

  • 특정 기기에서만 푸시를 받지 않도록 설정할 때
  • 특정 기기에서 로그아웃 실행 시

예제는 다음과 같습니다.

- (void) deregisterCurrentDevice:(NSData*) deviceToken {

    //SDK에서 제공하는 푸시 토큰 등록해제 메소드
    [KOSessionTask pushDeregisterDeviceWithToken:deviceToken
                               completionHandler:
        ^(BOOL success, NSError* error){
            // 후 처리 구현
        }];

}
해당 사용자의 모든 기기의 푸시 토큰 등록 해제

푸시토큰 등록/현재 기기 등록 해제와 마찬가지로 로그인 기반의 기능입니다. 현재 로그인 한 사용자의 모든 기기의 푸시 토큰을 등록 해제합니다.

다음과 같은 경우에 사용 권장합니다.

  • 모든 기기에서 푸시를 받지 않고 싶을 경우
  • 탈퇴 시

예제는 다음과 같습니다.

- (void) deregisterAllDevice {

    //SDK에서 제공하는 모든 기기의 푸시 토큰 등록 해제 메소드
    [KOSessionTask pushDeregisterAllDeviceWithCompletionHandler:
        ^(BOOL success, NSError* error){
            // 후 처리 구현
        }];

}

푸시 토큰 정보 조회

카카오 플랫폼 서비스에 푸시 토큰이 올바로 등록되었는지, 해당 사용자와 관련된 다른 푸시 토큰들은 무엇인지 등의 정보를 확인할 수 있습니다. 해당 기능을 사용하기 위해서는 성공적인 로그인 후에 얻을 수 있는 사용자 토큰이 필요합니다.

성공 결과는 KOPushTokenInfo를 복수개 포함한 NSArray 형태로 제공되며, KOPushTokenInfo의 정보는 아래와 같습니다.

요소 타입 설명
userId NString 등록된 푸시 토큰의 사용자 아이디
deviceId NString 등록된 디바이스 아이디
pushToken NString 등록된 푸시 토큰
pushType NString 푸시 토큰의 종류. 예를 들어 "apns" 또는 "gcm"
createdAt NString 푸시 토큰 생성 시간
updatedAt NString 푸시 토큰 갱신 시간

예제는 다음과 같습니다.

[KOSessionTask pushGetTokensTaskWithCompletionHandler:^(NSArray *tokens, NSError *error) {
    if (!error) {
        // success
        // tokens array에는 KOPushTokenInfo 객체들이 포함되어 있습니다.
        // ...
    } else {
        // error
    }
}];

푸시 알림 전송

푸시 토큰 등록/해제와 마찬가지로 로그인 기반으로 작동합니다. SDK에서 제공하는 푸시 전송 메소드는 스팸 및 보안적인 이유로 본인에게만 전송 가능하도록 구현되어 있습니다.

A사용자가 B사용자에게 푸시를 전송하는 방법은 REST API의 푸시 알림을 참조하시기 바랍니다.

파라미터에 대한 세부 정보는 푸시 알림 보내기 REST API를 참조하시기 바랍니다.

예제는 다음과 같습니다.


- (void) invokeSend {

    // 푸시 알림에 같이 보낼 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 기기가 받을 데이터 구성하기
    KakaoPushMessagePropertyForGcm* forGcm =
        [[KakaoPushMessagePropertyForGcm alloc]
            initWithCollapse:@"collapse_id_1234"
            delayWhileIdle:NO
            returnUrl:@"http://www.example.com/gcm_feedback"
            customField:customField];

    // SDK의 푸시 전송 메소드로 넘길 파라미터 값
    KakaoPushMessageObject* pushMsg = [[KakaoPushMessageObject alloc]
        initWithApnsProperty:forApns
        gcmProperty:forGcm];

    // 푸시 전송
    [KOSessionTask pushSendMsg:pushMsg
        completionHandler:^(BOOL success, NSError* error){
            // 후 처리 구현
        }];

}

샘플앱 실행

SDK에 포함된 PushSample 앱을 실행하기 위한 조건을 설명합니다. 푸시 기능은 카카오 플랫폼 서비스에서 제공하는 다른 기능들과 비교해 몇 가지 제약 사항이 있습니다.

iOS 기기에서 실행

만약 시뮬레이터에서 실행하게 되면 다음과 같은 문제들이 발생합니다.

  • Device Token 발급 불가
  • Push 수신 불가
APNS Production SSL 인증서 사용

카카오 플랫폼 서비스의 개발자 웹사이트에서는 푸시 설정 시 APNS Development SSL 인증서를 지원하지 않습니다(추후 Development SSL 지원 예정). 따라서 APNS Production SSL 인증서만 등록 가능합니다. APNS Production SSL 인증서만 지원하다 보니 기기에서 푸시 샘플을 올바로 작동시키기 위해서는 Build 시 Code Signing을 Developer가 아닌, Distribution용으로 해야 합니다.

PushSample 앱 구동을 위한 절차
  • Apple Developer에서 할 일
    • Apple Developer에서 앱 등록
    • Push Notification 설정에서 Production SSL 인증서 추가
    • Distribution(Ad Hoc) Provisioning Profile 생성

인증서 발급의 경우 APNS 인증서 발급을 참고합니다.

  • Kakao Developers_에서 할 일
    • 앱 생성(혹은 수정)
    • iOS 플랫폼 추가 후 번들 ID(Bundle Identifier)를 적절하게 입력. 번들 ID의 마지막 부분은 "PushSample"로 합니다. 예) your.unique.bundle.id.PushSample
    • Push 사용 여부 Enable 및 APNS Production SSL 인증서 등록
  • PushSample 앱 수정
    • Bundle Identifier 수정. 샘플에 포함된 번들 ID는 "com.kakao.sample.${PRODUCT_NAME:rfc1034identifier}", 즉 "com.kakao.sample.PushSample"로 되어 있습니다. 이를 위에서 앱 생성시 iOS 플랫폼에 추가했던 번들 ID로 수정합니다. 마지막 ${PRODUCT_NAME:rfc1034identifier}는 PushSample을 의미합니다. 예) your.unique.bundle.id.${PRODUCT_NAME:rfc1034identifier}
    • URL scheme도 위에서 만들었던 앱의 네이티브 앱키를 적용하여 수정합니다. 예) kakao0123456789abcdefghijklmno
    • KAKAO_APP_KEY 속성을 위에서 만들었던 앱의 네이티브 앱 키로 바꾸어 줍니다. 예) 0123456789abcdefghijklmno
    • Build Settings > code signing 섹션에서 code signing에서 distribution 인증서 선택
    • provisioning profile은 위에서 생성한 것을 선택

인증서 등록의 경우 카카오 푸시 서비스 설정을 참고합니다.
앱 생성 및 앱 키 관련 설정의 경우 앱 생성을 참고합니다.


Last Modified : 2017-08-03