7

我正在开发一个使用推送通知的 iOS 应用程序,我已经实现了该应用程序和服务器端,如果我只发送一个或两个通知,它就可以很好地工作。当我需要向所有用户发送相同的通知时,问题就出现了,通知只会发送给循环的第一个用户。我在沙箱中,所以我想知道沙箱环境是否有任何限制,因为我读过APNS服务没有限制。任何的想法?

提前致谢,

更新的解决方案:

我必须检查苹果的响应,我正在向无效令牌发送推送,苹果断开了我与服务器的连接。使用以下功能,我已经解决了这个问题。感谢@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;
}
4

3 回答 3

11

可能的问题是您使用的某些设备令牌无效(请记住,生产设备令牌在沙盒环境中无效,反之亦然)。向无效的设备令牌发送通知将关闭您与 APN 服务器的套接字。在无效通知之后写入该套接字的所有通知都将被丢弃,直到您打开一个新套接字。

您可以尝试阅读 Apple 的错误响应,以找出哪个设备令牌无效。

您绝对应该阅读此处其他人已经提到的技术说明的错误检查部分。

于 2013-07-17T14:48:59.610 回答
0

可能想检查一下

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

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

于 2013-07-17T12:43:08.463 回答
0

您可以发送给的用户数量没有限制,您只需确保发送的消息大小低于该限制,正如 Kirti 所说,大约为 2048 字节。

发送消息的频率也没有限制,但我不建议发送太频繁。

于 2013-07-17T12:43:20.370 回答