2016-12-06 6 views
1

Beim Senden einer Push-Benachrichtigung funktioniert es richtig, bis es eine ungültige Geräte-ID (Token) trifft und die Push-Benachrichtigungen nicht mehr senden.Push-Benachrichtigung an iOS-Geräte schlägt fehl, wenn ungültiges Token

z. Wenn also das ungültige Token am Anfang des Arrays war, erhielten die übrigen Geräte keine Benachrichtigung.

Hat jemand eine Idee, wie man das stoppt oder wie ich mit den ungültigen Token umgehen soll?

ungültig token:

4016d0fb5207c3f7652c499f970a5f0c888f2a733bdaf4965f4de0aa7d4e1d03

gültigen Tokens:

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

Nach ungültigem Token, wenn Sie korrekte Token verwenden .... noch Benachrichtigung funktioniert nicht ...? –

+0

@GouravJoshi - Korrekt - Wenn also das ungültige Token am Anfang des Token-Arrays stand, erhielten die übrigen Geräte keine Benachrichtigung. –

+0

Derzeit testen Sie diese ?. Wenn ja dann bitte von iOS aus sicherstellen, dass sie keinen Platzhalterwert übergeben sollen. Weil wir manchmal vom Simulator oder vom virtuellen Gerät testen müssen. So könnte ein ungültiges Token entstehen. –

Antwort

0
  1. Sie erhöht behandeln sollten Fehler, wenn Sie einen ungültigen Token gesendet und weiter nächste Token

  2. senden sollten Sie ungültige Token von Feedback-Service (feedback.push.apple.com) handhaben und entfernen, dass aus der Liste Ihrer Token-Token

Ihr Beispielcode doesn‘ t kümmern sich um diese Dinge und deshalb hört es auf zu arbeiten.

+0

Haben Sie Beispiele für das Feedback.push.apple? –

Verwandte Themen