原创翻译: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不要执行与唤醒原因无关的事情
时间: 2024-10-06 04:16:54

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

Linux之nohup命令:实现退出终端后程序继续后台运行

转自:http://tech.ccidnet.com/art/302/20070618/1115599_1.html 简单而有用的nohup命令在UNIX/LINUX中,普通进程用&符号放到后台运行,如果启动该程序的控制台logout,则该进程随即终止. 要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦:另一种方法是仍然用普通方法编程,然后用nohup命令启动程序: nohup<程序名>& 则控制台logout后,进程仍然继续运行,起到守护进程的作

【转】Linux下nohup命令实现退出终端后程序继续后台运行

Unix/Linux下一般想让某个程序在后台运行,很多都是使用&在程序结尾来让程序自动运行:但如果要想在退出终端后,程序依然还在后台运行,则要用nohup与&组合来实现. nohup 命令 用途:不挂断地运行命令 语法:nohup Command [ Arg ... ] [& ] 描述:nohup 命令运行由 Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号.在注销后使用 nohup 命令运行后台中的程序:要运行后台中的 nohup 命令,需要添

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

- (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in

iOS开发之如何后台运行程序

首先判断是否支持多线程 UIDevice *device = [UIDevice currentDevice]; BOOL backgroundSupported = NO; if ([device respondsToSelector:@selector(isMultitaskSupported)]) { backgroundSupported = device.mulltitaskingSupported; } 声明你需要的后台任务Info.plist中添加UIBackgroundModes

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

方法一(此方法不太可靠): 开启程序后台运行: [application beginBackgroundTaskWithExpirationHandler:^{ //后台运行过期后会调用此block内代码 }]; 上面在后台开启任务让程序在后台持续保持运行状态,但能保持运行的时间是不确定.比如内存不足的时候系统可能停止其在后台运行. 方法二: 欺骗系统,在Info.plist中声明自己的应用类型为audio.在后台播放mp3.使其能长期在后台运行.

iOS保持App真后台运行

https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就是切换一下系统界面都会觉得卡;苹果手机不论开多少app在后台都感觉很流畅. 这是因为安卓默认处理app为真后台,可以一直在后台处理操作; 而iOS为了让设备尽量省电,减少不必要的开销,保持系统流畅,因而对后台机制采用墓碑式的“假后台”.除了系统官方极少数程序可以真后台,一般开发者开发出来的应用程序后

ios开发-程序压后台后,悄悄的抓取数据~~

我们使用某个app的时候,当我们将程序压到后台之后,我们希望它还能从服务器抓取一些数据,类似微博,微信,qq这些程序压后台 之后,我们依然能看到icon上显示未读数量.但是ios系统是伪多任务操作系统. 当我们将程序压后台之后,大概过1分钟,程序就会被关闭.就不能抓取数据了.很久之前的做法是:压后台之后,播放一个没有声音 的音频,保证程序存活.然后苹果很快发现了这种方法,并禁止了.我们用这种方法提交审核之后,一般都会被苹果驳回.当然,苹果 依然很贴心的给我提供了相应的解决办法.(使用swift演

让linux程序在后台运行

最近要用php进程发奖励,因为要精确到秒执行,linux系统的定时用不了,于是写了个死循环,usleep是必须的,否则系统cpu占用很高的系统cpu. 执行的时候碰到一个问题,关闭终端后进程也终止了.在此记录下解决方法. define('IN_WEB', 'true'); set_time_limit(0); include(dirname(__FILE__)."/../com.php"); $pidFile = PATH_DAT . 'ticket.pid'; if(file_exi

程序放后台运行

#import "AppDelegate.h" @interface AppDelegate () @end @implementation AppDelegate /** * 使用block的另一个用处是可以让程序在后台较长久的运行. 以前,当app被home键退出后,app仅有最多5秒钟的时候做一些保存或清理 资源工作.但是应用可以调用UIApplication的beginBackgroundTaskWithExpirationHandler方法,让app最多有10分钟的时间在后台