[Appspresso] - IOS APNS to PHP 아이폰 APNS PHP (펌)

Appspresso 2012. 11. 13. 09:34
반응형

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

그러한 즉, 보노님의 포스트를 쭉 따라하신 후 "4. 운영서버 설정하기" 라는 타이틀을

만나셨다면 다시 이 곳으로 돌아오셔야 한다는 말이다.

보노님께서 포스팅한

애플 아이폰 푸시알림 서비스 (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);

?>

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

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


혹시 전송시 한글이 깨진다면 우선, 파일을 UTF-8 인코딩으로 저장하여보자.

그래도 안된다면 iconv("EUC-KR", "UTF-8", 한글 문자열); 을 사용해보자.

iconv는 인코딩을 변환해주는 메서드로

첫 번째 인자가 입력되는 문자열이 현재 어떤 인코딩 방식인지,

두 번재 인자는 출력할 문자열을 어떤 인코딩 방식으로 인코딩 할건지,

세 번째 인자는 변환할 문자열 또는 문자열 변수다.

서버 설정이 EUC-KR이고 아이폰으로 보낼 때 한글이 깨진다면 위와 같이 하면 되겠다.

이를 적용할 곳은 위 소스 중 payload 부분이며, 예제는 다음과 같다.

$payload['aps'] = array('alert' => iconv("EUC-KR", "UTF-8", '푸쉬가 간다'), 'badge' => 0, 'sound' => 'default');

// 본 팁은 wingon2님의 피드백 덕분에 작성되었다.

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

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/PostView.nhn?blogId=legendx&logNo=40126083456

반응형
: