1

我们在 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 是否收到了它。

这是什么原因造成的?我们不敢再发送一个,以防有一半已经收到。我一次发送推送的速度有限制吗?还是我们做错了什么?!请帮忙,谢谢。

4

2 回答 2

2

好吧,我不知道php,所以你的代码对我没有帮助。但是,根据您的描述,您的数据库中的某些设备令牌可能无效。当 Apple 的服务器收到带有无效设备令牌的通知时,它会关闭套接字。如果您在带有错误令牌的消息之后已经写了更多消息,它们将不会到达 Apple。只有在您检测到套接字已关闭并打开一个新套接字后,您的消息才会到达 Apple。如果您不使用增强的通知格式,最好开始使用它 - 这样您可以从 Apple 获取无效消息的 id 并从无效令牌中清除您的数据库。但是,即使使用增强格式也不能保证您会检测到所有错误(除非您愿意非常缓慢地发送消息,

于 2013-02-05T20:43:02.827 回答
1

您的主循环没有考虑 Apple 将关闭套接字连接的情况。正如 Eran 所提到的,如果您发送无效令牌,Apple 会在此时关闭连接,使用 fwrite 的任何进一步写入都将失败。因此,如果您的第 589 个令牌无效,则不会向 Apple 发送其他推送。

这是一个适合您逻辑的简单解决方案;这部分替换了主循环中的 if 语句:

if ($result) {
    $i++;
} else {
    fclose($fp);
    // Add code here to re-open socket-connection with Apple.
}

除了 Eran 提到的增强型通知格式外,您还可以使用 APNS 反馈 API 向 Apple 查询无效令牌并将其从数据库中清除。你可以在这里找到更多信息:http: //bit.ly/14RPux4

您一次可以发送多少个推送通知没有限制。我已经在几秒钟内发送了数千封邮件。唯一真正的限制是您和 APNS 服务器之间的连接。

于 2013-02-06T13:35:32.113 回答