Test server for Apple push notification and feedback integration
April 20, 2013 1 Comment
Here is a test server that you can use to verify your integration to Apple Push notification service and push notification feedback server. It should be good enough for testing out your application behavior and pdu format. Server helps you to get more debug info than just connecting directly to apple.
See these blog posts on details how to send push notifications
- Apple Push Notifications with Haskell
- Polling Apple Push Notification feedback service with Node.js
- Apple Push Notifications with Go language
- Apple Push Notifications with Erlang
- Apple Push Notifications with Node.js
Test server runs under node.js and listens both SSL and plain ports where your application can connect. Get code from Github and generate the SSL keys (see quick howto in cert-howto.txt) and start up server
$ node server.js Waiting for connections in ports Listening feedback port 2296 Listening feedback port 2196 SSL Listening push port 2295 Listening push port 2195 SSL
Note that you may need to install binary module to run the server. Use npm install binary
.
Successful push notification sending should look like following. The server dumps the data from your app in binary format for debugging and tries to parse it as Push PDU. Server prints out the fields so you can verify the data.
Accepted push connection 2195 1 SSL === RECEIVED DATA (1) ==== 00000000: 0100 0000 0151 7261 1d00 206b 4628 de93 .....Qra...kF(^. 00000010: 17c8 0edd 1c79 1640 b58f dfc4 6d21 d0d2 .H.].y.@5._Dm!PR 00000020: d135 1687 239c 44d8 e30a b100 1e7b 2261 Q5..#.DXc.1..{"a 00000030: 7073 223a 7b22 616c 6572 7422 3a22 4865 ps":{"alert":"He 00000040: 6c6c 6f20 5075 7368 227d 7d llo.Push"}} === PDU ==== { command: 1, pduid: 1, expiry: Sat Apr 20 2013 17:34:21 GMT+0800 (SGT), tokenlength: 32, token: '6B4628DE9317C80EDD1C791640B58FDFC46D21D0D2D1351687239C44D8E30AB1', payloadlength: 30, payload: { aps: { alert: 'Hello Push' } } }
Test server does not validate the data, but it tries to parse JSON message in push notifications and prints error if it fails. Also if command was not set to 1, it sends back error pdu and closes connection. This should be good enough for testing. For example here I made HTTP request to the server to get some error output.
Accepted push connection 2295 1 SSL === RECEIVED DATA (1) ==== 00000000: 4745 5420 2f20 4854 5450 2f31 2e31 0d0a GET./.HTTP/1.1.. 00000010: 5573 6572 2d41 6765 6e74 3a20 6375 726c User-Agent:.curl 00000020: 2f37 2e32 392e 300d 0a48 6f73 743a 206c /7.29.0..Host:.l 00000030: 6f63 616c 686f 7374 3a32 3239 350d 0a41 ocalhost:2295..A 00000040: 6363 6570 743a 202a 2f2a 0d0a 0d0a ccept:.*/*.... === PDU ==== { command: 71, pduid: 1163141167, expiry: Sun Mar 01 1987 23:31:32 GMT+0800 (SGT), tokenlength: 20527, token: '312E310D0A557365722D4167656E743A206375726C2F372E32392E300D0A486F73743A206C6F63616C686F73743A323239350D0A4163636570743A202A2F2A0D0A0D0A', payloadlength: null, payload: 'ERROR: INVALID JSON PAYLOAD [SyntaxError: Unexpected end of input]' } === SEND ERROR: 08014554202F Connection terminated 1
When your app connects successfully to the feedback test service, it sends back few feedback tokens and closes connection after one minute. Edit the actual tokens in the server source code.
Accepted feedback connection 2296 1 SEND: 2696A21000207518B1C2C7686D3B5DCAC8232313D5D0047CF0DC0ED5D753C017FFB64AD25B60 SEND: 2696A21100207518B1C2C7686D3B5DCAC8232313D5D0047CF0DC0ED5D753C017FFB64AD25B60 SEND: 2696A21100207518B1C2C7686D3B5DCAC8232313D5D0047CF0DC0ED5D753C017FFB64AD25B60
Source code is available in Github.
Can i load test my push console with this test server