我们开发了一个iPhone应用程序,并且推送通知用于开发和临时版本正常工作。但是当我们尝试向我们的数据库中的真实用户设备发送推送通知时,我们得到了SSL连接重置,然后断开了管道错误。我们认为我们的数据库中可能有太多设备(超过70000个),所以无法同时发送所有消息。所以我们尝试将消息发送到1000个设备一次,但仍有100条消息出现“Broken pipe”错误。我们不确定这些邮件是否已发送。任何建议?获取SSL尝试进行推送通知时出现断开管道错误
回答
我们已经解决了这个问题。它因数据库表中的无效标记而中断。如果存在无效标记,则Apple apns服务将断开与我们的连接。由于连接中断,当您尝试再次发送消息时,它会出现“Broken Pipe”错误。基本的解决方案是找到写入管道是否成功,如果没有,只需断开连接,并在延迟后重新连接。
我希望你已经解释过你是如何编码的 - Mona Jun 14 at 23:52 – Mona 2013-06-19 21:32:36
通常,当我遍历所有用户的设备令牌时,如果其中任何一个失败,它打破链式并显示相同的错误,所有我们可以做的是用最近的设备令牌对用户进行排序,并在我们的结束时检查长度,之后它就起作用了。 谢谢你的回答帮助我!〜 – 2016-10-22 18:07:09
emagic是正确的,“无效管道”错误的一个原因可能来自无效标记。还有其他一些原因可能会发生。以下是来自Apple Technical Note TN2265:
最常见的问题是无效的设备令牌。如果来自沙盒环境的令牌来自 ,例如当您在内部测试 开发版本时,则无法将其发送到生产推送 服务。每个推送环境将为同一设备或计算机发出不同的令牌。如果您将设备令牌发送到错误的环境中,则推送服务会将该设备令牌视为无效令牌,并丢弃该通知。
无效的设备令牌也可能表示用户已从其设备或计算机中删除了您的 应用程序。您应该至少每天检查一次反馈 服务,以获取不再有效的设备令牌 。
其他可能的问题可能会比256 个字节发送有效载荷时间越长,你的有效载荷可能无法正确格式化,或者您 JSON字典有不正确的语法。
偶尔断开你的提供者空闲的时候是无关紧要的 ;只需重新建立连接并进行即可。如果推送服务器的一个 处于关闭状态,则负载均衡机制将 透明地将您的新连接导向另一台服务器,前提是您通过主机名而不是静态IP地址连接 。
上EMAGIC的回答延伸,这是我的PHP代码snipplet:
private $fp;
private function connect(){
$apnsHost = 'gateway.push.apple.com';
$apnsCert = 'certs/cert.pem';
$apnsPort = 2195;
$pass = "blah";
$streamContext = stream_context_create();
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert);
stream_context_set_option($streamContext, 'ssl', 'passphrase', $pass);
$this->fp = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $streamContext);
if (!$this->fp) return("Failed to connect: $err $errstr<br>");
echo 'Connected to APNS<hr />';
}
private function send(){
$this->connect();
foreach($pushes as $push) {
$payload['aps'] = array('alert' => $push->text, 'badge' => 0, 'sound' => 'default');
$payload2 = json_encode($payload);
$msg = chr(0) . pack('n', 32) . pack('H*', $push->token) . pack('n', strlen($payload2)) . $payload2;
try {
$result = fwrite($this->fp, $msg, strlen($msg));
}
catch (\Exception $e) {
fclose($this->fp);
echo('Error sending payload: ' . $e->getMessage());
sleep(5);
$this->connect();
}
}
}
- 1. 尝试点击推送通知时出现错误Android
- 2. 尝试推送到github时出现SSL错误
- 3. 使用notnoopapns向apns发送推送通知时出现ssl错误
- 4. 从PHP发送推送通知时出现主键错误
- 5. 当尝试通过php文件执行Apple推送通知时出错
- 6. 节点APN错误513尝试发送推送通知
- 7. 在Parse.com注册Android设备获取推送通知时出现114错误
- 8. 推送通知推送出现两次?
- 9. 在linux上部署后推送通知时出现错误
- 10. 使用示例代码推送通知时出现404错误
- 11. 推送通知不出现
- 12. Hive断开管道错误
- 13. 尝试推送到heroku时ExecJS错误?
- 14. 尝试在Roku通道中断开连接会引发错误
- 15. 尝试通过Twilio发送GIF时出现Invalid-Content-Type错误
- 16. Apple推送通知错误/ SSL错误20
- 17. 打开WordPress管理器时出现SSL错误管理
- 18. 运行Gradle测试时出现断管错误
- 19. 每当我打开我的应用程序时,推送通知不断出现
- 20. 尝试将推送通知发送到iOS设备 - 未收到推送通知
- 21. 推送通知错误
- 22. IOS推送通知错误
- 23. IOS推送通知错误
- 24. Bluemix - 推送通知错误
- 25. Yodlee - 尝试Cobrand登录时出现SSL错误
- 26. 尝试从GIT中删除时出现SSL错误
- 27. 尝试获取文件名长度时出现分段错误
- 28. 尝试获取图像时出现错误标题
- 29. 尝试获取节点数时出现属性错误
- 30. 尝试获取Android上的日期时出现错误CallLog.Calls
我们有同样的问题;尽管有100,000个用户。 据我们所知,通知将达到前100个,但之后不会。我只能假设发送的通知存在限制(通过计数或时间)。 真的可以与某人确认吗? – Wex 2010-05-19 16:48:49