我正在使用Xcode 7,我想了解如何测试"状态保存和恢复"在iOS9中使用BLE附件和CoreBluetooth框架(请不要我已经找到this question,但我觉得有必要更深入地理解这一点。)
我需要应用程序仅在用户的手机在范围内时自动从附件传输一些数据,以防该应用程序以前没有运行。
我尝试在三个场景中对此进行细分,反映了此用例的不同变化,即场景A,场景B和场景C.
有人能够向我解释测试以下方案所需的基本步骤吗?
这些情况也有意义吗?
情景A:
1 - 应用程序发现附件并存储附件信息
2 - app / user退出配件范围
3 - app被用户杀死
4 - 用户在App未运行时重新进入配件范围。
5 - 预期事件:我希望激活状态恢复(在CentralManager中调用 willRestoreState 方法以及在AppDelegate中调用 didFinishLaunchingWithOptions 。
从这里,我应该能够获得包括配件在内的外围设备列表,并决定是否要连接它。
6 - 如果我决定连接,那么我希望应用程序继续在后台运行(因为后台模式已激活)。
我该如何测试这种情况?
方案B:
1 - 应用程序发现附件并存储附件信息
2 - app连接到附件并向特征发送请求以开始传输数据
3 - app正在从附件中接收数据
4 - app / user退出附件范围
5 - app进入后台模式
6 - 当App在后台模式下运行时,用户重新进入配件范围。
5 - 预期事件:我希望激活状态恢复(在CentralManager中调用 willRestoreState 方法以及在AppDelegate中调用 didFinishLaunchingWithOptions 。
从这里我可以获得包括配件在内的外围设备列表,并查看状态是已连接。然后我应该重新请求数据流(我假设没有办法恢复上一个流,对吗?)
6 - app应该在后台继续播放
我该如何测试这种情况?
方案C:
1 - 应用程序发现附件并存储附件信息
2 - app连接到附件并向特征发送请求以开始传输数据
3 - app正在从附件中接收数据
4 - app / user退出附件范围
5 - app进入后台模式
6 - 用户杀死了应用
7 - 用户在App未运行时重新进入配件范围
8 - 预期事件:我希望激活状态恢复(在CentralManager中调用 willRestoreState 方法以及在AppDelegate中调用 didFinishLaunchingWithOptions 。
从这里我应该能够获得包括附件在内的外围设备列表并重新连接到它并重新请求数据传输(恢复它与场景B一样)。
9 - 我希望应用程序继续在后台运行(背景模式已激活),应用程序应继续在后台运行
我该如何测试这种情况?
希望不会太混乱。
答案 0 :(得分:1)
对于情景A,我怀疑你可以做任何事情。如果用户通过双击“主页”按钮并向上滑动应用程序来杀死您的应用程序,该应用程序就会消失,并且不再参与所有这些花哨的蓝牙小工具。同样适用于从未启动的应用程序 - iOS不会告诉它任何东西和/或尝试将其唤醒。
在方案B中,您很可能不需要处理willRestoreState
,因为现代智能手机(5s,6)似乎并没有杀死您暂停的应用程序,即使在它之上启动了一堆重型应用程序。当您离开配件系列时,该应用程序将悄然断开连接。然后,如果您要指示它立即再次开始扫描配件(在didDisconnectPeripheral
中),它将持续很长时间。不是经常,但仍然。因此,当您再次进入配件范围时,iPhone最终会连接到它并触发所有必需的回调。 willRestoreState
似乎只适用于iPhone 4s,也许是iPhone 5,但我没有玩这个功能很长时间以至于绝对确定。
如果您确实需要测试willRestoreState
方案,可以A)向didFinishLaunchingWithOptions
和willRestoreState
添加本地通知以确保它们被触发并且B)在Xcode中运行您的应用然后按CMD +停止它。或单击Xcode中的方形按钮。这将导致应用程序以与系统在内存问题上将其终止相同的方式终止,因此您应该看到通知。从现在开始,您可以编写代码,添加日志语句并观察设备日志中发生的情况。
测试状态恢复的另一种方法是在点击按钮后调用kill(getpid(), SIGKILL);
。
情景C - 抱歉,同样的故事。如果用户故意杀死你的应用程序,那你就搞砸了。告诉他不要。