1

PHP サーバーから送信されたプッシュ通知を受信する iPhone アプリケーションがあります。このタスクのために Raywenderlichのチュートリアルを実装しました。

ユーザーのカレンダーでスケジュールのプッシュ通知を送信していますが、一部のユーザーから、特定のスケジュールについてユーザーに通知するプッシュ通知が繰り返し送信されると報告されています。

正確には、最初の通知が来ると通常どおりに動作しますが、2 番目の通知が来ると古い通知も表示されます。古い通知の時間も古いです。現在の通知のみが表示さNowれ、古い通知には のようなものが表示され10 hours agoます。次に、3 番目の通知には 3 つの通知が表示されます。

APNSPHP ライブラリを使用して、すべての通知に一意のカスタム識別子を設定するように誰かに言われましたが、それも役に立ちませんでした。

私がやっていることは、APNS への 1 つの接続を介して (異なるユーザーにではありますが) いくつかのプッシュ通知を送信していることです。ペイロードには、キーと、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