如何在iPhone上一次性向多个设备发送推送通知?

4

我希望能够向所有已注册应用程序的设备发送相同的消息,但是如何在不建立多个连接的情况下发送它们呢...

我的当前PHP代码:

ctx = stream_context_create();  
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');  
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
if (!$fp)
{
  print "Failed to connect $err $errstr\n";
  return;
}
$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;
fwrite($fp, $msg);

你能否把你的代码格式化得更好一些,通过在每行代码前面放置4个空格?现在它很难阅读。 - Darin Dimitrov
希望现在它可读性更好了... :) - Prabh
@Prabh -- 你能给我展示一下你解决这个问题的最终代码吗?我也在尝试实现同样的功能 -- 谢谢! - tamak
嗨,Tamak,那是很久以前的事了,所以我没有代码,但当时我使用了for循环来向所有设备发送消息 :( - Prabh
2个回答

10

总之,你不能这样做。你需要向每个令牌发送一条消息。

它不像电子邮件那样可以有多个收件人。

连接打开后,你可以发送一堆消息,这也是首选的方式(基于苹果的 SDK)。

来自 SDK:

http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW2

你还应该跨多个通知保留与 APNs 的连接。APNs 可能会认为快速而反复建立和拆除的连接是一种拒绝服务攻击。在出现错误时,APNs 会关闭发生错误的连接。


我是PHP新手,这是否意味着您只需创建一次连接,例如$fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);,然后可以多次使用fwrite($fp, $msg);(甚至1000次)? - Darpan
链接已失效。 - Darpan

3

您可以使用一条连接来发送多个消息,因此不需要打开多个连接。但是,您不能将一个消息用于多个设备。


Bolhoed,你能告诉我怎么做吗? - Prabh
1
在同一连接上执行多个fwrite操作即可。 - Kevin Renskers
嗨,@mixedCase。我尝试了多次进行多个 fwriter(即100个或更多),但并没有成功,其中许多推送并没有被发送,这可能是为什么?如果要向1000多个用户发送推送,我应该做些什么呢? - Darpan
多次写入可以工作,但如果其中一个设备出现问题,苹果将不会发送任何其他连接,该如何处理?而且它不会终止连接,因此您不知道哪个设备出了问题。 - Srneczek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接