PHP 中的推送通知
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11400556/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Push notification in PHP
提问by BigT
I get this error after trying to execute my php script to send a push notifcation to my iphone.
在尝试执行我的 php 脚本以向我的 iphone 发送推送通知后,我收到此错误。
I have tried everything and nothing works. I believe that this means my ck.pemis wrong but im not sure if its the key.pem or the cert.pem that is wrong.
我已经尝试了一切,但没有任何效果。我相信这意味着我ck.pem错了,但我不确定是 key.pem 还是 cert.pem 错了。
Please help
请帮忙
Script
脚本
// This this a fake device id:
$deviceToken = '9870h8v088bj29u080af894jj67klfgcv9mmm79k8e4l23456h908743n093e359';
// fake password:
$passphrase = '123456';
// Put your alert message here:
$message = 'New Message';
////////////////////////////////////////////////////////////////////////////////
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default',
'badge' => '1'
);
// Encode the payload as JSON
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
?>
Error
错误
Warning: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:
error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown in /Users/daveking/Desktop/App Certificates/simplepush.php on line 21
Warning: stream_socket_client(): Failed to enable crypto in /Users/daveking/Desktop/App Certificates/simplepush.php on line 21
Warning: stream_socket_client(): unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) in /Users/daveking/Desktop/App Certificates/simplepush.php on line 21
Failed to connect: 0
采纳答案by Jonathan Azulay
What have you tried exactly?
你究竟尝试了什么?
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12http://www.raywenderlich.com/3525/apple-push-notification-services-tutorial-part-2
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12 http://www.raywenderlich.com/3525/apple-push-notification-services-tutorial-part-2
This is a good tutorial on generating the certificate, making the php script etc.
这是一个关于生成证书、制作 php 脚本等的好教程。
回答by Gaurang P
A good link which describes the steps can be found under http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/
可以在http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/下找到描述这些步骤的良好链接
A good link to get your head around the certificate issues, check out Urban Airship:
了解证书问题的好链接,请查看 Urban Airship:
http://urbanairship.com/docs/keys.html
http://urbanairship.com/docs/keys.html
And regarding the approval, it's good to know:
关于批准,很高兴知道:
=>app signed with a dev cert = sandbox url & dev apns cert, app signed with
=>appstore/adhoc cert = prod url & prod apns cert
also using an adhoc/appstore app on a device that has previously used the dev app will cause springboard to crash. (so basically need two devices) (to be confirmed.)
在以前使用过开发应用程序的设备上使用临时/应用商店应用程序也会导致跳板崩溃。(所以基本上需要两个设备)(待确认。)
Important: you MUST keep the connection to the sandbox, i.e. you must NOT connect, send push, disconnect. If you do, Apple may throttle you as a possible ddos
重要提示:您必须保持与沙箱的连接,即您不得连接、发送推送、断开连接。如果你这样做,苹果可能会限制你作为一个可能的 ddos
A PHP example script to trigger a push notification from a server could look something like this:
从服务器触发推送通知的 PHP 示例脚本可能如下所示:
<?php
// from http://www.macoscoders.com/2009/05/17/iphone-apple-push-notification-service-apns/
// call: /apns/apns.php?message=Hello%20from%20macoscoders&badge=2&sound=received5.caf
$deviceToken = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
// Passphrase for the private key (ck.pem file)
// $pass = ;
// Get the parameters from http get or from command line
$message = $_GET['message'] or $message = $argv[1] or $message = 'Message sent ' . @date("H:i:s d/M/Y", mktime());
$badge = (int)$_GET['badge'] or $badge = (int)$argv[2] or $badge = 111;
$sound = $_GET['sound'] or $sound = $argv[3] or $sound = 'chime';
// Construct the notification payload
$body = array();
$body['aps'] = array('alert' => $message);
if ($badge)
$body['aps']['badge'] = $badge;
if ($sound)
$body['aps']['sound'] = $sound;
/* End of Configurable Items */
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'push/apns-dev.pem');
// assume the private key passphase was removed.
// stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
print "Failed to connect $err $errstr\n";
return;
} else {
print "Connection OK
";
}
$payload = json_encode($body);
// request one
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', , $deviceToken)) . pack("n",strlen($payload)) . $payload;
print "sending message :" . $payload . "\n";
fwrite($fp, $msg);
fclose($fp);
?>
回答by user3759306
Working code here :
工作代码在这里:
<?php
$deviceToken = '8845ba7c41e95e12caea6381ea6f01b5cd7b59a52feb9005e0727a65a4105dc2a0';
$passphrase = '';
$message = 'Your message';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
// Open a connection to the APNS server
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
$body['aps'] = array(
'alert' => array(
'body' => $message,
'action-loc-key' => 'Bango App',
),
'badge' => 2,
'sound' => 'oven.caf',
);
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
fclose($fp);
回答by Jonas Schnelli
You might also look into the EasyAPNS code.
您还可以查看EasyAPNS 代码。

![php 未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]](/res/img/loading.gif)