来自服务器的 Apple 推送通知
Posted
技术标签:
【中文标题】来自服务器的 Apple 推送通知【英文标题】:Apple Push Notification from Server 【发布时间】:2012-04-24 08:36:17 【问题描述】:我已关注: Apple Push Notification Services Tutorial。 它在本地对我有用。 接下来,我想从我的服务器发送推送通知?
我已将simplepush.php
和ck.pem
上传到我的服务器。当我检查http://www.myserver/simplepush.php
它给了我错误:
*警告:stream_socket_client() [function.stream-socket-client]:无法连接到 ssl://gateway.sandbox.push.apple.com:2195 (连接超时)在 /home/cherry/public_html/simplepush.php 上 第21行连接失败:110连接超时*
你能帮帮我吗?
PHP 代码:
<?php
// Put your device token here (without spaces):
$deviceToken = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
// Put your private key's passphrase here:
$passphrase = 'xxxxxxxxxx';
// Put your alert message here:
$message = 'My first push notification!';
////////////////////////////////////////////////////////////////////////////////
$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'
);
// 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);
【问题讨论】:
这不是一个真正的objective-c和xcode问题,顺便说一句:) 你找到了吗?我有完全相同的问题:/ 【参考方案1】:PHP 是否使用 SSL 编译?它与您的本地版本相同吗?
或者也许某种防火墙阻止了从您的服务器到 2195 端口的连接?
你能登录到这个服务器(某种shell)并检查你是否可以通过telnet连接到这个服务器和端口:
$ telnet gateway.sandbox.push.apple.com 2195
【讨论】:
正在尝试 XX.XXX.XXX.XX... 已连接到 gateway.sandbox.push-apple.com.akadns.net。转义字符是 '^] 这是我在检查 telnet 网关时从终端得到的答案。 好的,所以它不是阻塞端口。我会检查 PHP 是否编译了 ssl 支持。 我已经用我服务器中的 php 代码更新了这个问题。请检查这个。有什么需要我做的吗? 也许你可以添加一个简单的 phpinfo();调用您的 php 脚本并查看您的 php 版本中是否支持 SSL? php.net/manual/en/function.phpinfo.php 嗯...在这里查看这篇旧博客文章和这些 cmets:macoscoders.com/2009/05/17/… 您的证书可能有问题(可能它不包含私钥?或者您没有删除密码正确地从私钥?)以上是关于来自服务器的 Apple 推送通知的主要内容,如果未能解决你的问题,请参考以下文章
APNS Apple 推送通知服务未收到来自 Apple 的成功消息
在 Apple Watch 上接收来自 iCloud 的推送通知