Push Service 만들기- 3.Push Provider 예제
개발 환경은 CentOS(OpenSSL 설치), PHP 가지고 구성하였습니다.
1. 등록된 인증서를 내보내기를 통해서 화일로 변경합니다.
보내기를 클릭하면 하단의 팝업창이 뜹니다. 인증서는 => cert.p12 , 개인키는 => key.p12 로 저장합니다. ( 다른 이름으로 저장하셔도 됩니다. )
보내기시에 암호를 입력하라는 메시지가 출력 됩니다. 각각 암호를 입력하시면 됩니다.
2. 두개의 파일을 서버에 전송하고 하단의 명령어를 수행합니다.
penssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
openssl pkcs12 -nocerts -out key.pem -in key.p12
openssl rsa -in key.pem -out noenc.pem
cat cert.pem noenc.pem > dev.pem
명령어를 수행시키면 1번에 입력한 암호를 물어보는데 그때 입력하시면 됩니다.
3. send.php를 만든다.
#!/PHP설치위치/php -q
<?php
// 먼저 푸쉬를 넣을 때 표시할 문구와 기본적인 푸쉬 요소를 입력한다.
$payload = array();
$payload['aps'] = array('alert' => 'TEST', 'badge' => 1, 'sound' => 'default');
//alert은 푸쉬가 도착했을 때 표시할 문구이고 badge는 푸쉬가 도착했을 때 아이콘에 표시할 뱃지 수이고
//sound는 푸쉬가 도착했을 때 알림 소리이다.
//이제 이 것을 JSON문법 형태로 고쳐야 한다.
$push = json_encode($payload);
//아주 간단하다. 만약 변환된 형태가 궁금하다면 최상단의 링크를 참조하시라.
//만약 푸쉬를 통해서 앱으로 추가적인 정보를 전달해야 한다면 JSON으로 변환 전 추가적인 작업을 하자.
//$payload['extra_info'] = array('name' => 'aaa', 'blog' => 'URL');
//이런식으로 하면 푸쉬가 도착했을 때 앱에서 추가적으로 자료를 활용할 수 있다.
//이제 아까 만들었던 pem파일을 써먹을 차례다. 경로를 입력하자.
//만약 작성중인 php 파일과 같은 경로에 있다면
$apnsCert = 'dev.pem'; // <- 2번에 만든 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);
//마지막으로 썼던 것은 스스로 정리하자.
fclose($apns);
?>
4. send.php 수행한다.
#./send.php
이상입니다. 해당 PHP소스는 다른사이트에서 복사한건데 원천을 찾을수가 없었습니다. 저자분한테 죄송합니다. ^^
다른 방법은 구글의 ApnsPHP사용하는 방법입니다. 이것은 추후에 설명하도록 하겠습니다.