我正在尝试向我的iPhone(APNS)发送推送通知。我读了这个post并尝试实现它。所以我所有的证书都很好(正常)。
现在我有了这个PHP脚本:
$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);
当我运行此脚本时,没有任何事情发生。没有错误只是一个空页面,但我的iPhone没有收到推送通知......
你有个主意吗?
非常感谢!
答案 0 :(得分:6)
设备令牌中没有空格,剥离它们
答案 1 :(得分:4)
对于开发证书,您需要网址
'ssl://gateway.sandbox.push.apple.com:2195'但是为了生产
'ssl://gateway.push.apple.com:2195'
答案 2 :(得分:3)
从令牌中删除空格,即使这样它也不起作用
$apnsHost = 'gateway.sandbox.push.apple.com';
从此网址中删除“沙盒”,它将会运行。
答案 3 :(得分:2)
如果您有多个设备并且循环浏览它们,我发现您必须为每个fwrite创建一个新的stream_context_create,以防止Apple关闭连接以获取错误令牌。
FYI
答案 4 :(得分:1)
要完全发送通知成功,您还需要做一件事。
替换 $ output = json_encode($ payload);
到 $ payload = json_encode($ payload);
答案 5 :(得分:-1)
您缺少provice证书私钥。添加此行: stream_context_set_option($ streamContext,'ssl','passphrase',$ certificatePrivateKey);