默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的。也就是说,你可以通过宣布你的应用程序支持后台处理模式来允许你的一个应用程序把你从一个挂起状态中唤醒来执行某些蓝牙相关的事件。

  即使你的应用程序支持一种或者两种CoreBluetooth后台执行模式,那么他也不会永远运行。在某些时候,系统也许由于当前的前台应用程序而终止你的应用程序来释放内存,这将会导致任何活跃的或者挂起的连接会丢失。在iOS7中,CoreBluetooth 支持为Central 和 Peripheral 储存状态信息并且在程序启动的时候,恢复这些状态信息。你可以使用这种技术来支持蓝牙设备的长期运行。

    • Foreground-only Apps

  像大多数的iOS app一样,如果你没有请求执行后台任务的权限,那么在app 进入后台模式之后会立刻进入到挂起状态。在挂起状态时,你的app将不能执行蓝牙相关的任务。在它恢复进入到前台模式之前,他也不会意识到并响应蓝牙相关的事件

  在Central端,没有宣称支持任何一种蓝牙后台模式的只支持前台的APP当他在后台时,或者进入挂起状态时,它都不能进行扫描,发现正在广播的Peripheral设备的任务。在Peripheral端,广播将会停止,并且任何Central尝试访问app已经发布的Service的动态Characteristic数据的时候,都会收到一个错误。

  取决于用例,这些默认的行为将会在各方面影响你的app。举个例子,想象你正在和你刚刚连接到的Peripheral上的数据进行交互。假设你的APP进入到了挂起状态(可能原因,如用户切换到了另一个app),如果连接到Peripheral的连接在你的APP挂起的时候丢失了,那么当你恢复到前台模式的时候你讲不会意识到任何断开连接的事件发生。

    •   Take advantage of Peripheral Connection Options

  当前台app进入到挂起状态时候发生的所有的蓝牙相关的事件都会被系统放到队列中,当APP回到前台的时候传递给APP。也就是说,当某个Central 事件发生的时候,Core Bluetooth 提供了一种提醒用户的方式。 用户可以使用这些警告来决定是否要将应用程序带回到前台。

你可以使用这些alerts,通过CBCentralManager在调用 connectionperipheral:options方法连接CBPeripheral的时候传入以下参数:

      • CBConnectionPeripheralOptionNotifyOnConnectionKey---当你想要你的系统在挂起状态时候,正好有一个连接成功执行,系统抛出一个连接警告
      • CBConnectionPeripheralOptionNotifyOnDisconnectKey---当你想要你的系统在你的APP挂起状态收到任何断开连接事件的时候抛出一个断开连接警告
      • CBConnectionPeripheralOptionNotifyOnNotifycationKey---当你想要你的系统在你的APP处于挂起状态时候,收到的任何notification都爆出一个警告的时候使用
    • Core Bluetooth Background Execution Modes

  如果你的APP需要在后台运行执行某些蓝牙相关的任务,那么它必须宣布他支持一种蓝牙后台执行模式在它的Info.plist文件中。当你的app宣称这个之后,系统将会把它从挂起状态中唤醒来处理蓝牙相关的事件。这种支持对那些与BLE设备按照固定的时间间隔来交互的app来说是十分重要的,比如一个心率监测器。

   一个app可以支持的蓝牙后台运行模式有两种,一种是给实现了Central角色的app,另一种是给实现了Peripheral角色的appl.如果你的app两者都实现了,那么它也可以宣布它支持两种蓝牙后台执行模式。蓝牙后台模式可以通过在Info.plist添加UIBackgroundModes key,键值设置为一个包含以下字符串的数组:

      • bluetooth-central,
      • bluetooth-peripheral
    • The bluetooth-Central Background Execution Mode

  该模式下允许你的APP在后台执行某些蓝牙相关的工作。在后台也可以扫描连接到Peripheral,发现并且和Peripheral数据进行交互。除此之外当有任何CBCenralManagerDelegate 和CBPeripheralDelegate方法被调用的时候系统将会唤醒你的APP。

但是值得注意的是,scan 在前台和后台两种模式下是不一样的。在后台模式下的scan:

      • CBCenralManagerScanOptionAllowDuplicatsKey 会被汇率,一个advertsing Peripheral 被两次发现那么也只会合并成一个发现事件
      • 如果所有扫描peripheral的程序都运行在后台,那么发现Peripheral的时间间隔就会增加。
    • The bluetooth-Peripheral Background Execution Mode

该模式下系统会唤醒你的APP来处理read,write,subscription事件。后台模式下也允许你的APP进行广播。但是后台广播不同于前台:

      • CBAdvertisementDataLocalNameKey 会被忽略,并且Peripheral的local name 不会被广播
      • 所有包含在CBAdvertismentDataServiceUUIDsKey 中的Services UUIDs 将会被放在overflow”区域;他们只被那些明确的扫描他们的设备发现。
      • 如果所有广播的APP都在后台,那么发送广播的频率将会降低
    • Use Background Execution Modes Wisely

后台模式很有用,但是请你慎用,因为后台模式要经常使用无线电,这是很费电的。 需要遵循以下几条规范:

      • app 应该基于会话,并且提供界面给用户,允许他们控制开关蓝牙相关的事件
      • app 被唤醒后有10秒钟处理事件,保证尽可能快,以便再次切换到挂起状态。在后台中花费太多的时间将会被系统拒绝或者杀掉。
      • 被唤醒后APP不要执行与唤醒原因无关的事情

原创翻译:iOS 应用程序 蓝牙后台运行的更多相关文章

  1. iOS开发小技巧--iOS程序进入后台运行的实现

    iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...

  2. 【iOS系列】-程序开启后台运行

    [iOS系列]-程序开启后台运行 iOS程序是伪后台的运行,可是有时候我们需要让其在后台也要进行一些操作,我们可以让其伪装成音乐的APP,这样就可以让程序后台进行相关操作了,具体做法如下: 1:在Ap ...

  3. linux nohup命令实现退出终端后程序继续后台运行

    Unix/Linux下一般想让某个程序在后台运行,很多都是使用&在程序结尾来让程序自动运行:但如果要想在退出终端后,程序依然还在后台运行,则要用nohup与&组合来实现. nohup ...

  4. 在windows中:双击运行Python程序、后台运行Python程序

    在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...

  5. linux nohup命令使程序在后台运行的方法

    在linux操作系统中从后台一直运行某个程序的方法,就是使用nohup命令了. Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行. 比如要运行 ...

  6. Ubuntu中如何使得程序在后台运行

    Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...

  7. iOS开发之使程序在后台运行

    方法一(此方法不太可靠): 开启程序后台运行: [application beginBackgroundTaskWithExpirationHandler:^{ //后台运行过期后会调用此block内 ...

  8. ios实现程序切入后台,实现后台任务

    首先,iOS 会再持续切入后台,给我们5秒钟的时间去处理相关数据,5秒后,程序不会再执行任何代码,处于挂起状态. // 项目需求,按下Home切换后台后向服务器传一些数据,废话不多说,直接上代码 /* ...

  9. iOS保持App真后台运行

    https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就 ...

随机推荐

  1. vs2015安装没有wim32

    刚开始在官网上下载VS2015没在意太多,选择了默认安装,结果是没有win64的,所以就不能写c代码.默认安装很多库都没有,所以要什么都得下载.转载一篇文章

  2. python ^M 产生的原因 及 lxml 如何获取text的原因

    其实跟踪一下会发现,^M 是由于 /r/n 所造成的. article = dom_c.xpath('//td[@id="article_content"]//text()')co ...

  3. golang入门--一个简单的http client

    看完<Go Web 编程>的前两章就可以开始写代码了. import ( "fmt" "io/ioutil" "log" &qu ...

  4. Vim识别编码

    http://blog.chinaunix.net/uid-20357359-id-1963123.html

  5. [LeetCode#84]Largest Rectangle in Histogram

    Problem: Given n non-negative integers representing the histogram's bar height where the width of ea ...

  6. BZOJ2342: [Shoi2011]双倍回文

    2342: [Shoi2011]双倍回文 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 923  Solved: 317[Submit][Status ...

  7. REST client 基于浏览器的测试工具

    以前在开发webservice服务,都是自己基于HTTP协议,自己写一个测试程序来进行测试,最近在研究RestFul,对以前webservice服务进行了重构,总结了不少经验,今天就给大家介绍下几款R ...

  8. 教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像

     发布于 2014-07-08 作者 陈 忠岳 对于 Azure 的社区管理虚拟机资源库--VM Depot--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...

  9. 【转】模块编译Android源码方法

    原文网址:http://blog.csdn.net/androidlover1991/article/details/17014055 实际开发中,并不需要每次都编译所有源代码,只需要编译自己修改的模 ...

  10. n个灯,k个人的开灯问题

    /**有n个灯,编号为1-n.第一个人把所以灯打开,第二个人按下 所有编号为2的倍数的开关,第三个人按下3的倍数的开关,依次类推, 一共有k个人,问最后有哪些灯开着? 样例输入: 7 3 样例输出: ...