来自服务器的 Apple 推送通知

Posted

技术标签:

【中文标题】来自服务器的 Apple 推送通知【英文标题】:Apple Push Notification from Server 【发布时间】:2012-04-24 08:36:17 【问题描述】:

我已关注: Apple Push Notification Services Tutorial。 它在本地对我有用。 接下来,我想从我的服务器发送推送通知?

我已将simplepush.phpck.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 推送通知服务器)的反馈服务

APNS Apple 推送通知服务未收到来自 Apple 的成功消息

来自 WebApi 应用程序的 Apple 推送通知

在 Apple Watch 上接收来自 iCloud 的推送通知

我可以使用 Apple 的推送通知服务发送图像吗? [关闭]

Apple 推送通知服务是针对特定国家/地区的吗?