发送APNS消息数组而不是发送单个消息

时间:2014-09-11 21:17:42

标签: php apple-push-notifications

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发送一组消息,而不是为每个用户写入套接字?

1 个答案:

答案 0 :(得分:0)

通知有效载荷

推送通知不是为了包含实际的有效负载(在您的情况下是消息列表),而是为了通知订户有关新内容的信息。收到通知后,应用程序将从Web服务中检索实际内容。

来自文档:

  

重要提示:发送通知是“尽力而为”,而不是   保证。它不是为了向您的应用提供数据,而只是为了   通知用户有新数据可用。

     

(来源:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

此外,通知有效负载的大小限制为256个字节。

  

通知有效负载允许的最大大小为256字节

     

(来源:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

因此,您应该为您的应用提供Web服务,以检索实际的邮件列表。通知有效负载仅包含新消息的数量。

与APNS进行沟通

您为每个用户发送个别请求的概念是正确的,这是APNS的设计方式。要提高整体性能,请使用多个连接(使用多个线程)并确保重用底层TCP连接。

来自文档:

  

您可以与同一网关建立多个连接   多个网关实例。如果需要发送大量的推送   通知,通过与几个不同的连接传播它们   网关。与使用单个相比,这提高了性能   连接:它可以让您更快地发送推送通知   让APN更快地提供它们。

     

(来源:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW6

请注意,使用Feedback Service从内部订阅者列表中删除未订阅的设备ID是您的职责。这也有助于提高整体性能。