iOS蓝牙APP常驻后台


如果你的应用在后台时也需要处理蓝牙事件,就必须在Info.plist中声明应用要支持蓝牙后台模式,这样,当有蓝牙事件发生时,系统会唤醒应用来处理。
有两种蓝牙后台模式,一种为central角色,另一种为peripheral角色。如果应用需要两种角色,则可以声明支持两种模式。声明方式:增加UIBackgroundModes键,并增加包含下列字符串的array值。

•bluetooth-central—The app communicates with Bluetooth low energy peripherals using the Core Bluetooth framework.
•bluetooth-peripheral—The app shares data using the Core Bluetooth framework

注意:Info.plist中会显示为更加人性化的文本,不是直接显示实际的键值对。如要显示实际值,可右键,或control点击,在弹出菜单中选择Show

iOS蓝牙类APP常驻后台的实现方法,经过在苹果开发者论坛询问,以及查看苹果开发者文档,最后得出正确的方法为:
1.设置plist,蓝牙权限
在info.plist文件中加入Array类型的Required background modes字段并添加两个元素App shares data using CoreBluetooth和App communicates using CoreBluetooth,如图



亲测,使用CoreBluetooth库开发的蓝牙应用在iOS10.1的环境下,当蓝牙连接成功并持续发送数据时:
1、在应用中切换界面
2、将应用挂起(后台中运行)
3、锁屏状态下
均不影响数据传输。
2.到target-capabilities-background modes中打开use Bluetooth LE accessories选项



3.创建central manager时设置restore identifier
_bluetoothmanager = [[CBCentralManager alloc] initWithDelegate:self queue:centralQueue options:@{CBCentralManagerOptionRestoreIdentifierKey : CardReadingServiceManagerRestoreIdentifier}];

4.appdelegate的didfinishlaunching方法中,如果检测到对应的key就重新创建Bluetooth manager

for (NSString *blue in centralManagerIdentifiers) {
    if ([blue isEqualToString:CardReadingServiceManagerRestoreIdentifier]) {
        [CardReadingService getInstance].bluetoothmanager = nil;
        [[CardReadingService getInstance] bluetoothmanager];
        break;
    }
}

5.实现Bluetooth central delegate的willRestoreState方法,开启扫描

- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)dict {
    [self startScan];
    [self startAccleerometer];
}

以上方法是从开发者文档中找到的,对应的链接
但是到iOS12之后,发现不能长期保持后台,不知道是不是系统又对应用后台做了限制,改进方法还在研究中。
在应用中添加后台应用刷新,可使app在后台更加稳定。具体实现方法请自行查询。
iOS蓝牙后台运行
CoreBluetooth状态保存:还原CBCentralManager的正确方法

你可能感兴趣的:(iOS蓝牙APP常驻后台)