foreach ($users AS $userToken) {
$msg = chr(0) . pack('n', 32) . pack('H*', $userToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
}
作为参考,$fp
是'PHP Stream Context'。 $users
是已注册推送通知的用户令牌数组。
是否有更好的方法来编写上面的代码,以便fwrite可以某种方式向APNS发送一组消息,而不是为每个用户写入套接字?
答案 0 :(得分:0)
推送通知不是为了包含实际的有效负载(在您的情况下是消息列表),而是为了通知订户有关新内容的信息。收到通知后,应用程序将从Web服务中检索实际内容。
来自文档:
重要提示:发送通知是“尽力而为”,而不是 保证。它不是为了向您的应用提供数据,而只是为了 通知用户有新数据可用。
此外,通知有效负载的大小限制为256个字节。
通知有效负载允许的最大大小为256字节
因此,您应该为您的应用提供Web服务,以检索实际的邮件列表。通知有效负载仅包含新消息的数量。
您为每个用户发送个别请求的概念是正确的,这是APNS的设计方式。要提高整体性能,请使用多个连接(使用多个线程)并确保重用底层TCP连接。
来自文档:
您可以与同一网关建立多个连接 多个网关实例。如果需要发送大量的推送 通知,通过与几个不同的连接传播它们 网关。与使用单个相比,这提高了性能 连接:它可以让您更快地发送推送通知 让APN更快地提供它们。
请注意,使用Feedback Service从内部订阅者列表中删除未订阅的设备ID是您的职责。这也有助于提高整体性能。