Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apple Push Notification Service with PHP Script

I'm trying so send push notifications ton my iPhone (APNS). I read this post and try to implement it. So all my certificates are good (normaly).

Now I have this php script :

$device = '4f30e047 c8c05db9 3fa87e7d ca5325f7 738cb2c0 0b4a02d4 d4329a42 a7128173'; // My iphone deviceToken
$payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default');
$payload['server'] = array('serverId' => $serverId, 'name' => $name);
$output = json_encode($payload);

$apnsCert = 'apple_push_notification_production.pem';

$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, 2, STREAM_CLIENT_CONNECT, $streamContext);

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload;
fwrite($apns, $apnsMessage);

//socket_close($apns); seems to be wrong here ...
fclose($apns);

When I run this script nothing happen. no error just an empty page but my iPhone doesn't receive the push notification ...

Have you got an idea?

Thanks a lot !

like image 515
Pierre Avatar asked Oct 08 '10 13:10

Pierre


5 Answers

no space in device token, strip them

like image 134
Medhi Naitmazi Avatar answered Nov 13 '22 23:11

Medhi Naitmazi


For development certificate you need url

'ssl://gateway.sandbox.push.apple.com:2195'
but for production
'ssl://gateway.push.apple.com:2195'
like image 34
andrew92b Avatar answered Nov 13 '22 23:11

andrew92b


Strip the spaces from token and even then it's not work then

$apnsHost = 'gateway.sandbox.push.apple.com';

Remove "sandbox" from this url and it will run.

like image 21
sandeepKumar Avatar answered Nov 13 '22 23:11

sandeepKumar


If you have more than one device and you loop through them I found that you have to create a new stream_context_create for each fwrite to prevent apple from closing the connection for a bad token.

FYI

like image 2
DigiMee Avatar answered Nov 13 '22 23:11

DigiMee


To send notifications success fully you have to do 1 more thing.

Replace $output = json_encode($payload);

to $payload = json_encode($payload);

like image 1
tv.ashvin Avatar answered Nov 13 '22 22:11

tv.ashvin