Contents

Develop
2013.06.27 10:46

[ios] PHP로 APNS 프로바이더~

조회 수 16836 댓글 0
Atachment
첨부 '6'
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

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 고유번호

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

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

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


1.gif  


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

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

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

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

4.png  

이제 이 인증서를 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파일이 생성된 것을 알 수 있다.

5.png  

6.png  

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

서버에 올릴 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





?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
777 Develop [ios] 최신 UI 모음.. (나중에 정리할 것) secret hooni 2013.08.09 0
776 Develop [ios] UI컨트롤러 샘플코드 hooni 2013.08.08 15424
775 Develop [ios] libxml/tree.h file not found file hooni 2013.08.08 18708
774 Develop [ios] 소소한 팁 (Rect,Point,Path,URL 등) hooni 2013.08.08 29456
773 Develop [ios] Background 에서 네트워크 사용 file hooni 2013.07.22 11509
772 Develop [ios] App States file hooni 2013.07.22 13193
771 Etc 영어의 12 시제 (The twelve tenses of English) hooni 2013.07.12 15697
770 System/OS [mac] 컨텍스트(Context) 메뉴 "다음으로 열기" 내용 정리 hooni 2013.07.10 18796
769 Develop git 브런치 배우기 (링크) hooni 2013.07.09 20569
768 Develop GCM 사용하기 3 (JSP로 GCM 푸시 서버 만들기) 4 file hooni 2013.07.06 25314
767 Develop GCM 사용하기 2 (단말에 GCM 구현하기) file hooni 2013.07.06 23248
766 Develop [android] GCM 사용하기 1 (GCM 서비스 신청하기) file hooni 2013.07.06 51355
Board Pagination Prev 1 ... 29 30 31 32 33 34 35 36 37 38 ... 98 Next
/ 98