2016-08-16 15 views
1

Googleには、AndroidとiOSの両方にプッシュ通知を送信するPHPのアプリケーションが組み込まれています。私たちの問題は、iOSのデバイスIDがスクリプト内の他のすべてのiOSプッシュ通知の送信を完全に停止しているように見えることです。エラーなしで送信されたとしても、その後ループ内のすべての通知を停止します。iOSアプリケーションのプッシュ通知

違反しているデバイスIDをデータベースから削除すると、送信スクリプトは問題のあるデバイスの後のすべてのデバイスで機能します。それは非常に奇妙で、なぜそれを理解していないようです。

誰もこの経験がありますか?それがもう存在しないデバイスIDに送信することは、Appleが特定の接続でスクリプトを完了するのを止めるでしょうか?

$tHost = 'gateway.push.apple.com'; 
    $tPort = 2195; 
    $tCert = "path_to_our_cert.pem"; 
    $tPassphrase = 'passphrase'; 

    $tAlert = $this->title; //assign a title 
    $tBadge = 8; 
    $tSound = 'default'; 
    $tPayload = $this->body_plain; //assign a body 

      // Create the message content that is to be sent to the device. 
    $tBody['aps'] = array ('alert' => $tAlert,'badge' => $tBadge,'sound' => $tSound,); 
    $tBody ['payload'] = $tPayload; 
    $tBody = json_encode ($tBody); 

    $tContext = stream_context_create(); 
    stream_context_set_option ($tContext, 'ssl', 'local_cert', $tCert); 
    stream_context_set_option ($tContext, 'ssl', 'passphrase', $tPassphrase); 
    $tSocket = stream_socket_client ('ssl://'.$tHost.':'.$tPort, $error, $errstr, 30, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $tContext); 

    if (!$tSocket) exit ("APNS Connection Failed: $error $errstr" . PHP_EOL); 
    //Loop through all devices to send 
    foreach($this->device->devices as $item){ 
     if($item->os != "iOS") continue;     
     if(session::getAdministratorStaffSchoolID() != $item->school_id) continue; 
     $tToken = $item->device_id;//assign the device id 
     $tMsg = chr (0) . chr (0) . chr (32) . pack ('H*', $tToken) . pack ('n', strlen ($tBody)) . $tBody; 
      $tResult = fwrite ($tSocket, $tMsg, strlen ($tMsg)); 
    } 

    fclose ($tSocket); 

誰もこれについての任意のアイデアを持っています。ここでは

は、PHPで私たちの送信スクリプトは(これは離れて奇数不正なデバイスIDからすべてのデバイスのために働く)とは?

感謝

答えて

1

だからあり、ちょうど考えていますが、通知を送信するために、従来の形式を使用している:

$tMsg = chr (0) . chr (0) . chr (32) . pack ('H*', $tToken) . pack ('n', strlen ($tBody)) . $tBody; 

そして:

エラーレスポンス。従来の形式では、何らかの形で不正な形式の通知パケット( )を送信すると、ペイロードが を超えています。規定された制限-APNは接続を切断して応答します。 は通知を拒否した理由を知らせません。拡張された 形式では、プロバイダーは任意の 識別子で通知にタグを付けることができます。エラーがある場合、APNは、 がエラーコードを識別子に関連付けるパケットを返します。この応答により、 プロバイダは不正な形式の通知を見つけて修正することができます。

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Appendixes/LegacyFormat.html

ので、多分APNSはあなたの接続を落としていますか?そのため、残りの通知はすべて実際には通過しません。それらのペイロードを詳しく見てみましょう。そして、新しいフォーマットに移行するのはいい時期かもしれません。

0

任意のエラー(無効なデバイストークン、不正な形式のペイロード、等)が発生するように私の知る限りのAPNとすぐ接続を閉じます。プッシュを送信するコードは、この状況から復旧する準備ができている必要があります。再接続してから作業を再開してください。

このジョブを実行するための3rdPartyライブラリをご覧ください。あなたはコミュニティーの仕事に頼ります。

私はJavaで書かれたPushyを紹介することができます。私は2つの異なるプロジェクトでそれを使用しており、それはうまく動作し、それは非常にアクティブなプロジェクト(多くの議論とそこに更新)だと言うことができます。

私はPHPを使用してそれらのいずれかを知らないが、おそらく1