原创翻译: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放到后台,即使前台什么也不做,就 ...
随机推荐
- SqlServer 允许保存对数据库中表结构的修改
1.Tools-->optisons-->Designers 如下截图
- vim脚本及配置
============set optional===========set nu //显示行号 numb ...
- open files
/* * * Copyright (c) International Business Machines Corp., 2001 * * This program is free software; ...
- PHP 之 Laravel 框架安装及相关开源软件
Laravel 被称为简洁.优雅的PHP开发框架,但第一次接触此框架的人有不少都卡在了安装上,其实在 Linux 下只需要很简单的几步就可以搞定,这里我们以 CentOS 下 PHP + Nginx ...
- Js 表单序列化
http://www.w3cmm.com/javascript/serialize-form.html
- 能分析压缩的日志,且基于文件输入的PYTHON代码实现
确实感觉长见识了. 希望能坚持,并有多的时间用来分析这些思路和模式. #!/usr/bin/python import sys import gzip import bz2 from optparse ...
- 【HDU3081】Marriage Match II (二分+最大流)
Description Presumably, you all have known the question of stable marriage match. A girl will choose ...
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
磁盘分区表.文件系统的查看.统计的工具很多,有些工具是多功能的,不仅仅是查看磁盘的分区表,而且也能进行磁盘分区的操作:但在本文,我们只讲磁盘分区的查看,以及分区的使用情况的查看:本文只是给新手上路之用 ...
- Python IDLE 清屏工具
转载自:http://www.cnblogs.com/maybego/p/3234055.html 1.下载clearwindow.py(右击-目标另存为,直接点击会打开脚本内容). 2.拷贝c ...
- Linux学习笔记28——消息队列
一 关于消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,而且,每个数据块都被认为含有一个类型,接收进程可以独立地接受含有不同类型值的数据块.可以通过发送消息来几乎完全避免命名管 ...