iOS:应用程序从后台返回后访问 EAOutputStream 时的 SIGPIPE

Posted

技术标签:

【中文标题】iOS:应用程序从后台返回后访问 EAOutputStream 时的 SIGPIPE【英文标题】:iOS: SIGPIPE while accessing EAOutputStream after app returns from background 【发布时间】:2014-05-13 22:21:39 【问题描述】:

我有一个 iPhone 应用程序 (ios 7.0),它通过 ExternalAccessory 库与蓝牙 2.1 传感器设备进行交互。如果应用程序通过任何常用方法(锁定、主页按钮、自动睡眠等)进入后台,它会在尝试继续写入应用程序用于通信的EASession 上的NSOutputStream 时获得一个 SIGPIPE与设备。我还收到来自EAOutputStream 的内部错误,说发生了写入错误。

从那时起,我永远无法写入输出流,该输出流总是返回 NOhasSpaceAvailable,状态为 5(到达流结束)。

潜在兴趣:EASession 指向的EAAccessory 显示connected: NO,但来自[[EAAcessoryManager sharedAccessoryManager] connectedAccessories] 的那个显示connected: YES。它们具有相同的 connectionId 属性。在这种情况下,传感器设备的链接灯保持亮起,访问“设置”>“蓝牙”屏幕将设备显示为“已连接”。强制退出应用并重新启动是恢复通信的唯一方法。

有谁知道我应该如何正确处理这个问题?我是否需要在应用进入后台之前向流发送“关闭”命令并在返回时再次“打开”它们?

【问题讨论】:

【参考方案1】:

我通过在后台处理过程中关闭流来解决此问题。似乎在应用程序的后台保留一个 EASession 是一个坏主意。即使我没有得到 SIGPIPE,它也被替换为 EXEC_BAD_ACCESS。

【讨论】:

以上是关于iOS:应用程序从后台返回后访问 EAOutputStream 时的 SIGPIPE的主要内容,如果未能解决你的问题,请参考以下文章

Cordova iOS 应用程序,从后台模式返回后的页面性能问题

从后台返回时iOS应用程序请求失败

在从主线程访问后,不得从后台线程对 > 布局引擎进行修改

UINavigationController 从后台返回后失去对视图的跟踪

进入后台、复制新文本并返回应用程序后如何从 UIPasteboard 中检索文本?

iOS:在多个后台线程完成之前不要从函数返回