2

過去 3 日間、私は自分の php コードと apns をうまく機能させようとしてきました。

これまでのところ、通知を配信できます (デバイスが 1 つしかないため、これが複数のデバイスで機能しているかどうかはわかりません)。

最初の通知が無効なデバイス トークン (私が発明したもの) で、2 番目の通知がデバイス トークンである 2 つのデバイスに 1 つの通知を送信するテストをしようとすると、デバイスに通知を配信できません... 私が読んだことから、いつ通知が判読不能またはエラーである場合、apns は接続をシャットダウンし、6 バイト長のエラーを送信します。2 番目のバイト (status_code) はエラーの種類です。エラーが発生しない場合でも、apns が status_code 0 (エラーは発生しません) を送信するのか、それとも何も送信しないのかを理解できません。

これまでのところ、インターネットで見つかったいくつかのコードに従っているにもかかわらず、この status_code を見つけることができませんでした。

コード

$ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', '.\certif\ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Create the payload body
    //file_put_contents('logs/debug_not.log', 'body'. "\n", FILE_APPEND);
    $body['aps'] = array(
        'alert' => $message,
        'sound' => 'default'
    );

    // Encode the payload as JSON
    //file_put_contents('logs/debug_not.log', 'json body'. "\n", FILE_APPEND);
    $payload = json_encode($body);
    $open = true;
    foreach ($devices as $device) {
        //file_put_contents('logs/debug_not.log', 'inicio ciclo'. "\n", FILE_APPEND);
        if($open == true){
            //file_put_contents('logs/debug_not.log', 'abrir ligacao'. "\n", FILE_APPEND);
            // Open a connection to the APNS server
            $fp = stream_socket_client(
                    'ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx);

            if (!$fp){
               //file_put_contents('logs/debug_not.log', 'erro abrir ligacao'. "\n", FILE_APPEND);
               throw new \Exception;
            }
        }
        // Build the binary notification
        //file_put_contents('logs/debug_not.log', 'criar payload'. "\n", FILE_APPEND);
        $msg = chr(0) . pack('n', 32) . pack('H*', str_replace(' ', '', $device['token'])) . pack('n', strlen($payload)) . $payload;


        // Send it to the server
        //file_put_contents('logs/debug_not.log', 'enviar payload'. "\n", FILE_APPEND);
        $result = fwrite($fp, $msg, strlen($msg));
        stream_set_blocking ($fp, 0);    

        $errorResponse = @fread($apns, 6);
        //if i var_dump($errorResponse) it gives me null/false all the time, no matter what             

        //this is my workaround for invalid device tokens-- its not working or at least is not send the valid tokens
        if(!$result || !$fp)
        {

            //file_put_contents('logs/debug_not.log', 'erro na not '. chr($data["status_code"]). "\n", FILE_APPEND);
            fclose($fp);
            $open = true;
        } else{
            //file_put_contents('logs/debug_not.log', 'suc na not'. "\n", FILE_APPEND);
            $open = false;
        }
        //file_put_contents('logs/debug_not.log', 'fim ciclo'. "\n", FILE_APPEND);
    }
    // Close the connection to the server
    if($fp){
        //file_put_contents('logs/debug_not.log', 'fechar connection'. "\n", FILE_APPEND);
        fclose($fp);
    }

接続の fread は、通知を受け取った場合や間違ったトークンを使用しようとしている場合でも、常に null/false を返します。

エラー後の接続のロジックが機能していないようです。

誰か助けてください??? 私は 3 番目のクラスまたはコードを使用するつもりはありません。たとえ apns がエラーを出すものがあっても、デバイス トークンの配列に対して機能する単純で基本的なものを持ちたいと思います。

みんな、ありがとう。

4

2 に答える 2

6

あなたは次のように接続を確立しました$fp = stream_socket_client ......

$errorResponse = @fread($apns, 6);$apns が定義されていないため、出力が得られないことを試みています。

むしろ、これを行う必要があります:

$errorResponse = @fread($fp, 6);

そしてあなたのコードはうまくいくでしょう

于 2015-07-20T06:49:56.863 に答える
1

エラーが発生した場合 (あなたの場合は、アプリ用に作成したデバイス トークンが Apple のサーバーに存在しないことが原因である可能性が最も高い)、接続が閉じられる直前にエラー メッセージが返されます。メッセージが成功した場合、応答はありませんが、接続は開いたままです。

これを処理する方法は次のとおりです。

  1. メッセージを送信します。
  2. タイムアウトを指定して (または非ブロッキング モードで) エラーを読み取ります。エラー応答を受け取った場合、メッセージは失敗しました。(新しい接続が必要になります。)
  3. 読み取りがタイムアウトした場合 (または非ブロッキング モードで何も返さない場合)、メッセージ成功している可能性があります。(何もしない。)
  4. 次のメッセージを送信します。送信が成功した (まだ接続されている) 場合、最後のメッセージは確実に成功しています。

最後に成功したメッセージを追跡します。誤検知を防ぐためだけに、自分のデバイスにメッセージを送信することで、一連のメッセージをいつでもフォローアップできます.

これのオープン ソース PHP 実装であるEasyAPNSのソース コードを確認することをお勧めします。また、Apple のドキュメントで詳細を読むことができます: Provider Communication with Apple Push Notification Service

于 2013-08-22T19:34:13.977 に答える