본문 바로가기
앱 개발 - iOS

APNS 개발 2

by 똑똑한 영장류 2015. 11. 22.

APNS 구현을 위해서 앱에서 처리해야할 부분과 서버에서 처리해야할 부분이 있다.


서버는 어디로 푸시를 날릴지 알기위해서 디바이스토큰이라는 것이 필요한데, 그건 앱에서 알아낼 수 있다.


우선 앱에서 필수 코드를 구현해야 테스트가 가능하겠다.


Xcode에서 프로젝트를 하나 만들자. 앱의 bundle identifier는 개발자 사이트에서 마련해놓은 번들 아이디와 같아야한다.

내 경우에는 com.appspop.pushtest 였다.


AppDelegate.m 에 가서 아래 내용 추가하자.


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

    // Override point for customization after application launch.

    

    UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;

    

    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];

    

    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];

    [[UIApplication sharedApplication] registerForRemoteNotifications];

    

    return YES;

}


다음 함수들도 추가해주자.


#pragma mark - APNs


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

    

    NSString *strDeviceToken = [devToken description];

    NSLog(@"%@",strDeviceToken);

    

    NSString *strWithoutSpace = [strDeviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];

    int len = [strWithoutSpace length];

    NSRange range = {1, len-2};

    NSString *pushid = [strWithoutSpace substringWithRange:range];

    NSLog(@"%@",pushid);


}


- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {

    NSLog(@"Error in registration. Error: %@", err);

}


이정도 하고, 실제 아이폰을 맥에 연결한 후, 시뮬레이터가 아닌 실 기기로 실행을 시켜보자.


아이폰에서 앱이 실행되고, 'pushtest'에서 알림을 보내고자 합니다....라는 메시지가 나타난다. [확인]을 눌러주자.


그리고, Xcode에 와서 디버그 콘솔을 보면 해당 아이폰의 디바이스 아이디를 확인할 수 있다.

이 디바이스토큰을 서버에 저장하고 필요하면 이 디바이스토큰을 이용해서 해당 아이폰에 푸시를 보낼 수 있다.




서버를 준비해야겠다.

서버는 해당 앱에 푸시를 보내기 위해서 pem 파일이 필요하다.

pem 파일부터 만들어야겠다.


우선. 키체인에 가서 Apple Development IOS Push Services: com.XXXXXXX.pusthtest 인증서를 선택하고, 마우스 오른쪽을 클릭해서 내보내기를 실행하자.




도큐멘트 디렉토리에 저장을 하던 어디에 하던, 파일이름을 지정해주고, 


키를 위해 암호를 설정해준다.

맥 로그인 계정의 암호를 입력해주면...


토큐먼트 디렉토리에 cert.p12 파일이 생성된다.


이제 키체인에서 push service 인증서를 클릭해서 열쇠 아이콘이 보이는 개인 키를 연다. 거기서 마우스 오른쪽 눌러서 키를 내보내기 한다.


cert.p12 만들 때와 같이 진행하며, 이름은 key로 한다.


자..이제 도큐먼트 디렉토리에 cert.p12 와 key.p12 가 있다.


이 두개 파일로 pem 파일을 만들게 된다.


같은 디렉토리에 두 파일을 옮겨놓자.


난 홈디렉토리 아래에 pem 이라는 디렉토리를 만들고 그 안에 두 파일을 복사해놓았다. 터미널을 열어 pem 디렉토리로 이동한다.


MBPro:~/pem ryu $ ls

cert.p12 key.p12

MBPro:~/pem ryu $ openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12

Enter Import Password:

MAC verified OK

MBPro:~/pem ryu $ openssl pkcs12 -nocerts -out key.pem -in key.p12

Enter Import Password:

MAC verified OK

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

MBPro:~/pem ryu $ openssl rsa -in key.pem -out key.unencrypted.pem

Enter pass phrase for key.pem:

writing RSA key

MBPro:~/pem ryu $ cat cert.pem key.unencrypted.pem > pushtest.pem

MBPro:~/pem ryu $ 



Enter Import Password 는 이전에 pushtestkey.p12 만들 때 입력했던 암호를 입력해야한다.

그 뒤에서 Enter PEM pass phrase 는 새로 만들어질 pem 파일을 암호화하는데 사용될 암호를 입력해야한다.


위처럼 최종 pushtest.pem가 만들어졌다.


애플 푸시서버에 푸시를 요청할 수 있도록 서버를 구성해야하는데, 구글링하면 소스는 많다. 

그 소스들에서는 지금 만들어진 pem 파일을 이용하게 되니까, 서버에 올려서 사용하면 되겠다.


















댓글