我们在 appstore 上有一个应用程序,并注册了推送通知。他们一直成功地工作,但我们现在尝试发送“全球”推送,但发生了一些奇怪的事情。这就是我们在服务器端 .php 文件中的内容:
//Loop through tokens in tokenArray
$i = 0;
$t = 0;
foreach($tokenArray as $token)
{
$t++;
// Make notification
$msg = chr(0) . pack('n', 32) . pack('H*', $token) . pack('n', strlen($payload)) . $payload;
// Send
$result;
if($message != null)
{
$result = fwrite($fp, $msg, strlen($msg));
}
if ($result)
$i++;
}
// Close the connection to the server
fclose($fp);
if($i == 0)
{
echo 'The message was not delivered to anyone out of '.$t.'.';
}
else
{
echo 'The message was delivered to '.$i.' out of '.$t.'.';
}
在此之前的代码一直有效,现在仍然有效。tokenArray 包含带有标记的表,就像SELECT Token FROM Tokens;
我们的 SQL 中的一样。这行得通。
在开发过程中,当只注册我们自己的令牌时,它总是说“消息已发送到 4 个中的 4 个”,即使我们已经从手机中删除了我们的应用程序。现在我们尝试使用此代码向所有 ≈1100 个已注册令牌发送。消息已发送,输出为“消息已发送至 1194 中的 588”。而且我们自己也没有收到通知!这意味着什么?
大约 5 分钟后,我用一个只包含我自己的令牌的数组切换了 tokenArray 并发送了一个新的推送,我在手机上收到了那个。我还知道“工作”令牌存在于先前失败的“tokenArray”中(我检查过)。
推送通知是机会游戏吗!?if($result)
失败时是什么意思?为什么它失败了 500 多次?
证书和 .pem 和 .p12 等都在工作,我从 push1 到 push2 所做的唯一不同是使用另一个表,它是我的 SQL 服务器中原始表的克隆。Table2 只有我的令牌,并且有效。没有进行其他更改。只是SELECT Token FROM Tokens2
,后来我证明了所有令牌都Tokens2
存在于Tokens
我不知道是否有人得到了推送,或者仍然安装了应用程序的 1200 中的“幸运”588 是否收到了它。
这是什么原因造成的?我们不敢再发送一个,以防有一半已经收到。我一次发送推送的速度有限制吗?还是我们做错了什么?!请帮忙,谢谢。