原创翻译:iOS 应用程序 蓝牙后台运行
默认情况下,普通的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 应用程序 蓝牙后台运行的更多相关文章
- iOS开发小技巧--iOS程序进入后台运行的实现
iOS程序进入后台运行的实现 视频中看到老师用的iOS7,代码中有开启timer,无限请求数据的功能,但是切换到后台,代码就不打印了 自己用的iOS9,进入后台还是可以打印的,再次进入前台也可以正常运 ...
- 【iOS系列】-程序开启后台运行
[iOS系列]-程序开启后台运行 iOS程序是伪后台的运行,可是有时候我们需要让其在后台也要进行一些操作,我们可以让其伪装成音乐的APP,这样就可以让程序后台进行相关操作了,具体做法如下: 1:在Ap ...
- linux nohup命令实现退出终端后程序继续后台运行
Unix/Linux下一般想让某个程序在后台运行,很多都是使用&在程序结尾来让程序自动运行:但如果要想在退出终端后,程序依然还在后台运行,则要用nohup与&组合来实现. nohup ...
- 在windows中:双击运行Python程序、后台运行Python程序
在windows中:双击运行Python程序.后台运行Python程序 安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退.怎样避免闪退呢? 我们用python的日志输出程 ...
- linux nohup命令使程序在后台运行的方法
在linux操作系统中从后台一直运行某个程序的方法,就是使用nohup命令了. Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行. 比如要运行 ...
- Ubuntu中如何使得程序在后台运行
Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...
- iOS开发之使程序在后台运行
方法一(此方法不太可靠): 开启程序后台运行: [application beginBackgroundTaskWithExpirationHandler:^{ //后台运行过期后会调用此block内 ...
- ios实现程序切入后台,实现后台任务
首先,iOS 会再持续切入后台,给我们5秒钟的时间去处理相关数据,5秒后,程序不会再执行任何代码,处于挂起状态. // 项目需求,按下Home切换后台后向服务器传一些数据,废话不多说,直接上代码 /* ...
- iOS保持App真后台运行
https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就 ...
随机推荐
- 前端开发福音!阿里Weex跨平台移动开发工具开源-b
阿里巴巴今天在Qcon大会上宣布跨平台移动开发工具Weex开放内测邀请.Weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持iOS.安卓.YunOS及 ...
- fixSidebar简介与修正log
fixSidebar是自己写的一个侧边栏固定小组件,主要是用于主内容较长时让侧边栏能保持显示,依赖于jQuery. Github地址 https://github.com/iRuxu/fixSideb ...
- mysql 2006
1.在my.ini文件中添加或者修改以下两个变量:wait_timeout=2880000interactive_timeout = 2880000 关于两个变量的具体说明可以google或者看官方手 ...
- 【Java】java数据库连接池配置的几种方法
今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下面建文件夹META- ...
- Mongo的导出工具mongoexport介绍
需求介绍:将mongodb中的数据以文件的方式导出:json或cvs格式 mongo 提供了mongoexport的工具,可以实现将库中的数据以json或cvs的格式输出到文件中.mongoexpor ...
- Keil C51软件的使用
进入 Keil C51 后,屏幕如下图所示.几秒钟后出现编辑界 启动Keil C51时的屏幕 进入Keil C51后的编辑界面 简单程序的调试:学习程序设计语言.学习某种程序软件,最好的方法是直接操作 ...
- bzoj2729
一看就知道是数学题,考虑插空法由于老师只有两人,所以先对老师进行插空这里考虑两种情况:1.两个老师站在同一处,即两个男生之间站了两个老师这时候需要一个女生站在两个老师之间,再对女生插空,根据乘法原理即 ...
- Light OJ 1032 - Fast Bit Calculations(数位DP)
题目大意: 一个数字把他看成二进制数字,数字里又会一些相邻的1,问从0到n至间所有相邻1的总和是多少? 分解成2进制数字,然后数位DP就行了. ======================== ...
- HDU 4720 Naive and Silly Muggles 2013年四川省赛题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 题目大意:给你四个点,用前三个点绘制一个最小的圆,而这三个点必须在圆上或者在圆内,判断最一个点如 ...
- JavaScript高级程序设计5.pdf
队列方法访问规则是FIFO(First-In-First-Out,先进先出),数组方法shift()能够移除数组中第一个项并返回该项,同时将数组长度减1,结合使用shift()和push(),可以像队 ...