1

我有一个接收从 PHP 服务器发送的推送通知的 iPhone 应用程序。我为此任务实现了关于 Raywenderlich 的教程。

我正在发送用户日历中日程的推送通知,一些用户报告说,提醒用户特定日程的推送通知被重复发送。

准确地说,当第一个通知出现时,它的行为正常,但当第二个通知出现时,它也会显示较旧的通知。旧通知的时间也很旧。仅显示当前通知Now,较旧的通知显示类似10 hours ago. 然后第三个通知显示 3 个通知,依此类推。

有人告诉我使用APNSPHP 库并在每个通知上设置一个唯一的自定义标识符,但这也无济于事。

我正在做的是通过与 APNS 的单个连接发送多个推送通知(尽管发送给不同的用户)。有效负载包含一个键和一个参数列表,这些参数与存储在 iPhone 应用程序的 Localizable.strings 中的本地化格式化字符串列表相对应。

function __push_data($push_notifications, $push_content) {
    $ctx = stream_context_create();
    if (ENVIRONMENT == 'development') {
        stream_context_set_option($ctx, 'ssl', 'local_cert', 'dev.combined.pem');
    } else if (ENVIRONMENT == 'production') {
        stream_context_set_option($ctx, 'ssl', 'local_cert', 'prod.combined.pem');
    }
    stream_context_set_option($ctx, 'ssl', 'passphrase', A_PRIVATE_KEY);

    /* Open a connection to the APNS server */
    $apns_server = "ssl://gateway.sandbox.push.apple.com:2195";
    if (ENVIRONMENT == 'production') {
        $apns_server = "ssl://gateway.push.apple.com:2195";
    }

    $fp = stream_socket_client(
        $apns_server, $err,
        $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

    if ($fp) {
        foreach ($push_notifications as $index => $push_notification) {
            $body = array();

            /* Create the payload body */
            $body['aps'] = array('alert' => array('loc-key' => $push_notification['key'], 'loc-args' =>  $push_notification['message']), 'sound' => 'default');
            $body['sopnc'] = $push_content;

            /* Encode the payload as JSON */
            $payload = json_encode($body);

            /* Build the binary notification */
            $msg = chr(0) . pack('n', 32) . pack('H*', $push_notification['push_token']) . 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;
            }
        }

        /* Close the connection to the server */
        fclose($fp);
    }
}

有没有其他人遇到过这样的问题?

4

0 回答 0