苹果推送通知限制

7
我正在开发一款使用推送通知的iOS应用程序,我已经实现了应用程序和服务器端,如果我只发送一两条通知,那么它们可以正常工作。但是当我需要向所有用户发送相同的通知时,问题就出现了,通知只会到达循环中的第一个用户。 我在沙盒环境中,所以我想知道是否有任何限制,因为我已经阅读过APNS服务没有限制的相关资料。 有什么建议吗?
提前感谢您的回复。
更新的解决方案:
我必须检查苹果的响应,我向无效的token发送推送,导致我被苹果从服务器中断开连接。 使用以下函数,我已经解决了这个问题。 感谢@Eran 和 这篇文章
/* FUNCTION to check if there is an error response from Apple
 * Returns TRUE if there was and FALSE if there was not
 */
public function checkAppleErrorResponse($fp) {

    //byte1=always 8, byte2=StatusCode, bytes3,4,5,6=identifier(rowID). 
    // Should return nothing if OK.

    //NOTE: Make sure you set stream_set_blocking($fp, 0) or else fread will pause your script and wait 
    // forever when there is no response to be sent. 
    $apple_error_response = fread($fp, 6);
    if ($apple_error_response) {

        // unpack the error response (first byte 'command" should always be 8)
        $error_response = unpack('Ccommand/Cstatus_code/Nidentifier', $apple_error_response); 

        if ($error_response['status_code'] == '0') {
        $error_response['status_code'] = '0-No errors encountered';

        } else if ($error_response['status_code'] == '1') {
        $error_response['status_code'] = '1-Processing error';

        } else if ($error_response['status_code'] == '2') {
        $error_response['status_code'] = '2-Missing device token';

        } else if ($error_response['status_code'] == '3') {
        $error_response['status_code'] = '3-Missing topic';

        } else if ($error_response['status_code'] == '4') {
        $error_response['status_code'] = '4-Missing payload';

        } else if ($error_response['status_code'] == '5') {
        $error_response['status_code'] = '5-Invalid token size';

        } else if ($error_response['status_code'] == '6') {
        $error_response['status_code'] = '6-Invalid topic size';

        } else if ($error_response['status_code'] == '7') {
        $error_response['status_code'] = '7-Invalid payload size';

        } else if ($error_response['status_code'] == '8') {
        $error_response['status_code'] = '8-Invalid token';

        } else if ($error_response['status_code'] == '255') {
        $error_response['status_code'] = '255-None (unknown)';

        } else {
        $error_response['status_code'] = $error_response['status_code'].'-Not listed';

        }

        echo '<br><b>+ + + + + + ERROR</b> Response Command:<b>' . $error_response['command'] . '</b>&nbsp;&nbsp;&nbsp;Identifier:<b>' . $error_response['identifier'] . '</b>&nbsp;&nbsp;&nbsp;Status:<b>' . $error_response['status_code'] . '</b><br>';

        echo 'Identifier is the rowID (index) in the database that caused the problem, and Apple will disconnect you from server. To continue sending Push Notifications, just start at the next rowID after this Identifier.<br>';
        return true;
    }
    return false;
}

APN 服务有限制,每次只能发送 256 字节的数据。 - Kirtikumar A.
@kirtiavaiya 是的,我知道这个,并且在发送消息之前会进行检查,所以那不是问题。 - Marta Rodriguez
我认为,如果您以正确的格式和大小发送数据包(有效载荷),那么这可能与通过循环遍历接收者列表将数据发送到APNS有关的问题。 - 120hit
@mrm_arrasate 这篇文章是关于解决推送通知问题的好读物。 - Amar
stream_set_blocking($fp, 0) 可能与 TLS 不兼容。 - Ngô Văn Thao
3个回答

11
可能的问题是您使用了一些无效的设备令牌(请记住,生产设备令牌在沙盒环境中无效,反之亦然)。向无效的设备令牌发送通知将关闭到APN服务器的套接字。在无效的通知之后写入该套接字的所有通知都将被丢弃,直到您打开一个新的套接字。
您可以尝试读取来自苹果的错误响应以找出哪个设备令牌无效。
您应该绝对阅读其他人已经提到的Tech Note的错误检查部分。

我已经检查了来自苹果的响应,在所有情况下它都返回apns消息大小。此外,我已经检查了反馈服务,它返回空。 - Marta Rodriguez
你是正确的,我之前确实向无效的 token 发送了推送,但是我没有正确地检查苹果响应,现在它完美地工作了。谢谢!这个链接帮助了我http://learn-php-by-example.blogspot.com.es/2013/01/working-with-apple-push-notification.html,特别是 "checkAppleErrorResponse" 函数。 - Marta Rodriguez
@Eran 我尝试使用上面相同的代码,但它给了我无效的令牌,这些令牌是开发令牌,我已经从数据库中删除了它们,但仍然没有被所有设备接收到,最终我放弃了 :( - Fatima

0

可能想要查看这个

使用APNs没有大小写限制或批量大小限制。iOS 6.1新闻发布中指出,自成立以来,APNs发送了超过4万亿次推送通知。在WWDC 2012上宣布,APNs每天发送70亿条通知。

如果您的吞吐量低于每秒9000条通知,则您的服务器可能会受益于改进的错误处理逻辑。


0

您可以向任意数量的用户发送消息,只需确保发送的消息大小不超过2048字节的限制即可,正如Kirti所述。

您也可以随时发送消息,但我不建议过于频繁地发送。


我正在向所有用户发送相同的通知(某些消息),但其中一些人可以接收到通知,而另一些人则不能。因此,我猜测长度不是问题,无论如何,我正在检查限制。 - Marta Rodriguez
你确定每个发送都成功了吗?还是因为被你的ISP视为垃圾邮件或类似的原因而被阻止了? - MZimmerman6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接