My app is still in development and I used this tutorial to send iOS Push Notifications using PHP and SSL.
http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
It was working but it was recently depreciated because Apple recently decided to drop SSL immediately affecting all apps in development and apps in production have until October 29th to change their code.
I would like to know how to do the same thing using TLS instead of SSL.
Here is what my php that used to work looks like:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
I tried adding an Entrust certificate as Apple suggests:
$ctx = stream_context_create();
stream_context_set_option($ctx, 'tls', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'tls', 'passphrase', $passphrase);
stream_context_set_option($ctx, 'tls', 'cafile', 'entrust_2048_ca.cer');
$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
But it still doesn't work. Do you have any suggestion to fix it?
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
$fp = stream_socket_client('tls://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if you work in a localhost environment don't forget download the certification file entrust_2048_ca.cer
<?php
$message = 'aa_' . rand(10000,99999);
$deviceToken = array(
'xxxxxx'
);
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'passphrase', '111111');
stream_context_set_option($ctx, "ssl", "local_cert", './apns.pem');
$fp = NULL;
$errno = NULL;
$errstr = NULL;
$fp = stream_socket_client("tls://gateway.sandbox.push.apple.com:2195", $errno, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if($fp === FALSE){
exit('error message');
}
$content = array("aps" => array("alert" => $message, "badge" => 4, "sound" => 'default', "code" => 200));
$data = json_encode($content);
foreach ($deviceToken as $token) {
$msg = chr(0) . pack("n", 32) . pack("H*", $token) . pack("n", strlen($data)) . $data;
fwrite($fp, $msg);
fflush($fp);
}
fclose($fp);
Here are a few tips that should can help you figure out:
Go to entrust.net/downloads/root_request.cfm and download entrust_2048_ca.cer
Add following code:
stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
Make sure if path is right: '../folder/file/ck.pem' ?
Switch and try both the sandbox and live ssl links.
Switch dev and production pem and try both.