본문 바로가기
Programming/java

[PUSH] iOS 푸쉬 서비스

by 막이 2013. 3. 20.

1. Push Service 란?
서버에서 아이폰 애플리케이션으로 데이터를 역으로 전송할 수 있는 서비스이다.
Remote Notification을 등록하고 수신하는 애플리케이션과 푸시 서비스를 제공하는 APNS(Apple Push Notification Service),
APNS에 데이터 푸시요청을 수행할 수 있는 권한을 획득한 Provider(서버) 로 구성된다.



"분실물 다나와" 프로젝트로 예를 들면...Provider는 "분실물 다나와" 서버가 되고, Client App 은 "분실물 다나와" 아이폰 앱,
APNS는 애플에서 제공하는 푸시서버가 된다. iPhone에 전송된 푸시메시지는 iOS 를 거쳐 실제 앱에 전달된다.




2. Push 서비스 사용절차
APNS는 실제 아이폰 기기로 푸시를 전송해주는 애플측에서 제공하는 서비스이다. 푸시서비스를 이용하는 서버인 Provider는
푸시할 데이터만을 가공하여 APNS에 푸시를 요청한다. Provider가 APNS에 접속하여 푸시데이터를 전송하려 할 때, APNS는
푸시요청을 할수 있는 권한을 SSL 인증을 통해 검사하게 된다. 그래서 Provider는 사전에 이 인증을 위한 암호화 파일을 사전에
가지고 있어야 한다.


① 개발자 포탈에서 애플리케이션에 대한 Push Serivce 사용권한 받기
개발자 포탈에서 App Id에 대한 Development 또는 Product 푸시 서비스 옵션을 enable 시키고, 다운받은 인증파일을 KeyCain에
등록시킨다. 이 파일을 p12 파일로 export 하여, 파일, 비밀번호와 함께 Provider 에게 사전에 전달해야 한다.


② 아이폰 애플리케이션 실행시 APNS에 RemoteNotification 등록
아이폰 애플리케이션이 처음 구동시 APNS에 RemoteNotification 을 등록하고, 애플리케이션 DeviceToken을 수신받는다.


③ Provider에게 DeviceToken 전송
DeviceToken을 수신하면, 서버에 아이폰 UUID와 함께 전달한다. 이 토큰은 APNS에서 아이폰의 애플리케이션을 식별하는 키
되기 때문에 Provider가 보유하고 있어야 하는 데이터이다. DeviceToken은 거의 변하지 않지만, 애플리케이션이 삭제되고 다시
설치될 때 변할 수도 있기 때문에 애플리케이션이 실행될 때마다, Provider에게 전송하여 갱신여부를 확인하는 것이 좋다. Development용과 Product용의 DeviceToken 값은 다르다는 것에 주의한다.




④ Provider 에서 푸시 메시지를 생성하여 APNS에 푸시 요청
Provider 에서는 ①단계에서 전달받은 인증파일을 보유하고 있고, 인증파일 비밀번호를 알고 있어야 한다.
DeviceToken와 함께 다음의 주소로 push를 요청할 수 있다. 개발환경과 실제 서비스를 위한 APNS 의 주소가 다르다.
개발환경 푸시서버 주소: gateway.sandbox.push.apple.com / 2195
제품환경 푸시서버 주소: gateway.push.apple.com / 2195



⑤ APNS 에 전송하는 메시지의 포맷
메시지는 JSON 포맷을 따르며 256바이트 이내야한다. 메시지를 구성하는 키는 다음과 같다.


단순한 메시지 포맷은 위와 같으며, 좀더 세부적으로 메시지를 지정할 수도 있다. 더 자세한 사항은
Local, Remote Notification Programming Guide 를 참고하자.

JSON 형태로 생성된 메시지 형태는 다음과 같다.
1
{"aps":{"sound":"default","alert":"My alert message","badge":45}}


⑥ APNS에 푸시 요청하기
Provider는 APNS가 요구하는 프로토콜을 따라 데이터를 전송해야 한다. 프로토콜은 APNS에 전송하는 Push 메시지 포맷을
참고하자. 이 메시지 포맷과 APNS 의 요구사항에 맞게 구현한 javapns라는 오픈소스 라이브러리를 사용하여 APNS에 푸시를
요청해보자

javapns를 사용하기 위해서 아래의 의존 라이브러리를 가지고 있어야한다.
commons-lang-2.4.jar // String클래스 등의 유틸리티 기능을 제
commons-io-1.4.ja
bcprov-jdk16-145.jar // Bouncy Castle 단체의 암호화 관련 api
log4j-1.2.15.ja

javapns 오픈소스 라이브러리 : http://code.google.com/p/javapns/
Legion of the Bouncy Castle 사이트 : http://www.bouncycastle.org/java.html