2016-07-15 3 views
2

新しいAPNプロバイダAPIを使用するために、PHPでプッシュサービスを書き直そうとしています。私ができるAPNsプロバイダAPIバッチリクエスト

$ch = curl_init("https://api.development.push.apple.com/3/device/$device_token"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"aps":{"alert":"Here I am","sound":"default"}}'); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic")); 
curl_setopt($ch, CURLOPT_SSLCERT, $pem_file); 
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret); 
$response = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

しかし、このコードで:複数のデバイスにつの通知を送信するのいずれかのベストプラクティスがある場合 私の質問は、私はすでにPHPでプッシュ通知を送信するための解決策を見つけた...、

です私はデバイストークンをURLに入れなければならないので、1つのデバイスにメッセージを送信してください。しかし、私は未知の量のデバイスにメッセージを送信したい。残念ながら、複数のデバイスにメッセージを送信するためのエンドポイントを見つけることができませんでした。


アップルのドキュメント(https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html)は、この意見:

は、複数の通知間のオープンのAPNを使用して接続してください。接続を繰り返し開いたり閉じたりしないでください。 APNは、迅速な接続と切断をDoS攻撃として扱います。

だから私はCURL requestfor-loopに入れて、すべてのデバイストークンをループするのは悪い習慣だと思います。

誰もこのケースを解決する方法の任意の提案ですか?

ありがとうございます。

答えて

1

curlではわかりませんが、一般に、ApnsプロバイダはApns Cloudに対して永続的な接続を維持する必要があります。単一のメッセージを使用して複数のデバイスにブロードキャストする方法はありません。 Apnsプロバイダはhttp/2(接続ごとに複数のストリーム)を活用し、複数の接続にまたがってメッセージを送信する必要がありますが、DoS攻撃として扱われるループ内の接続や切断は行わないでください。

接続ループを回避するには、メッセージをループに投稿する必要があります。接続/切断部分はループの一部であってはなりません。

私はそれが役に立ちそうです。

よろしく、

_Ayush
+0

接続ごとに複数のストリームを作成する方法を具体的に説明できますか? –

+0

こんにちは、私はJavaスクリプトの人ではありません。私は、単一のTCP接続でカプセル化された複数のストリームについて説明しています。例えばリンク: https://developers.googleを参照してください。com/web/fundamentals/performance/http2 / – Ayush

1

libcurlのが自動的に可能な限りオープン接続を維持しようと試みます。ループのため、セットの開始)

curl_setopt($ch, CURLOPT_POSTFIELDS, '{"aps":{"alert":"Here I am","sound":"default"}}'); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic")); 
curl_setopt($ch, CURLOPT_SSLCERT, $pem_file); 
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret); 

3:

1)カールハンドルを作成します:ハンドルの$ch = curl_init();

2)を設定し、適切なオプションをフォローするパターンは、次のことを行うことです

for ($tokens as $token) { //Iterate push tokens 

    $url = "https://api.development.push.apple.com/3/device/{$token}"; 

    curl_setopt($ch, CURLOPT_URL, $url); 

    $result = curl_exec($ch); 

    // Check result, handle errors etc... 

    } 

    curl_close($ch); // Close connection outside the loop 

上記のアプローチに従うと、接続を開いたままにして、Appleの要件に準拠する必要があります。

関連する問題