我想要的是让我的 iOS 设备一直宣传蓝牙 LE 服务,即使应用程序没有运行,这样我就可以让另一台 iOS 设备扫描并找到它。我在这里遵循了 Apple 的背景说明:
我可以让它在前台做广告,有时在后台做广告,但它不会一直做广告。如果您将其设置为在后台运行,即使在设备重启后它也不应该开始广告,就像后台位置服务在重启后自动开始工作一样?它们对 Apple 文档中未列出(或难以找到)的背景的限制吗?有没有人有一个核心蓝牙外设在后台正确广告的例子?
谢谢...
我想要的是让我的 iOS 设备一直宣传蓝牙 LE 服务,即使应用程序没有运行,这样我就可以让另一台 iOS 设备扫描并找到它。我在这里遵循了 Apple 的背景说明:
我可以让它在前台做广告,有时在后台做广告,但它不会一直做广告。如果您将其设置为在后台运行,即使在设备重启后它也不应该开始广告,就像后台位置服务在重启后自动开始工作一样?它们对 Apple 文档中未列出(或难以找到)的背景的限制吗?有没有人有一个核心蓝牙外设在后台正确广告的例子?
谢谢...
如果您将bluetooth-peripheral
后台模式添加到应用程序的 plist,则可以使用后台广告。一旦你这样做了,你的应用程序即使在后台也将继续接收回调。
广告是一个棘手的野兽,因为 Apple 实施了多项优化以降低功耗,并且一旦应用程序后台运行,这些就会降低广告的质量。即:费率大幅降低,不包括广告服务,也不包括本地名称。一旦应用程序回到前台,这些限制就会失效。
在一般情况下,这种后台操作需要应用程序正在运行。在 iOS 7 中实现了恢复过程,允许操作系统在应用程序终止时代表应用程序执行操作,并在即将进行某些传输或其他操作时恢复应用程序。这需要您将恢复密钥添加到CBPeripheralManager
/的初始化选项中CBCentralManager
。仍然需要启动您的应用程序一次,但之后,iOS 将继续充当中央/外围设备的 BLE 外观。
更新:我也在 Apple bluetooth-dev 列表上运行了一个循环,发现核心蓝牙管理器被宣布在重启后无法恢复。这在任何文档中都没有描述,但可能在 WWDC 视频中提到过。我们应该提交一个错误并复制它以提高苹果的意识。
其实很简单。
<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
苹果说 ctrl + 单击任何键/值并添加以下内容,但与之前解释的完全相同。
UIBackgroundModes
bluetooth-peripheral
不要忘记在后台运行服务的限制: