我正在使用 Xcode 7,我想了解如何使用 BLE 配件和 CoreBluetooth 框架在 iOS9 中测试“状态保存和恢复”(请注意,我已经找到了 this question,但我觉得有必要更深入地理解这一点)。
我需要应用程序仅在用户手机在范围内时自动从配件传输一些数据,以防应用程序之前未运行。
我试图将其分解为反射(reflect)此用例不同变体的三个场景,即场景 A、场景 B 和场景 C。
有人可以向我解释测试以下场景所需的基本步骤吗?
这些场景也有意义吗?
场景 A:
1 - 应用发现配件并存储配件信息
2 - 应用/用户退出附件范围
3 - 应用被用户杀死
4 - 用户在应用未运行时重新进入附件范围。
5 - 预期事件:我希望激活状态恢复(在 CentralManager 中调用 willRestoreState 方法,在 AppDelegate 中调用 didFinishLaunchingWithOptions。
从这里我应该能够获得包括配件在内的外围设备列表,并决定是否要连接到它。
6 - 如果我决定连接,那么我希望该应用程序继续在后台运行(因为后台模式已激活)。
我如何测试这个场景?
场景 B:
1 - 应用发现配件并存储配件信息
2 - 应用程序连接到附件并向特征发送请求以开始传输数据
3 - 应用正在从附件接收数据
4 - 应用/用户退出附件范围
5 - 应用进入后台模式
6 - 当 App 在后台模式下运行时,用户重新进入附件范围。
5 - 预期事件:我希望激活状态恢复(在 CentralManager 中调用 willRestoreState 方法,在 AppDelegate 中调用 didFinishLaunchingWithOptions。
从这里我应该能够获得包括配件在内的外围设备列表,并看到状态为CONNECTED。然后我应该重新请求数据流(我假设没有办法恢复以前的流,对吗?)
6 - 应用应在后台继续流式传输
我如何测试这个场景?
场景 C:
1 - 应用发现配件并存储配件信息
2 - 应用程序连接到附件并向特征发送请求以开始传输数据
3 - 应用正在从附件接收数据
4 - 应用/用户退出附件范围
5 - 应用进入后台模式
6 - 用户终止应用
7 - 用户在 App 未运行时重新进入附件范围
8 - 预期事件:我希望激活状态恢复(在 CentralManager 中调用 willRestoreState 方法,在 AppDelegate 中调用 didFinishLaunchingWithOptions。
从这里我应该能够获得包括附件在内的外围设备列表并重新连接到它并重新请求数据传输(如场景 B 那样恢复)。
9 - 我希望应用程序继续在后台运行(因为后台模式已激活)并且应用程序应该继续在后台流式传输
我如何测试这个场景?
希望不要太困惑。
最佳答案
对于场景 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 - 抱歉,同样的故事。如果用户故意杀死你的应用程序,你就完蛋了。告诉他不要。
关于ios - 核心蓝牙 : testing state preservation and restoration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33122242/
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#
我是Ruby分析的新手,看起来像ruby-prof是一个受欢迎的选择。我刚刚安装了gem并调用了我的程序:ruby-prof./my-prog.rb但是,输出非常冗长,因为包含所有Ruby核心和标准库方法以及其他gem的分析数据。例如,前三行是:8.790.0110.0100.0000.0013343*String#%7.280.0780.0090.0000.0692068*Array#each4.930.0380.0060.0000.0321098*Array#map这对我来说不是什么有用的信息,因为我已经知道我的程序经常处理字符串和数组,并且大概已经对这些类进行了优化。我只关心我代
当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab
我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文
在ruby中...我有一个由外部进程创建的IO对象,我需要从中获取文件名。然而我似乎只能得到文件描述符(3),这对我来说不是很有用。有没有办法从此对象获取文件名甚至获取文件对象?我正在从通知程序中获取IO对象。所以这也可能是获取文件路径的一种方式? 最佳答案 关于howtogetathefilenameinC也有类似的问题,我将在这里以ruby的方式给出这个问题的答案。在Linux中获取文件名假设io是您的IO对象。以下代码为您提供了文件名。File.readlink("/proc/self/fd/#{io.fileno}")例
点击->操作系统复习的文章集目录操作系统线程线程是什么进程与线程的关系用户态/内核态操作系统资源管理内核态用户态内核态/用户态切换程序运行类型分析计算密集型IO密集型结合进程,线程来理解程序运行类型分析协程基础上下文切换协程协程为什么叫协作式线程?协程的优缺点操作系统线程典型问题:简述进程和线程的区别以下内容带您一步步了解线程是什么比进程更小的独立运行的基本单位-线程(Threads)线程的提出主要是为了提高系统内程序并发执行的程度,从而进一步提升系统的吞吐量,充分发挥多核CPU的优越性而设计的引入进程是为了操作系统更加方便地管理程序,使得多个程序能并发管理和执行而线程则是为了减少程序在并发执