【问题标题】:Max number of devices to send to APNS socket sever发送到 APNS 套接字服务器的最大设备数
【发布时间】:2011-07-25 16:29:50
【问题描述】:

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

  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);
    

所以我的问题是——脚本中没有任何改变,但改变的是数据库的大小。我创建了一个 Web 界面,允许用户向所有 iphone 设备发送有效负载,并且当它运行时只需几秒钟即可发送/加载。尽管数据库中的设备数量(大约 3500 台)可能会造成问题吗?

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

【问题讨论】:

    标签: notifications push apple-push-notifications


    【解决方案1】:

    问题不在于发送到 APNS 的设备数量。问题原来是苹果改变了他们的 API。您现在需要检查每台设备以查看它是否仍然有效(即,他们是否拒绝推送通知,设备是否删除了应用程序等)。如果设备不再接受来自您的应用程序的推送通知并且您仍然向其发送通知,Apple 会立即断开与您的 APNS 套接字的连接。我现在有一个 cronjob,它每天运行一次程序,从我的数据库中检查并删除任何不再接受推送通知的设备(Apple 有这个列表)。但请注意,一旦您从 Apple 拉出禁用设备 ID 列表,Apple 就会将其从其服务器中删除,并且您永远不会再次拉出它。

    您还需要更新推送通知代码以检查连接是否断开。当连接断开时,程序需要重新建立连接并再次尝试推送。

    【讨论】:

    • 在开发模式下进行测试时,我创建了 5 个假令牌 UDID,并在最后放置了一个真实的,然后执行 OP 所做的(设置一个循环)来测试如果有前几个问题,第一次尝试失败(或者我有其他错误),(从未在真实设备上收到通知)。为了进一步测试,我先发送了真实的,然后循环发送了 5 个假的。这成功了。这似乎天生就不好处理第一次发送的 UDID?
    • 这意味着如果有人擦除了他们的设备并且它的令牌号在您发送的设备组的中间,那么您的通知将不会发送,并且您不知道他们是否曾经通过..可以有人确认这个“实验”,我也可能有某种长度的消息错误导致这种行为。很高兴知道这是否是 Apple 的意图。
    • 不确定 2012 年的情况如何,但目前一旦设备无法接受通知(例如,由于应用程序被删除),连接就不会断开。我几乎无法想象,这种行为甚至是可能的,因为它会使 APNS 无法使用——应用程序会不断从设备中删除。
    【解决方案2】:

    确实,根据经验,在推送了一些通知后,与 APNS 的连接似乎会失败。在我们自己的APNS库(http://code.google.com/p/javapns/)中,库中包含的多线程传输引擎在推送200条通知后会自动重启连接(经过反复试验似乎是一个神奇的数字)。由于我们引入了该功能(以及其他一些次要的 comlink 恢复选项),大量通知的失败通知率降至零。

    【讨论】:

    • 我知道没有限制。绝对不是 200 条通知。
    【解决方案3】:

    同样的问题.. 看起来 2000 台设备的限制是最大值。 因此,通过套接字打开了 2000 个(或更少)令牌。试试看!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2011-08-17
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多