이 과정은 Development Test 버전입니다.
- 배포 버전도 이와 동일하다 보시면 됩니다.
PHP Version - http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/
Mac Version - http://mobiforge.com/developing/story/programming-apple-push-notification-services
Python Version - http://code.google.com/p/apns-python-wrapper/
User Blog
- http://mskyt.tistory.com/42#recentTrackback
- http://www.macoscoders.com/2009/05/17/iphone-apple-push-notification-service-apns/comment-page-1/
------------------------- 여기까지가 제공 자료들이다. 아래의 내용은 본좌가 테스트 해보고 작성 한 것이다.
키 체인 어플에서 ADP Services의 인증서와 개인키 인증서를 cert.p12, key.p12파일로 저장한다.
인증서를 우리가 사용할 써드 파티 서버에 업로드해서 APN서버와 통신하게 해 줘야 ㅎ되는데, 통신에 앞서서
다음 인증서를 애플과 통신할 수 있는 포멧으로 변환 해줘야 한다.
PEM format(privacy Enhanced Mail Sercurity Certificate)이라는 형태로 전환해 줘야 하며 이 작업은 터미널에서 진행한다.
> openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
> openssl pkcs12 -nocerts -out key.pem -in key.p12
다음 과정을 거치면 PEM 형식의 인증서와, 개인키가 발급된다.
써드파트 서버에서 푸쉬를 보낼 때 푸쉬 인증서를 개인키와 비교해서 올바른 사용자인지 구분하는 과정을 거쳐줘야 되는데,
매번 개인키를 통해서 인증하는 과정이 번거롭기 때문에, 인증서와 개인키를 합치는 과정을 진행 해야 한다.
> openssl rsa -in key.pem -out key.unencrypted.pem
> cat cert.pem key.unencrypted.pem > ck.pem
다음 과정을 통해 APN서버와 통신 할 수 있는 Ck.pem 인증서가 생성된다.
다음 파일을 써드파티로 이요할 웹서버에 업로드 하고 읽기권한을 주면 되겠다.
APN서버로 푸쉬 메시지 요청은 SSL통해서 이뤄집니다.
(OS X에서 구축할 수 잇는 웹서버 MAMP는 SSL을 지원하지 않으며, XAMPP를 이용하여야 한다.)
출처 : 2. support 유저 블러그
// ----------------------------
import socket, ssl, json, struct
# device token returned when the iPhone application
# registers to receive alerts
deviceToken = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX'
thePayLoad = {
'aps': {
'alert':'Oh no! Server\'s Down!',
'badge':42,
},
'test_data': { 'foo': 'bar' },
}
# Certificate issued by apple and converted to .pem format with openSSL
theCertfile = 'cert.pem'
# 개발용 PNS 서버 (애플 제공)
theHost = ( 'gateway.sandbox.push.apple.com', 2195 )
data = json.dumps( thePayLoad )
# Clear out spaces in the device token and convert to hex
byteToken = deviceToken.replace(' ','').decode('hex')
theFormat = '!BH32sH%ds' % len(data)
theNotification = struct.pack( theFormat, 0, 32, byteToken, len(data), data )
# Create our connection using the certfile saved locally
ssl_sock = ssl.wrap_socket( socket.socket( socket.AF_INET, socket.SOCK_STREAM ), certfile = theCertfile )
ssl_sock.connect( theHost )
# Write out our data
ssl_sock.write( theNotification )
# Close the connection -- apple would prefer that we keep
# a connection open and push data as needed.
ssl_sock.close()
// ----------------------------
[ register 실패 해결책 ]
1.
error name :
해결책 : 프로파일을 확인 할 것.