14

我想要的是让我的 iOS 设备一直宣传蓝牙 LE 服务,即使应用程序没有运行,这样我就可以让另一台 iOS 设备扫描并找到它。我在这里遵循了 Apple 的背景说明:

https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW1

我可以让它在前台做广告,有时在后台做广告,但它不会一直做广告。如果您将其设置为在后台运行,即使在设备重启后它也不应该开始广告,就像后台位置服务在重启后自动开始工作一样?它们对 Apple 文档中未列出(或难以找到)的背景的限制吗?有没有人有一个核心蓝牙外设在后台正确广告的例子?

谢谢...

4

2 回答 2

9

如果您将bluetooth-peripheral后台模式添加到应用程序的 plist,则可以使用后台广告。一旦你这样做了,你的应用程序即使在后台也将继续接收回调。

广告是一个棘手的野兽,因为 Apple 实施了多项优化以降低功耗,并且一旦应用程序后台运行,这些就会降低广告的质量。即:费率大幅降低,不包括广告服务,也不包括本地名称。一旦应用程序回到前台,这些限制就会失效。

在一般情况下,这种后台操作需要应用程序正在运行。在 iOS 7 中实现了恢复过程,允许操作系统在应用程序终止时代表应用程序执行操作,并在即将进行某些传输或其他操作时恢复应用程序。这需要您将恢复密钥添加到CBPeripheralManager/的初始化选项中CBCentralManager。仍然需要启动您的应用程序一次,但之后,iOS 将继续充当中央/外围设备的 BLE 外观。

更新:我也在 Apple bluetooth-dev 列表上运行了一个循环,发现核心蓝牙管理器被宣布在重启后无法恢复。这在任何文档中都没有描述,但可能在 WWDC 视频中提到过。我们应该提交一个错误并复制它以提高苹果的意识。

于 2013-10-08T12:37:52.220 回答
0

可以在这里建立实现: https ://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW5

其实很简单。

<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 

不要忘记在后台运行服务的限制:

  • CBCentralManagerScanOptionAllowDuplicatesKey 扫描选项键被忽略,广告外围设备的多个发现合并为单个发现事件。如果正在扫描外围设备的所有应用程序都在后台,则中央设备扫描广告数据包的间隔会增加。因此,发现广告外围设备可能需要更长的时间。
  • 这些更改有助于最大限度地减少无线电使用并延长 iOS 设备的电池寿命。
于 2018-03-07T17:18:02.360 回答