锁定电话后异步UDP套接字断开管道,应用程序暂停在后台

时间:2011-06-16 20:07:46

标签: iphone objective-c sockets asyncsocket sigpipe

我在我的iPhone应用程序中使用AsyncUDPSocket第三方库,并且在大多数情况下它运行良好。我有一个AsyncUDPSocket的单例实例,用于我的所有网络流量。我的应用程序在后台注册了位置跟踪,并在后台运行时唤醒并通过网络发送位置更新数据包。这一切都在背景,前景,手机锁定或解锁状态下运行,除非我执行以下操作:

  1. 启动我的应用
  2. 在我的应用设置中停用位置跟踪功能 (所以没有背景醒来)
  3. 按主页按钮(应用程序进入后台,插座被“冻结”,其余应用程序)
  4. 锁定手机
  5. 解锁手机
  6. 恢复应用
  7. 尝试重新启动跟踪并从套接字发送内容。我一试错,就会收到SIGPIPE / EPIPE错误,应用程序崩溃。
  8. 我认为解决这个问题的最佳方法是在应用程序退出并且未启用后台跟踪时关闭并释放套接字,但是当我在{{上尝试[socket close][socket release]时1}},我收到了各种AsyncUDPSocket错误。我已经向开发团队提交了一个错误,但是想知道这里是否有人可以提供一些关于如何完全避免EXC_BAD_ACCESS错误或者在不释放它的情况下保持套接字存活的其他方法的想法。感谢。

2 个答案:

答案 0 :(得分:2)

很好的观察 - 是的,似乎在你将任务发送到后台然后锁定手机后,套接字就会被丢弃,下次你尝试使用它时会被一个SIGPIPE击中。

如何处理它的想法: SIGPIPE crash when switching background task (要么为整个应用程序设置忽略SIGPIPE,要么为套接字设置忽略,或者为它提供hanler)

PS。另外 - 似乎忽略SIGPIPE的设置不能与附加的调试器一起使用,因此与wak进行比较。

答案 1 :(得分:1)

万一有人好奇(根据这个问题的统计数据判断,他们不是),我无法确定导致SIGPIPE错误的原因,但最终解决了我的内存管理问题(这是由于我的委托中onUdpSocketDidClose的实现错误导致的,所以我可以在每次重新启动应用程序时重新初始化套接字。