Apple 推送通知:发送大量消息

我正在使用PHP连接到s以向多个设备发送一些通知,尽管这个问题更具概念性,因此不必特定于PHP。apn

我将同时向大约7000台设备(并且还在增长)发送。我的进程每天运行一次,并广播到所有设备,因此我不会经常重新打开连接。

目前,我可以一次轻松地发送到2台设备,并且消息将成功传递。但是,当我尝试发送到完整的7000台设备时,消息似乎没有传递。

我的代码的伪逻辑是:

open connection to apple
loop over device-tokens
    write to socket connection per device
end loop
close connection to apple.

我在某处看到我应该只执行一次写入,并构造一个巨大的主体,换句话说,伪代码看起来像这样:

loop over device tokens
    create payload aggregating all devices
end loop
open connection to apple
write to socket ONCE with whole payload for 7000 devices
close connection

这很难测试,因为我显然不能用测试邮件向我的7000个生产用户发送垃圾邮件。有没有人遇到过类似的问题?

谢谢


答案 1

我读过苹果确实关心你与他们服务器的连接数量,但我从未听说过任何写入限制。另外,我不确定你会在这里收到什么样的回应,但可能值得一试,看看会发生什么。也许可以尝试使用沙盒推送通知服务器,仅使用生产设备的设备令牌。这些手机不应该收到发送到沙盒服务器的任何推送通知,如果沙盒报告“成功交付”,这将是一种无忧的测试方式。


答案 2

我看到你想要什么,相反,我确实面临着同样的问题,对我有用的是逆向工程。我刚刚查看了库并检查了验证设备Token的函数。因此,在创建虚拟设备令牌时,我只是确保生成的令牌根据库有效。

以下代码将允许您生成有效的设备令牌,现在由您决定使用此函数生成多少百万个令牌。

   def generateRandomDeviceTokenAndAppendItToJson(tokenLength: Int) {
     val randomlyGeneratedDeviceToken = new StringBuilder()
      randomlyGeneratedDeviceToken.append("          \"")
        (1 to tokenLength) foreach {
         times: Int =>
        if (tokenLength equals Device.Apple)
         randomlyGeneratedDeviceToken.append(validCharacter().toString.charAt(0))
        else
         randomlyGeneratedDeviceToken.append(Random.alphanumeric.head)
        }
       randomlyGeneratedDeviceToken.append("\",")
       println(randomlyGeneratedDeviceToken)
       writer.write(randomlyGeneratedDeviceToken.toString())
      }

      private def validCharacter(): Int = {
       val a = Random.alphanumeric.head
       if ('0' <= a && a <= '9')
        return (a - '0')
       else if ('a' <= a && a <= 'f')
        return ((a - 'a') + 10)
       else if ('A' <= a && a <= 'F')
        return ((a - 'A') + 10)
       validCharacter() 
     }

苹果设备令牌是64个字符,所以你将需要迭代它64次。


推荐