Mir*_*ael 4 notifications push apple-push-notifications
我们的推送通知脚本已经工作了近一年,但突然停止了工作.该脚本执行以下操作:
查询DB以获取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);
Run Code Online (Sandbox Code Playgroud)创建一个255字节大小的消息的有效负载
$payload = '{
"aps": {
"alert": "' . $message . '",
"badge": 1,
"sound": "default"
}
}';
Run Code Online (Sandbox Code Playgroud)循环遍历每个设备并将有效负载写入打开的连接.
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
fwrite($fp, $msg);
Run Code Online (Sandbox Code Playgroud)然后关闭连接.
fclose($fp);
Run Code Online (Sandbox Code Playgroud)所以我的问题是 - 脚本中的任何内容都没有改变,但HAS改变的是数据库的大小.我创建了一个Web界面,允许用户将有效负载发送到所有iphone设备,运行时只需几秒钟即可发送/加载.虽然数据库中的设备数量(大约3500)可能会产生问题吗?
当我写入套接字时,我可以发送推送通知的最大设备数是多少?是否存在最大值或限制?
问题不在于发送给APNS的设备数量.问题是Apple改变了他们的API.您现在需要检查每个设备是否仍然有效(即,如果他们拒绝推送通知,设备是否删除了应用程序等).如果设备不再接受来自您应用的推送通知,并且您仍然向其发送一个推送通知,则Apple会立即断开与APNS套接字的连接.我现在有一个cronjob,每天运行一次程序,检查并删除我的数据库中不再接受推送通知的任何设备(Apple有此列表).但要小心 - 一旦你从Apple中删除了已禁用的设备ID列表,Apple就会从服务器中删除它,你再也不能将其删除了.
您还需要更新推送通知代码以检查连接是否被丢弃.断开连接后,程序需要重新建立连接并尝试再次推送.
| 归档时间: |
|
| 查看次数: |
7497 次 |
| 最近记录: |