要发送到APNS套接字服务器的最大设备数

时间:2011-07-25 16:29:51

标签: notifications push apple-push-notifications

我们已经工作了近一年的推送通知脚本突然停止工作。该脚本执行以下操作:

  1. 查询数据库以获取iPhone设备令牌列表

  2. 打开与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);
    
  3. 使用255字节大小的消息创建有效负载

    $payload = '{
      "aps": {
         "alert": "' . $message . '",
         "badge": 1,
         "sound": "default"
      }
    }';
    
  4. 循环访问每个设备并将有效负载写入打开的连接。

    $msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
    fwrite($fp, $msg);
    
  5. 然后关闭连接。

    fclose($fp);
    
  6. 所以我的问题是 - 脚本中的任何内容都没有改变,但HAS改变的是数据库的大小。我创建了一个Web界面,允许用户将有效负载发送到所有iphone设备,运行时只需几秒钟即可发送/加载。虽然数据库中的设备数量(大约3500)可能会产生问题吗?

    当我写入套接字时,我可以发送推送通知的最大设备数是多少?是否存在最大值或限制?

3 个答案:

答案 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(或更少)令牌。试试看!