본문 바로가기

iPhone

APNS 를 위한 Device Token 알아내기

APNS(Apple Push Notification Service)를 하기 위해서, 어플을 설치한 각 디바이스에서 Device Token 을 알아야 하는데요.

이 Device Token 을 알 수 있는 방법은 다음과 같습니다.

1. 어플 사용자가 APS(Apple Push Service) 를 이용하겠다는 동의를 해야 한다.

2. 어플리케이션 delegate 에서 UIApplicationDelegate 내 함수 (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 을 구현한다.


바로 2번 항목에서 (NSData *)deviceToken 이라는 파라미터로 Device Token 이 들어옵니다.  이 때, Device Token 은 퍼포먼스 때문에 바이너리 포맷으로 전달 된다고 하네요.

1. APS Register

어플 사용자가 APS 를 이용하겠다는 동의를 해야 한다고 했는데요, 이를 위해서 -(BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 에서 다음 코드를 추가 하시면 어플이 설치 되고 처음 실행 될 때 APS 를 이용하겠는지의 여부를 묻게 됩니다. (이 메시지는 처음에만 묻고, 그 뒤로는 다시 묻지 않습니다. 설정 변경은 일반 설정에서 On / Off 하실 수 있습니다.)
코드

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.

[window addSubview:[nav view]];

    [window makeKeyAndVisible];

// APS Register

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:

UIRemoteNotificationTypeAlert |

UIRemoteNotificationTypeBadge |

UIRemoteNotificationTypeSound ];

return YES;

}

설정 변경



2. Device Token 얻기

어플리케이션 delegate 에서 UIApplicationDelegate 내 함수 (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 을 구현을 하면, 어플이 처음 실행 될 때 다음 코드를 타게 됩니다. 이 때, Device Token 을 얻으 실 수 있습니다. (전역으로 두셨다가 필요하실 때 쓰시면 되겠네요)

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 

    NSLog(@"Device Token : %@" ,deviceToken);

}


  • Favicon of http://blog.jidolstar.com 지돌스타 2010.11.25 14:17 신고

    안녕하세요. 내용 잘보았습니다. 질문이 있어서 글을 남깁니다.
    APNS에 대해서 경험한바 있습니다. 그런데 한가지 궁금한 것이 Device Token이 디바이스(아이폰)마다 다른 건가요? 아니면 App마다 다른 건가요? 테스트 해보면 디바이스마다 다른 것 같은데... 검색해보면 App마다 다르다고 하더군요. 뭐가 맞는지 궁금합니다.

    • Favicon of https://mingu.kr Min-gu, Kim 2010.11.25 18:05 신고

      안녕하세요. 저도 정확히 알고 있는 것은 아닙니다. 일단, Device Token이 디바이스당/App당 유니크한 것인지에 대한 이슈가 없어서 자세히 본 적은 없긴 합니다만... 몇가지 사실로 가늠 해 본다면, Device Token은 App당 유니크한 것이 아닌가 합니다.

      왜냐하면, APS에서 장치를 식별하기 위해 사용되는 것인데, 알고 계신바와 같이 디바이스를 식별하기 위해서는, 이미 UDID라는게 있고, 코드상으로도 UDID를 직접 구할 수가 있습니다. 하지만, APS는 Device Token을 필요로 하죠.

      또한, Apple Document에서는 Device Token이 UDID와는 다르고, 디바이스가 점멸(wiped)됐을때 보안과 프라이버시 이유등으로 그 값이 변경된다고 나옵니다.

      그래서 Apple Document에서 본 내용으로 유추하자면, UDID는 변하지 않는 디바이스의 고유식별자이기 때문에 APS는 악용을 막기 위해 App 당 유니크한 Device Token을 필요로 하는 게 아닌가 합니다. (저도 테스트를 해 본건 아닙니다.)

    • Favicon of https://mingu.kr Min-gu, Kim 2010.12.08 15:01 신고

      앗. 좋은 정보 감사드립니다. ^^

    • Favicon of http://blog.jidolstar.com 지돌스타 2010.12.08 15:30 신고

      답변 감사합니다.
      보니깐 DeviceToken은 디바이스마다 다릅니다. DeviceID(UDID)와는 다른 값입니다. 어플마다 다른 것은 인증서이고요. 이 인증서로 어플을 가늠합니다.

      그러니깐 정리하자면 DeviceToken으로 어떤 기기로 갈 것인지 알려구고 APNS인증서는 어떤 어플로 갈것인지 알려주는 것이 맞네요.

      검색을 해봐도 이런 내용이 전혀 없다보니 삽질을 반복하게 됩니다. 이번 기회에 확실히 알았으니 좋습니다. ^^

  • Favicon of http://blog.jidolstar.com 지돌스타 2010.12.08 15:30 신고

    아 그리고 어플하나 만들어 올렸습니다. 구경하세요. ^^
    http://blog.jidolstar.com/719

  • 2011.03.20 00:58 신고

    와 2번은 저도 몰랏던 기법이라 바로 머릿속에 넣었습니다. 그런데 하나 여쭈고 싶은게...UDID가 디바이스토큰이랑 다르다는건 알고 있어서 매번 전 1번 방식을 썻는데 UIDI를 얻어서 그걸로 APNS의 이용동의를 받을순없나요? 그냥 여러가지 방법을 알아둘려고 그러는겁니다 쓸데없는짓일지도 모르지만 ㅎㅎ