【问题标题】:AsyncUDPSocket broken pipe after locking phone with application suspended in background锁定手机后 AsyncUDPSocket 断开管道,应用程序在后台暂停
【发布时间】:2011-06-16 20:07:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone objective-c sockets asyncsocket sigpipe


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 2015-12-17
        • 1970-01-01
        • 2021-12-11
        • 2015-01-15
        • 2013-09-12
        相关资源
        最近更新 更多