[ios] PHP로 APNS 프로바이더~
첨부 '6' |
|
---|
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
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
417 | Develop |
[pdf] 포인터 문법 정리 (C pointer)
![]() |
hooni | 2013.04.23 | 7146 |
416 | Develop |
[js] 여러가지 트리(tree) 모음.. ㅋㅋ
![]() |
hooni | 2013.04.23 | 7138 |
415 | Develop | [c] 문자열 뒤집기 초간단 샘플 코드 ㅎㅎ | hooni | 2013.04.23 | 7136 |
414 | Develop | [c++] 인라인 함수에 대한 설명 | hooni | 2013.04.23 | 7134 |
413 | Develop |
[php] 초간단 웹 카운터..
![]() |
hooni | 2003.04.23 | 7129 |
412 | Develop |
[c] 베이지언(Bayesian) 패턴인식 과제 ㅋㅋ
![]() |
hooni | 2013.04.23 | 7119 |
411 | Develop |
[c] 테트리스3D (Tetris 3D)
![]() |
hooni | 2013.04.23 | 7117 |
410 | Develop |
[c] 단기과정[01/14] 피보나치, 파스칼.. 파일입출력
![]() |
hooni | 2003.04.23 | 7117 |
409 | Develop |
[js] 2차 잉여.. (Quadratic reciprocity) 계산..
![]() |
hooni | 2013.04.23 | 7099 |
408 | Develop |
[c] 구조체/파일 입출력 프로그램
![]() |
hooni | 2003.04.23 | 7088 |
407 | Develop |
[c++] mfc 기반 멀티수납(wall)시스템 소스와 실행파일
![]() |
hooni | 2013.04.23 | 7084 |
406 | Develop |
[c] 내가 만든 암호화 프로그램.. 좋아^^
![]() |
hooni | 2013.04.23 | 7084 |