본문 바로가기
프로그래밍/iOS

PHP로 구현하는 APNS (아이폰 푸쉬 서비스)

by 백룡화검 2011. 7. 4.

처음 푸쉬를 구현하려고 자료를 찾을 때 보노님 포스트에서 PHP로 구현하는 법은 인터넷에 많다시며

JAVA로 포스팅한 것을 보았다.

하지만 난 찾을 수 없었다 -_-;

넘흐넘흐 어려웠다! 나름 키워드 선택력이 탁월하다 생각한 본인인데!!!

자 그럼 거두절미하고 차근차근 따라가보자.

우선 여러분께 알려드릴 포스트가 있다.


Boxed Ice라는 블로그에 David Mytton이라는 필명을 쓰신 분께서 포스팅한

How to build an Apple Push Notification provider server (tutorial)

사실 위 포스팅이면 무리 없이 구현 가능하다고 본다... 만!!!

약간 쉬운 방법과 함께, 사실 우린 한글을 좋아한다 ㅡ,.ㅡ!


우선 iOS의 푸쉬 기능을 사용하려면 개발자 등록이 필요하다! 라는건 당연한거고;

개발자 계정에 보면 App ID가 있다.

여기서 푸쉬를 위한 인증서를 등록하고 생성해서 다운로드 받을 수 있다.

자세한 내용은 다른 포스트를 찾으면 금방 알 수 있다...지만

친절하게 하나 링크하고자 한다.

"4. 운영서버 설정하기" 항목부터는 보노님의 포스트의 경우 JAVA를 이용하니

PHP로 운영하시는 분들은 다시 본인의 포스트로 돌아오시길 바란다.

보노님께서 포스팅한

애플 아이폰 푸시알림 서비스 (APNS, Apple Push Notification Service)

위 포스트에선 아주 친절하게 푸쉬 서비스 구현에 대한 전반적인 과정을 설명하고 있다.


자 이제 서버 작업을 위한 준비를 해보자.

보노님의 포스트에서 운영서버 설정하기 항목을 잠깐 구경하신 분들이 있는지 모르겠다.

우리도 여기서부터 출발한다.

우선 키체인 접근을 연다.

좌측 상단의 [키체인] 항목은 "로그인"으로 하고 좌측 하단의 [카테고리] 항목은 "인증서" 로 하자.

그럼 각 인증서와 키가 짝이 맞춰져 나올 것이다.

그 중 자신이 발급받아 추가한 푸쉬 인증서를 찾아보자.

개발용 푸쉬 인증서를 발급받았다면

Apple Development Push Services:고유번호:App ID 고유번호

이런식으로 써있을 것이다.

앞에 ▶ 삼각형을 클릭하면 밑으로 개인 키가 하나 딸려 나올 것이다.

이 둘을 동시에 선택하고 팝업 메뉴에서 보내기를 누른다.


이 때, 암호를 입력하라고 하는데 입력하지 말자.

두 번째로 입력하라는 암호는 자신의 OSX 관리자 비밀번호이니 입력하도록 한다.



자, 그러면 자신이 저장한 경로에 p12파일이 저장되어 있을 것이다.

이 것을 자신의 폴더로 가져오자.

이제 이 인증서를 pem파일로 변환하고자 한다.

우리는 이를 위해 /Applications/Utilities/Terminal 즉, 터미널 유틸리티를 실행시켜야 겠다.

프롬트에 다음의 명령어를 실행시키자.

openssl pkcs12 -in [p12 파일명] -out [pem 파일명] -nodes -clcerts

예를 들면

openssl pkcs12 -in apns_cert.p12 -out apns_for_dev.pem -nodes -clcerts

그럼 비밀번호를 입력하라는 문구가 나온다.

없이 엔터를 누르자.

그럼 pem파일이 생성된 것을 알 수 있다.




자 이제 서버 작업을 시작하자.

서버에 올릴 php파일을 작성하자.


<?php

// 먼저 푸쉬를 넣을 때 표시할 문구와 기본적인 푸쉬 요소를 입력한다.

$payload = array();

$payload['aps'] = array('alert' => '푸쉬가 간다!', 'badge' => 0, 'sound' => 'default');

//alert은 푸쉬가 도착했을 때 표시할 문구이고 badge는 푸쉬가 도착했을 때 아이콘에 표시할 뱃지 수이고

//sound는 푸쉬가 도착했을 때 알림 소리이다.

//이제 이 것을 JSON문법 형태로 고쳐야 한다.

$push = json_encode($payload);

//아주 간단하다. 만약 변환된 형태가 궁금하다면 최상단의 링크를 참조하시라.

//만약 푸쉬를 통해서 앱으로 추가적인 정보를 전달해야 한다면 JSON으로 변환 전 추가적인 작업을 하자.

//$payload['extra_info'] = array('name' => 'Lifeclue', 'blog' => 'http://blog.naver.com/legendx');

//이런식으로 하면 푸쉬가 도착했을 때 앱에서 추가적으로 자료를 활용할 수 있다.

//이제 아까 만들었던 pem파일을 써먹을 차례다. 경로를 입력하자.

//만약 작성중인 php 파일과 같은 경로에 있다면

$apnsCert = './apns_for_dev.pem';

//그리고 애플의 푸쉬서버와 통신할 stream context를 작성한다.

$streamContext = stream_context_create();

stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);

//그대로 갖다 붙이면 된다;

//이제 애플의 푸쉬 서버에 연결해보자.

$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext);

//만약 앱을 배포할 때에는 애플 프로비저닝 포털의 App ID에서 개발용이 아닌 배포용 푸쉬 인증서를 받으신 후

//키체인에서 다시 인증서와 키를 추출한 후에 pem으로 돌리고 서버에 올리신 후 위에 있는 $apnsCert 변수의

//파일명을 바꿔주시면 되며, 바로 이 위에 있는 $apns변수의 주소에서 sandbox를 빼주시면 된다.

//ssl://gateway.push.apple.com

if (!$apns) {

print "Failed to connect $error $errorString\n";

return;

//만약 요청에 실패하면 Failed to connect가 브라우저에 뜰 것이다.

//자, 이제 드디어 푸쉬를 넣을 차례다!

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', "[Device Token]")) . chr(0) . chr(strlen($push)) . $push;

$writeResult = fwrite($apns, $apnsMessage);

//마지막으로 썼던 것은 스스로 정리하자.

socket_close($apns);

fclose($apns);

?>

수정이 필요한 부분은 따로 강조해두었으니 (자주색)

소스를 이해하고 필요한 부분만 수정하여 쓰도록 하자.

참고로 기기의 토큰이 필요하므로

HTTP POST로 토큰을 받아 써야할 것이다.

이제 php문서를 서버에서 실행하는 순간 기기로 푸쉬가 갈 것이다.


이로서 php를 이용한 iOS 푸쉬 서비스 구현에 대해 알아보았다.

이 외에 feedback도 있고 기타 등등이 있지만

우선 급한불부터 끄자는 심정으로 푸쉬 넣는 부분을 다뤄보았다.

아마도 위의 두 링크만 봐도 충분히 구현이 가능할 것이라 의심치 않는다.


본 포스트의 핵심은 openssl을 사용하여 p12를 pem으로 바꾸고, php를 돌렸을 때

Failed to connect가 뜨지 않아야 한다는 것이다.

인증서가 잘못되면 백방 푸쉬 서버와 연결되지 않는다.


2011.04.22 Update

 - 배포용 설정법을 추가하였습니다.


Q&A: lifeclue@nate.com

출처 : http://blog.naver.com/legendx?Redirect=Log&logNo=40126083456