애플 푸시 알림 서비스 (Apple Push Notification Service)
APNS 란?
애플의 푸시 알림 서비스(APNS)는 푸시 알림 기능의 중심이며 아이폰, 아이패드, 아이팟 터치와 같은 장치에
정보를 전송하기 위한 강력하고 고효율적인 서비스입니다.
소프트웨어 개발사 및 개발자가 제작한 응용 프로그램은 새 데이터가 도착하면 데이터를 모니터링 하면서 영 구적 보안 채널을 통해 APNS와 공급자를 연결하여 대상 장치에 알림을 보냅니다.
시스템 구성
(그림 출처 : apple.com)
개발 방법
1. APNS를 하기 위한 인증서 생성
- iOS Provisioning Portal 사이트에서 App ID를 생성하고 푸시 서비스를 할 App ID를 선택하여 “Enable for Apple push notification service”란에 체크하여 해당 앱이 푸시 서비스를 사용할 수 있도 록 활성화
- Provisioning 메뉴에서 App ID에 대한 Profile을 생성하고 다운로드
- Profile 을 실행하여 맥 OS의 “키체인 접근” 유틸리티에 APNS용 인증서 등록
2. APNS 와 연동할 푸시 서버용 인증서 생성
- 맥 OS의 “키체인 접근” 유틸리티에서 APNS 인증서를 Export하여 저장
- 맥 OS 터미널에서 Export 한 인증서 파일(확장자 “.p12”)들을 “.pem” 파일로 변환
$openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
$openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
생성된 각각의 pem 파일들을 서버에 저장한다
3. 푸시 서버를 서비스에 맞게 수정
PHP : APNS-PHP
http://code.google.com/p/apns-php/
4. 앱 (클라이언트)에서 푸시 관련 이벤트 처리
단말기가 APNS에 등록후 APNS로 부터 디바이스 토큰을 받았을 때 호출되는 콜백 메서드 (디바이스 토큰을 멤버 변수에 저장해 놓고 적당한 시점에 디바이스 토큰을 푸시 서버로 전송한다.)
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"deviceToken: %@", deviceToken);
[self.myDeviceToken appendData:deviceToken];
}
APNS에 등록을 시도했으나 실패한 경우 호출되는 콜백 메서드
- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"Registeration error: %@", error);
}
어플이 실행중일 때 알림이 오면 호출되는 메서드
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary
*)userInfo
{
NSDictionary *aps = [userInfo valueForKey:@"aps"]; NSLog(@"%@", [aps valueForKey:@"alert"]);
NSString *alert = [aps valueForKey:@"alert"]; NSString *badge = [aps objectForKey:@"badge"];
NSLog(@"Received Push Badge: %@", badge);
NSString *customKey = [aps objectForKey:@"custom_key"];
NSLog(@"%@", customKey);
application.applicationIconBadgeNumber = [[aps objectForKey:@"badge"] integerValue];
if ([customKey isEqualToString:@"ATTEND"]){
[self.viewController switchTab:0];
}else if ([customKey isEqualToString:@"NOTIFY"]){
[self.viewController switchTab:1];
}
[SimpleAlertView showSimpleAlert:self TitleText:@"알림" MessageText:alert]; }
어플이 실행중이 아닐때 알림이 올경우
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
self.myDeviceToken = [NSMutableData data];
// 어플은 APNS에 등록을 시도하는데, 알림 방식을 지정 (배지, 소리, 경고)
[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
// 배지 개수 재설정
application.applicationIconBadgeNumber = 0;
NSDictionary *notification = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
NSLog(@"%@", [notification valueForKey:@"custom"]); ...
}
No. | Category | Subject | Author | Date | Views |
---|---|---|---|---|---|
277 | Develop |
[js] 네이버, 다음의 플레이어 스킨
![]() |
hooni | 2013.04.23 | 6975 |
276 | Develop | 라이브러리에 대한 설명 (static & dynamic library) | hooni | 2013.04.23 | 6969 |
275 | Develop | [c] 단기과정[01/06] sizeof, 실수표현, 메모리, 연산자 | hooni | 2003.04.23 | 6963 |
274 | Develop |
[php] 빔 프로젝터 예약 프로그램.. ㅋㅋ
![]() |
hooni | 2013.04.23 | 6962 |
273 | Develop |
[c] 도메인(호스트)으로 IP정보 알아오기.. (nslookup과 비슷)
![]() |
hooni | 2013.04.23 | 6958 |
272 | Develop | [js] php의 number_format() 함수와 같은.. ㅋㅋ | hooni | 2013.04.23 | 6957 |
271 | Develop |
[c] 숫자 맞추는 게임..
![]() |
hooni | 2013.04.23 | 6954 |
270 | Develop | [c] 소켓의 세가지 동작모드 | hooni | 2003.04.23 | 6948 |
269 | Develop |
[c] 프로세스 정보 출력하기..
![]() |
hooni | 2003.04.23 | 6939 |
268 | Develop |
[c] 단기과정[01/10] 과제.. swap(any data, ..)
![]() |
hooni | 2003.04.23 | 6936 |
267 | Develop | [c] 프로세스간의 통신(파이프) | hooni | 2003.04.23 | 6921 |
266 | Develop |
[c] 맵서치인 듯(옛날 컴에서 찾은 자료)
![]() |
hooni | 2013.04.23 | 6920 |