5

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

  1. 启动我的应用
  2. 在我的应用设置中禁用位置跟踪(因此没有后台唤醒)
  3. 按下主页按钮(应用程序进入后台,套接字与应用程序的其余部分“冻干”)
  4. 锁定手机
  5. 解锁手机
  6. 简历应用
  7. 尝试重新启动跟踪并从套接字发送一些东西。我一尝试,就会收到SIGPIPE/EPIPE错误并且应用程序崩溃。

我认为处理此问题的最佳方法是在应用程序退出且未启用后台跟踪时关闭并释放套接字,但是当我尝试[socket close][socket release]打开时AsyncUDPSocket,我会收到各种EXC_BAD_ACCESS错误。我已经向开发团队提交了一个错误,但想知道这里是否有人可以就如何SIGPIPE完全避免错误或其他方式在不释放套接字的情况下保持套接字存活提出一些想法。谢谢。

4

2 回答 2

2

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

关于如何在这里处理它的想法: 切换后台任务时SIGPIPE崩溃 (它要么为整个应用程序的SIGPIPE设置忽略,要么为套接字设置忽略,或为其提供hanler)

附言。也 - 似乎忽略 SIGPIPE 的设置不适用于附加的调试器,所以比较和 w/o。

于 2011-11-26T05:50:49.017 回答
1

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

于 2011-06-24T14:16:07.767 回答