0

アップルプッシュ通知サービスのガイドラインを読みました。

単純な形式では、何らかの方法で不正な形式の通知パケットを送信した場合(たとえば、ペイロードが規定の制限を超えた場合)、APNは接続を切断することで応答します。

しかし、メッセージ(単純な形式)が正しい場合はどうなりますか?キープアライブパケットを送信した場合、APNは接続を維持しますか?これはDOSと見なされる可能性があるため、非常に多くの接続を確立したくありません。

4

1 に答える 1

1

私のコメントのハッシュ化されたバージョン、より詳細なもの:

  • APNSサーバーへの単一の接続を開き、デバイスID(正式にはUDIDではなくデバイストークン)のSQL(または同様の)データベースに接続し、これらを繰り返します-ペイロードを作成してから、これをAPNSサーバーに送信します。
  • また、デバイスリストのどこまで進んでいるかを確認して、APNSサーバーとの接続が切断された場合(または他の何かが発生した場合)に再試行できるようにすることも検討してください。
  • エラーが発生した場合、接続を切断する前に、APNSサーバーはエラー応答パケットを返します。これに関する詳細は、ドキュメントの表5-1にあります。リンクはこちらです。

これが私の最初のポイントの詳細のサンプルです:

// connect to your MySQL database
$con = mysql_connect("localhost", "username", "password");

// select a database
mysql_select_db("my_database", $con);

// run a query to grab your device tokens
$result = mysql_query("SELECT device_tokens FROM some_table");

// set your message
$msg = 'important update';

// create the payload
$body['aps'] = array('alert' => array('body' => $msg, 'action-loc-key' => 'Read'));

// convert to JSON
$payload = json_encode($body);

// setup APNS connection
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', 'password');

// open a connection to the APNS server
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

while ($row = mysql_fetch_array($result))
{
    $deviceToken = $row['device_tokens'];
    $apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $deviceToken)) . chr(0) . chr(strlen($payload)) . $payload;
    fwrite($apns, $apnsMessage, strlen($apnsMessage));
}

// close APNS connection
fclose($apns);

// close database connection
mysql_close($con);

...上記のコードのURLでサンドボックスサーバーとライブプッシュサーバーを切り替えることを忘れないでください。

于 2012-08-19T16:29:02.937 に答える