APNs提供程序API批量请求
问题描述:
我即将重写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中。但是我想将消息发送到未知数量的设备。不幸的是,我找不到将消息发送到多个设备的终端。
让您连接与APN的多个通知打开;不要反复打开和关闭连接。 APN将快速连接和断开视为拒绝服务攻击。
所以我认为将我的CURL request
放入for-loop
并将所有设备令牌循环都是不好的做法。
任何人有任何建议如何解决这种情况?
在此先感谢。
答
不确定卷曲,但总的来说,Apns提供商必须保持与Apns Cloud的持续连接。无法使用单个消息向多个设备进行广播。 Apns提供商应该利用http/2(每个连接多个流)并且还可以通过多个连接发送消息,但是不能在循环中进行连接和断开连接,这将被视为DoS攻击。
避免连接循环,您应该在循环中发布消息,连接/断开连接部分不得是循环的一部分。
我希望它有帮助。
问候, _Ayush
答
的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的要求。
您可以详细说明如何为每个连接创建多个流,或许可以使用一些示例JavaScript代码? –
嗨,我不是一个Java脚本的人。尽管我可以帮助你解释多个封装在单个TCP连接中的流。例如请参阅链接 - https://developers.google。COM /网络/基础/性能/ http2 / – Ayush