티스토리 뷰

Language/PHP

PHP로 APNS 구현하기

out of coding 2018. 5. 5. 13:06

다른 분들은 Java에서 구현하는게 더 편하고 좋다고 하는데 저는 그냥 PHP가 더 좋은것 같습니다.

그냥 이유가 없네요 ㅎㅎ


일단 라이브러리를 사용하면 아주 편리하게 만들수 있습니다.

아무것도 할 필요가 없죠.

그렇지만 우리가 라이브러리에 의존만 한다면 좋은 개발자가 될수가 없겠죠.

돌아가는 구조나 어떠한 원리에 의해서 동작하는지도 알아야 좋은 개발자라 생각합니다.

라이브러리 가져다 쓰는건 그 이후에...


라이브러리를 찾아오셨다면 이것을 이용하시기 바랍니다.


https://github.com/jwage/php-apns


솔찍히 내부를 보니 제가 적을 글이랑 동일하게 소스가 되어 있네요.


1. pem 파일 만들기


키체인 접근을 열어서 애플 개발자 사이트에서 받아서 사용하는 Push 인증서를 이용하여야 합니다.

이 글에서는 이것을 만드는 법은 따로 다루지 않겠습니다.

p12 로 내보내기를 하면 되는 부분입니다.


인증서와 키를 따로 따로 내보내기를 하여 주면 됩니다.


apns-dev-cert.p12 , apns-dev-key.p12 이런식으로 저장을 하여 주고요.


다음과 같이하여 pem파일을 만들어 줍니다.


1
2
$ openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
$ openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
cs


passphrease를 개인키에서 제거하여 줍니다.


1
$ openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
cs


마지막으로 두개의 파일을 하나로 만들어 줍니다.


1
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
cs


2. PHP 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
function address($isSandBox) {
    if ($isSandBox) {
        return 'ssl://gateway.sandbox.push.apple.com:2195'
    } else {
        return 'ssl://gateway.push.apple.com:2195'
    }
}
 
$deviceToken = '123456...fas123'// 디바이스토큰ID
$address = address(true)
$apnsCert = $isSandBox ? 'apns-dev.pem' : 'apns-production.pem';
 
$message = 'Hello, APNS!'// 전송할 메시지
$payload = array('aps' => array('alert' => $message'badge' => 0'sound' => 'default')); // 이전 규격으로 Title이 전송되지 않음
$payload = json_encode($payload);
 
$streamContext = stream_context_create();
stream_context_set_option($streamContext'ssl''local_cert'$apnsCert);
 
$apns = stream_socket_client(address, $error$errorString2, STREAM_CLIENT_CONNECT, $streamContext);
 
if($apns) {
  $apnsMessage = chr(0).chr(0).chr(32).pack('H*', str_replace(' '''$deviceToken)).chr(0).chr(strlen($payload)).$payload;
  fwrite($apns$apnsMessage);
  fclose($apns);
}
?>
cs


이전 규격인 Title이 들어가 있지 않은 형태로 전송이 됩니다.


payload 규격은 다음에서 확인하시기 바랍니다.


참고로 alert안의 title 규격은 iOS 8.2부터 시작이 되었습니다.


https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/PayloadKeyReference.html

'Language > PHP' 카테고리의 다른 글

PHP. Router 만들기  (0) 2020.08.08
php. redirection 리다이렉션 만들기  (0) 2020.03.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함