向多个设备发送推送通知:一段时间后 APNS 响应是不是定的

Posted

技术标签:

【中文标题】向多个设备发送推送通知:一段时间后 APNS 响应是不是定的【英文标题】:Send Push Notification to Multiple Devices: APNS response is negative after a while向多个设备发送推送通知:一段时间后 APNS 响应是否定的 【发布时间】:2012-10-03 12:30:03 【问题描述】:

我正在尝试为多个设备发送通知。所以我得到一个数组的令牌,打开连接,循环发送通知,关闭连接。

但是,在 9-10 个设备之后,它会停止发送。我相信苹果会以某种方式断开连接。

这是我的代码:

$message = 'Push';
$passphrase = 'mypass';
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'MyPemFile.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
$fp = stream_socket_client(
    'ssl://gateway.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 Apple service. ' . PHP_EOL;

// Encode the payload as JSON
$body['aps'] = array(
    'alert' => $message,
    'sound' => 'default'
    );
$payload = json_encode($body);

$result = 'Start'.PHP_EOL;
$tokenArray = array('mytoken');
foreach ($tokenArray as $item)

// Build the binary notification
$msg = chr(0).pack('n', 32).pack('H*', $item).pack('n', strlen($payload)).$payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
    echo 'Failed message'.PHP_EOL;
else
    echo 'Successful message'.PHP_EOL;

// Close the connection to the server
fclose($fp);

我的代码有问题吗?我想我需要打开一次连接,发送通知然后关闭。我应该用多个令牌做 fwrite() 吗?我不知道如何。任何想法或解决方案都被接受。

顺便说一句,答案是这样的:

Successful message  
Successful message  
Successful message  
Successful message  
Successful message  
Successful message  
Successful message  
Successful message  
Successful message  
Successful message
Failed message
Failed message
Failed message
Failed message
Failed message
...
Failed message

P.S.我遇到了相同代码的字符问题,但在 another question 中已解决,这是另一个问题,不是重复的。

【问题讨论】:

【参考方案1】:

第一条失败的消息可能有问题,此时 Apple 将关闭连接以向您发出存在问题的信号。如果您使用的是增强格式,您有机会在 Apple 关闭连接之前获得一些反馈,以查看您发送的通知有什么问题。发生这种情况后,您必须重新建立连接以发送更多消息。

它可能失败的原因有很多。您可能发送了无效的设备令牌,您的有效负载可能无效或长度错误等。

最好查看 APNS 的文档:http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html

【讨论】:

我不认为这与无效令牌有关,因为我仅通过应用程序获取令牌。不过我也查了。我想知道的是,如果循环有什么问题。如果我关闭连接并为每 10 个令牌重新打开它会改变吗? Apple 希望您尽可能长时间地保持连接打开(很烦人,因为他们会在出现错误时关闭它)。您的通知有问题导致苹果关闭连接。为什么不试试增强格式协议呢?或者更好的是,试试 APNS-PHP code.google.com/p/apns-php 之类的现有库,看看有什么问题? 我认为这是真的,如果我将我的有效令牌作为我的数据库中的第一个条目,它会交付,但如果我将我的令牌移动到第二个或任何其他位置,其中一个无效令牌作为第一个条目,我从来没有收到通知。 @Redth,请检查这个问题:***.com/questions/45647651/…

以上是关于向多个设备发送推送通知:一段时间后 APNS 响应是不是定的的主要内容,如果未能解决你的问题,请参考以下文章

GCM 和 WNS 禁止向非活动设备发送推送通知的策略

无法通过 APNS 向设备发送 MDM 推送通知。

设备离线时,apns 丢弃了旧的推送通知

FCM 是直接发送推送通知还是向 APNS 发送消息?

我可以使用 APNS Dev iOS 证书向其他设备发送推送通知吗?

如何测试 sns APNS 推送通知到单个设备