2016-07-15 94 views
2

我即將重寫PHP中的推送服務以使用新的APNs提供程序API。 我的問題是,如果在發送一個通知到多個設備...的最佳做法APNs提供程序API批量請求

我已經找到了解決方案與PHP發送推送通知:

$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); 

但有了這個代碼,我可以將消息發送到一個設備,因爲我必須將設備令牌放入URL中。但是我想將消息發送到未知數量的設備。不幸的是,我找不到將消息發送到多個設備的終端。


蘋果文檔(https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html)這樣說:

讓您連接與APN的多個通知打開;不要反覆打開和關閉連接。 APN將快速連接和斷開視爲拒絕服務攻擊。

所以我認爲將我的CURL request放入for-loop並將所有設備令牌循環都是不好的做法。

任何人有任何建議如何解決這種情況?

在此先感謝。

回答

1

不確定捲曲,但總的來說,Apns提供商必須保持與Apns Cloud的持續連接。無法使用單個消息向多個設備進行廣播。 Apns提供商應該利用http/2(每個連接多個流)並且還可以通過多個連接發送消息,但是不能在循環中進行連接和斷開連接,這將被視爲DoS攻擊。

避免連接循環,您應該在循環中發佈消息,連接/斷開連接部分不得是循環的一部分。

我希望它有幫助。

問候, _Ayush

+0

您可以詳細說明如何爲每個連接創建多個流,或許可以使用一些示例JavaScript代碼? –

+0

嗨,我不是一個Java腳本的人。儘管我可以幫助你解釋多個封裝在單個TCP連接中的流。例如請參閱鏈接 - https://developers.google。COM /網絡/基礎/性能/ http2 / – Ayush

1

的libcurl自動嘗試保持連接打開儘可能。按照該模式是做到以下幾點:在手柄上$ch = curl_init();

2)設置相應的選項:

1)創建捲曲手柄

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)開始的for循環,設置每個收件人的url並執行請求:

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的要求。