3

次のコードは、送信先のデバイスの数が 2 の場合、つまり両方がプッシュ通知を受信する場合に正常に機能します。しかし、その制限を 100 に上げると、プッシュ通知は受信されなくなります。

これを読んだところ、バッチ通知を正しく送信しているようです(つまり、単一の接続を介した複数のリクエスト)。接続のタイムアウトは適切に高く設定されています (60 秒)。コードの出力はすべて順番に見えます。Apache エラー ログには何も記録されていないため、どこに問題があるのか​​わかりません。

私の顧客は本当にハッキングされています。誰か助けてくれませんか??

関数 sendIosPushs() {

$payload['aps'] = array('alert' => pushMessage, 'badge' => badgeNumber, 'sound' => 'default');
$payload = json_encode($payload);

//$statement = "SELECT * FROM push_ios WHERE device_token = 'device token of my iphone" OR device_token = 'device token of my ipod'; //works selecting my two devices from table
$statement = "SELECT * FROM push_ios"; //doesn't work when selecting all devices from table


$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', apnsCert);

$connectTimeout = 60;
$apns = stream_socket_client('ssl://' . apnsHost . ':' . apnsPort, $error, $errorString, $connectTimeout, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);

$numDevices = 0;
$numRequestsSent = 0;
$result = mysql_query($statement);
while ($row = mysql_fetch_assoc($result)) {
    $numDevices++;
    try {
        $deviceToken = $row['device_token'];

        //$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', $deviceToken) . chr(0) . chr(strlen($payload)) . $payload;
        $apnsMessage = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; //from http://stackoverflow.com/questions/1642411/sending-multiple-iphone-notifications

        $fwriteRes = fwrite($apns, $apnsMessage, strlen($apnsMessage));
        echo "Push sent to " . $deviceToken . "<br />\n";

        $numRequestsSent++;
    }
    catch(Exception $e) {
        echo "1. Exception: " . $e->getMessage() . "<br />\n";
    }
}

fclose($apns);


if ($error != 0 || (isset($errorString) && strlen($errorString) > 0 )) {
    echo "ERROR: " . $error . " - ". $errorString . "<br />\n";
}

return $numDevices . " iOS devices. " . $numRequestsSent . " requests sent.";

}

4

1 に答える 1

4

DB に無効なデバイス トークンが含まれている可能性があります。

無効なデバイス トークンの場合、(メッセージ ID とメッセージの有効期限を送信する) 新しいバイナリ形式を使用すると、Apple はエラー応答を返しますが、使用しません。あなたの場合、無効なトークンは単にソケットを閉じますが、問題の原因となったメッセージを知る方法はありません。

エラー チェックについては、こちらを参照してください。形式についてはこちらをお読みください。

于 2013-06-14T22:36:48.540 に答える