我想要的是我的iOS设备一直在宣传蓝牙LE服务,即使应用程序没有运行,这样我就可以对其进行另一次iOS设备扫描并找到它。我在这里遵循了Apple的背景说明:
我可以让它在前景中做广告,有时在后台做广告,但它不会一直保持广告。如果您将其设置为在后台运行,即使设备重启后它也不应该开始做广告,就像后台位置服务在重启后自动开始工作一样?他们在Apple的文档中没有列出(或很难找到)的后台限制吗?有没有人在后台正确地拥有Core Bluetooth Peripheral广告的例子?
...谢谢
答案 0 :(得分:8)
如果您将bluetooth-peripheral
后台模式添加到应用程序的plist,则可以进行后台广告。一旦你这样做,你的应用程序将继续接收回调,即使背景。
该广告是一个棘手的野兽,因为Apple实施了几项优化以降低功耗,并且一旦应用程序落后,这些就会降低广告的质量。即:费率严重下降,不包括广告服务,也不包括本地名称。一旦应用程序回到前台,这些限制就会失效。
在一般情况下,这种后台运行需要应用程序运行。在iOS 7中,已经实施了恢复过程,允许操作系统在终止时代表应用程序执行操作,并在某些传输或其他操作即将来临时恢复应用程序。这要求您将恢复密钥添加到CBPeripheralManager
/ CBCentralManager
的初始化选项中。仍然需要启动一次应用程序,但在此之后,iOS将继续充当中央/外围设备的BLE外观。
更新:我在Apple bluetooth-dev列表上运行了一个循环以及此问题,发现Core Bluetooth管理器是declared to be not able to restore after reboot。这没有在任何文档中描述,但可能在WWDC视频中提到过。我们应该提交一个错误并复制它以提高Apple的意识。
答案 1 :(得分:0)
实际上非常简单。
<CBPeripheralManagerDelegate>
@property (strong, nonatomic) CBPeripheralManager *peripheralManager;
...
- (NSDictionary*) advertiseNotBeacon {
CBUUID *myCustomServiceUUID = [CBUUID UUIDWithString:@"MY_UUID"];
CBMutableCharacteristic *myCharacteristic = [[CBMutableCharacteristic alloc] initWithType:myCustomServiceUUID
properties:CBCharacteristicPropertyRead | CBCharacteristicPropertyNotify
value:nil permissions:CBAttributePermissionsReadable];
CBMutableService *myService = [[CBMutableService alloc] initWithType:myCustomServiceUUID primary:YES];
myService.characteristics = @[myCharacteristic];
self.peripheralManager.delegate = self;
[self.peripheralManager addService:myService];
return @{CBAdvertisementDataServiceUUIDsKey : @[myService.UUID],
CBAdvertisementDataLocalNameKey: @"MY_NAME"
};
}
...
[self.peripheralManager startAdvertising:[self advertiseNotBeacon]];
这样做,您将开始宣传外围服务。
现在,如果您想让服务在后台运行,请阅读以下链接中的文档:https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW1
快速步骤:
打开info.plist
添加新的par键/值
Required background modes
App shares data using CoreBluetooth
Apple说要按住Ctrl键并单击任何键/值并添加以下内容,但与之前解释的完全相同。
UIBackgroundModes
bluetooth-peripheral
不要忘记在后台运行服务的限制: