18

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

我将同时发送到大约 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 个生产用户发送测试消息。有没有其他人有类似的问题?

谢谢

4

2 回答 2

6

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

于 2010-04-30T13:09:24.833 回答
0

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

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

   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() 
     }

苹果 deviceToken 有 64 个字符,因此您需要对其进行 64 次迭代。

于 2013-07-05T09:48:50.637 回答