1

appstoreにアプリがあり、プッシュ通知が登録されています。それらは常に正常に機能していますが、「グローバル」プッシュを送信しようとしたところ、何か奇妙なことが起こりました。これは、サーバー側の.phpファイルにあるものです。

//Loop through tokens in tokenArray
$i = 0;
$t = 0;
foreach($tokenArray as $token)
{
    $t++;
    // Make notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $token) . pack('n', strlen($payload)) . $payload;

    // Send
    $result;
    if($message != null)
    {
        $result = fwrite($fp, $msg, strlen($msg));
    }

if ($result)
    $i++;
}
// Close the connection to the server
fclose($fp);

if($i == 0)
{
    echo 'The message was not delivered to anyone out of '.$t.'.';
}
else
{
    echo 'The message was delivered to '.$i.' out of '.$t.'.';
}

これより前のコードは常に機能していましたが、それでも機能します。tokenArrayには、SELECT Token FROM Tokens;SQLの場合と同様に、トークンを含むテーブルが含まれています。これは機能します。

開発中、自分のトークンだけが登録されると、携帯電話からアプリを削除したにもかかわらず、常に「メッセージは4つのうち4つに配信されました」と表示されていました。ここで、このコードを使用して、約1100の登録済みトークンすべてに送信しようとしました。メッセージが送信され、出力は「メッセージは1194のうち588に配信されました」でした。そして、私たちは自分たちで通知を受け取りませんでした!どういう意味ですか?

約5分後、自分のトークンのみを含む配列でtokenArrayを切り替えて、新しいプッシュを送信しました。それを電話で受け取りました。また、失敗した(チェックした)前の「tokenArray」に「working」トークンが存在することも知っています。

プッシュ通知は運が左右するゲームですか!?if($result)失敗するとはどういう意味ですか?そして、なぜ500回以上フェイルオーバーしたのでしょうか。

証明書と.pemおよび.p12などはすべて機能しています。push1とpush2で行った唯一の違いは、SQLサーバーの元のテーブルからのクローンである別のテーブルを使用することでした。Table2には私のトークンしかなく、機能しました。その他の変更は行われませんでした。後で、すべてのトークンがに存在するSELECT Token FROM Tokens2ことを証明しました。 誰かがプッシュを受け取ったかどうか、またはアプリがまだインストールされている1200の「ラッキー」588がそれを受け取ったかどうかはわかりません。Tokens2Tokens

これの原因は何ですか?半分がすでに受信している場合に備えて、あえて別の送信を送信することはありません。一度にプッシュを送信できる速度に制限はありますか?または私たちは何が間違っているのですか?!助けてください、ありがとう。

4

2 に答える 2

2

ええと、私はphpを知らないので、あなたのコードは私を助けません。ただし、説明に基づくと、DB内のデバイストークンの一部が無効である可能性があります。Appleのサーバーは、無効なデバイストークンを含む通知を受け取ると、ソケットを閉じます。悪いトークンのメッセージの後にすでにメッセージを書いている場合、それらはAppleに届きません。ソケットが閉じられたことを検出して新しいソケットを開いた後でのみ、メッセージがAppleに届きます。拡張通知形式を使用しない場合は、使用を開始することをお勧めします。これにより、Appleから無効なメッセージのIDを取得し、無効なトークンからDBをクリーンアップできます。ただし、拡張フォーマットを使用しても、すべてのエラーを検出できるとは限りません(メッセージの送信が非常に遅い場合を除きますが、

于 2013-02-05T20:43:02.827 に答える
1

メインループでは、Appleがソケット接続を閉じる場合は考慮されていません。Eranが述べたように、無効なトークンを送信すると、Appleはその時点で接続を閉じ、fwriteを使用したそれ以降の書き込みは失敗します。したがって、589番目のトークンが無効な場合、他のプッシュはAppleに送信されません。

これは、ロジックに適合する簡単な修正です。この部分は、メインループのifステートメントを置き換えます。

if ($result) {
    $i++;
} else {
    fclose($fp);
    // Add code here to re-open socket-connection with Apple.
}

Eranが言及した拡張通知形式に加えて、APNSフィードバックAPIを使用して、Appleに無効なトークンを照会し、データベースからそれらを削除することもできます。あなたはここでそれについてのより多くの情報を見つけることができます:http://bit.ly/14RPux4

一度に送信できるプッシュ通知の数に制限はありません。私は数秒で数千を送りました。唯一の実際の制限は、ユーザーとAPNSサーバー間の接続です。

于 2013-02-06T13:35:32.113 に答える