2016-07-15 76 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的要求。