2011-12-23 22 views
0

複数のトークンにプッシュ通知を送信する方法がわかりません。私のスクリプトでは、プッシュ通知のみを送信するようです...アップルごとに1つのオープンな接続を開いて、必要なときにメッセージを送信する方がよいでしょう。グループにプッシュ通知を送信する

$payload['aps'] = array('alert' => "New Cave report for ".$caveName,'badge' => 1, 'sound' => 'default'); 
$payload['condition'] = array('conditionID' => $ccID, 'caveName' => $caveName); 
$payload = json_encode($payload); 

// Connection Part 
$apnsHost = 'gateway.sandbox.push.apple.com'; 
$apnsPort = 2195; 
$apnsCert = '/var/www/web543/files/apns-dev.pem'; 

if (!file_exists($apnsCert)) 
{ 
    echo "Certification file not found!"; 
} else 
{ 
    $streamContext = stream_context_create(); 
    stream_context_set_option($streamContext,'ssl','local_cert',$apnsCert); 

    $apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort,$error,$errorString,2,STREAM_CLIENT_CONNECT,$streamContext); 

    if (!$apns) 
    { 
     echo "Connection Failed!".$errorString; 
    } else 
    { 
     $db->query("SELECT DISTINCT token FROM notifications WHERE userID != '{$userID}'"); 
     if ($db->num_rows()>0) 
     { 
      while ($db->next_record()) 
      { 
       $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $db->f('token'))) . chr(0) . chr(strlen($payload)) . $payload; 
       if (fwrite($apns, $apnsMessage) === FALSE) 
       { 
        echo "Can not write"; 
       } 
      } 
     } 
    } 

    fclose($apns); 
} 

$ apnsMessageのいくつかの出力が

Token: 5a984922e19eab54f78fd54e24d5b02a3d30ccdbbeee34aadbdacaa687ee1261 Message: Z˜I"áž«T÷ÕN$Õ°*=0ÌÛ¾î4ªÛÚʦ‡îa†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}} 
Token: c607acc70bd4885bf56f3b4827523023bf93a1d644626768ab0304bb3b4414dc Message: ƬÇÔˆ[õo;H'R0#¿“¡ÖDbgh«»;D܆{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}} 
Token: 785ec3128972bd3d4c3e6fa1eeead97b73b0696e2361339a2467e6ba775b83ea Message: x^Ér½=L>o¡îêÙ{s°in#a3š$gæºw[ƒê†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}} 
Token: c592487e3c71e921d0b7a825b66ed5e58070fee709131535ac391f14febbcfdc Message: Å’H~Token: 061bc20ba3a0fc17c689e052b42b5789f502a52d43180ea114e3212077045315 Message: £ üƉàR´+W‰õ¥-C¡ã! wS†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}} 
Token: 26fb66fef67a122ca456f106363115285d4d7156e7c8ab6e51bd5bfa9bab2d03 Message: &ûfþöz,¤Vñ61(]MqVçÈ«nQ½[ú›«-†{"aps":{"alert":"New Cave report for Test Entry","badge":1,"sound":"default"},"condition":{"conditionID":"1","caveName":"Test Entry"}} 

答えて

1

OK:追加のヘルプが必要な場合

はこの質問を見てください。私は問題を発見した。

デバッグとしてコンパイルすると、DEV証明書を使用しているときに最初のデバイスでのみ送信されます。 Ad-HocのようなDeploymentを使用する場合は、Prod ServersとProd Certificatesを使用する必要があります。

これですべてが機能します。

+0

を見てください。そうすれば、devsからapn証明書をprodに変更するだけで、そのトリックは変わったのですか? – Nilesh

+0

はい。もちろん、サンドボックスサーバーの代わりにプロダクションプッシュサーバーを選択してください。これは、DeploymentおよびProdビルド用でなければなりません。 – Chris

+0

よろしいですか?あなたの問題が解決されたことを知ってうれしいです:)。ちなみに、以前私はdev証明書を使ってこれを実装することができました。 Appleの側から何かが変更されているかどうかは分かりません。 – Nilesh

0

...私のPHPサーバー上でそれを行う方法がわからない私は、あなたがトークンの数に応じてループ内でこのスクリプトを実行するために持っていると思います。

まず、トークン配列を取得してから、カウントに従ってループを作成します。次に、インデックス0から1つのデバイストークンを取り出し、このスクリプトを実行します。次に、インデックス1に別のトークンを追加して、このスクリプトを再度実行します。

プッシュ通知を複数のデバイスに送信するには、毎回リンゴサーバーに接続して接続を閉じてから、再度開いて送信します。これがプロセスです。

0

あなたがプッシュを送信する必要があるたびに、ソケット接続を作成して破棄しないでください。ソケット接続を確立したら、必要なプッシュメッセージを任意の数のデバイスに書き込むことができます。 あなたが観察している正確な問題は何ですか?あなたのソケット接続は落ちていますか? How to send Push Notification to multiple devices?

+0

ループ内の最初のデバイスでプッシュ通知のみを受けました。 – Chris

+0

トークンが実際に毎回置き換えられていますか?私は正しいデバイストークンが交換されているかどうかを意味しますか?いくつかのログを入れてそれを一度確認できますか?ログに "Can not write"ステートメントが表示されますか? fwrite呼び出し後に接続が自動的に切断される場合は、デバイストークンが無効である可能性があります。 – Nilesh

+0

willを書くことができません呼び出されていません。また、トークンが交換されています...いくつか点検をした後に、それについてのより多くの点検を – Chris

関連する問題