2

我正在使用 Xcode 7,我想了解如何使用 BLE 附件和 CoreBluetooth 框架在 iOS9 中测试“状态保存和恢复”(请不要说我已经找到了这个问题,但我觉得有必要了解更多深度)。

只有当用户的手机在范围内时,我才需要应用程序自动从附件传输一些数据,以防应用程序之前没有运行。

我试图在反映该用例的不同变化的三个场景中对此进行分解,即场景 A、场景 B 和场景 C。

有人可以向我解释测试以下场景所需的基本步骤吗?

这些场景也有意义吗?

  • 情景A:

    1 - 应用发现配件并存储配件信息

    2 - 应用程序/用户退出附件范围

    3 - 应用程序被用户杀死

    4 - 用户在 App 未运行时重新进入附件范围。

    5 - 预期事件:我希望激活状态恢复(在 CentralManager 中调用willRestoreState方法以及在 AppDelegate 中调用didFinishLaunchingWithOptions

    从这里我应该能够获取包括附件在内的外围设备列表并决定是否要连接到它。

    6 - 如果我决定连接,那么我希望应用程序继续在后台运行(因为激活了后台模式)。

我该如何测试这种情况?


  • 场景 B:

    1 - 应用发现配件并存储配件信息

    2 - 应用程序连接到附件并向特征发送请求以开始传输数据

    3 - 应用程序正在从附件接收数据

    4 - 应用程序/用户退出附件范围

    5 - 应用程序进入后台模式

    6 - 当应用程序在后台模式下运行时,用户重新进入附件范围。

    5 - 预期事件:我希望激活状态恢复(在 CentralManager 中调用willRestoreState方法以及在 AppDelegate 中调用didFinishLaunchingWithOptions

    从这里我应该能够获取包括附件在内的外围设备列表,并看到状态为CONNECTED。然后我应该重新请求数据流(我假设没有办法恢复上一个流,对吗?)

    6 - 应用程序应该在后台继续流式传输

我该如何测试这种情况?


  • 场景 C:

    1 - 应用发现配件并存储配件信息

    2 - 应用程序连接到附件并向特征发送请求以开始传输数据

    3 - 应用程序正在从附件接收数据

    4 - 应用程序/用户退出附件范围

    5 - 应用程序进入后台模式

    6 - 用户杀死应用程序

    7 - 用户在 App 未运行时重新进入附件范围

    8 - 预期事件:我希望激活状态恢复(在 CentralManager 中调用willRestoreState方法以及在 AppDelegate 中调用didFinishLaunchingWithOptions

    从这里我应该能够获取包括附件在内的外围设备列表并重新连接到它并重新请求数据传输(如方案 B 那样恢复它)。

    9 - 我希望应用程序继续在后台运行(因为激活了后台模式)并且应用程序应该在后台继续流式传输

我该如何测试这种情况?

希望不要太混乱。

4

1 回答 1

1

对于场景 AI 怀疑你可以做任何事情。如果用户通过双击主页按钮并向上滑动应用程序来终止您的应用程序,那么该应用程序就会消失并且不再参与所有这些花哨的蓝牙聊天。同样适用于从未启动的应用程序 - iOS 不会告诉它任何内容和/或尝试唤醒它。

在场景 B 中,您很可能不需要处理willRestoreState,因为现代智能手机(5s、6)似乎并没有杀死您暂停的应用程序,即使在它上面启动了一堆重型应用程序。当您离开配件范围时,该应用程序将安静地断开连接。然后,如果您将指示它立即再次开始扫描附件(在 中didDisconnectPeripheral),它会这样做很长时间。不是太频繁,但仍然如此。因此,当您再次进入配件范围时,iPhone 最终会连接到它并触发所有必需的回调。willRestoreState似乎只与 iPhone 4s 相关,也许是 iPhone 5,但为了绝对确定,我很久没有使用这个功能了。

如果你真的需要测试willRestoreState场景,你可以 A) 添加本地通知didFinishLaunchingWithOptionswillRestoreState确保它们被触发,B) 在 Xcode 中运行你的应用程序,然后按 CMD+ 停止它。或单击 Xcode 中的方形按钮。这将导致应用程序终止,就像系统会在内存问题上终止它一样,因此您应该会看到您的通知。从现在开始,您可以编写代码、添加日志语句并观察设备日志中发生的情况。

另一种测试状态恢复的方法是kill(getpid(), SIGKILL);在点击按钮后调用。

场景 C - 对不起,同样的故事。如果用户故意杀死你的应用程序,你就完蛋了。告诉他不要。

于 2016-02-09T12:15:29.083 回答