我们已经工作了近一年的推送通知脚本突然停止工作。该脚本执行以下操作:
查询数据库以获取iPhone设备令牌列表
打开与Apple实时APNS服务器的SSL套接字连接
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
$fp = stream_socket_client($apnsHost, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
使用255字节大小的消息创建有效负载
$payload = '{
"aps": {
"alert": "' . $message . '",
"badge": 1,
"sound": "default"
}
}';
循环访问每个设备并将有效负载写入打开的连接。
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
fwrite($fp, $msg);
然后关闭连接。
fclose($fp);
所以我的问题是 - 脚本中的任何内容都没有改变,但HAS改变的是数据库的大小。我创建了一个Web界面,允许用户将有效负载发送到所有iphone设备,运行时只需几秒钟即可发送/加载。虽然数据库中的设备数量(大约3500)可能会产生问题吗?
当我写入套接字时,我可以发送推送通知的最大设备数是多少?是否存在最大值或限制?
答案 0 :(得分:5)
问题不在于发送给APNS的设备数量。问题是Apple改变了他们的API。您现在需要检查每个设备是否仍然有效(即,如果他们拒绝推送通知,设备是否删除了应用程序等)。如果设备不再接受来自您应用的推送通知,并且您仍然向其发送一个推送通知,则Apple会立即断开与APNS套接字的连接。我现在有一个cronjob,每天运行一次程序,检查并删除我的数据库中不再接受推送通知的任何设备(Apple有此列表)。但要小心 - 一旦你从Apple中删除了已禁用的设备ID列表,Apple就会从服务器中删除它,你可以从不再次拉出它。
您还需要更新推送通知代码以检查连接是否被丢弃。当连接断开时,程序需要重新建立连接并尝试再次推送。
答案 1 :(得分:3)
实际上,根据经验,似乎与APNS的连接在通过推送了一些通知后才会失败。在我们自己的APNS库(http://code.google.com/p/javapns/)中,库中包含的多线程传输引擎会在推送200个通知后自动重新启动连接(在试用和错误后似乎是一个神奇的数字)。由于我们引入了该功能(以及一些其他次要的comlink恢复选项),因此大量通知的失败通知率变为零。
答案 2 :(得分:0)
同样的问题.. 看起来2000个设备的限制是最大的。 因此,套接字打开了2000(或更少)令牌。试试看!