2016-12-06 36 views
1

プッシュ通知を送信すると、無効なデバイスID(トークン)に当たってプッシュ通知が送信を停止するまで正しく動作します。無効なトークンがあると、iOSデバイスへのプッシュ通知が失敗する

など。したがって、無効なトークンが配列の先頭にあった場合、残りのデバイスは通知を受けません。

これをやめる方法や無効なトークンをどのように処理するべきか、誰にも分かりますか?

無効なトークン:

4016d0fb5207c3f7652c499f970a5f0c888f2a733bdaf4965f4de0aa7d4e1d03

有効なトークン:

7938f3efb9064a830afce762d843eb5fa67131237ef9a8808b3e2d3c205f530be9335ed68a4f02c4284ae4b8edfda09fedaff4426c8c017d254c3d52c64ba7168d3d704618580a065ae4055561b11c662a667113aecd296ed07fe55d0650b596

$tokens = array("4016d0fb5207c3f7652c499f970a5f0c888f2a733bdaf4965f4de0aa7d4e1d03", "7938f3efb9064a830afce762d843eb5fa67131237ef9a8808b3e2d3c205f530b", "e9335ed68a4f02c4284ae4b8edfda09fedaff4426c8c017d254c3d52c64ba716", "8d3d704618580a065ae4055561b11c662a667113aecd296ed07fe55d0650b596"); 

push_notification($tokens, 0); 

function push_notification($tokens, $invalidTokenKey){ 
    //Setup notification message 
    $body = array(); 
    $body['aps'] = array('alert' => 'My push notification message!'); 
    $body['aps']['badge'] = 1; 

    //Setup stream (connect to Apple Push Server) 
    $ctx = stream_context_create(); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', CERTIFICATES_APNS_PASSPHRASE); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', CERTIFICATES_APNS); 
    $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 
    stream_set_blocking ($fp, 0); //This allows fread() to return right away when there are no errors. But it can also miss errors during last seconds of sending, as there is a delay before error is returned. Workaround is to pause briefly AFTER sending last notification, and then do one more fread() to see if anything else is there. 

    if (!$fp) { 
     echo "Failed to connect (stream_socket_client): $err $errstrn"; 
    } else { 
     $apple_expiry = time() + (90 * 24 * 60 * 60); //Keep push alive (waiting for delivery) for 90 days 
     for ($i = $invalidTokenKey; $i < count($tokens); $i++) { 
      $apple_identifier = $i; 
      $deviceToken = $tokens[$i]; 
      $payload = json_encode($body); 
      //Enhanced Notification 
      $msg = pack("C", 1) . pack("N", $apple_identifier) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload; 
      //SEND PUSH 
      fwrite($fp, $msg); 
      //We can check if an error has been returned while we are sending, but we also need to check once more after we are done sending in case there was a delay with error response. 
      checkAppleErrorResponse($fp); 
     } 

     //Workaround to check if there were any errors during the last seconds of sending. 
     usleep(500000); //Pause for half a second. Note I tested this with up to a 5 minute pause, and the error message was still available to be retrieved 

     checkAppleErrorResponse($fp); 
     fclose($fp); 
    } 
} 








//FUNCTION to check if there is an error response from Apple 
//   Returns TRUE if there was and FALSE if there was not 
function checkAppleErrorResponse($fp) { 
    //byte1=always 8, byte2=StatusCode, bytes3,4,5,6=identifier(rowID). Should return nothing if OK. 
    $apple_error_response = fread($fp, 6); 
    //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. 

    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'; 
      $invalidTokenKey = $error_response['identifier'] + 1; 
      push_notification($tokens, $invalidTokenKey); 
     } 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'; 
     } 
     return true; 
    } 
    return false; 
} 
+0

正しいトークンを使用しているときに無効なトークンが発生しました....まだ通知が機能していません...? –

+0

@ GouravJoshi - 正しい - 無効なトークンがトークンの配列の先頭にあった場合、残りのデバイスは通知を受けません。 –

+0

現在、これらをテストしていますか?もしそうなら、plOSはiOSのエンドから、プレースホルダの値を渡すべきではないことを確認します。シミュレータや仮想デバイスからテストする必要があることがあるためです。無効なトークンが生成される可能性があります。 –

答えて

0
  1. あなたは無効なトークンを送信したときに発生するエラーを処理する必要がありますあなたがフィードバックサービス(feedback.push.apple.com)から無効なトークンを処理し、あなたのトークンのリストからトークン

は、あなたのコード例は、」doesnのことを削除する必要があり、次のトークン

  • を送信し続けますこれらのことを心配しているので、それが働くのを止めるのです。

  • +0

    feedback.push.appleの例はありますか? –

    関連する問題