iOS 7核心蓝牙外设在后台运行

14
我想让我的iOS设备始终在广告蓝牙低功耗服务,即使应用程序未运行,这样我就可以让另一个iOS设备扫描并找到它。我已经按照此处的Apple后台指令进行配置: https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/PerformingCommonPeripheralRoleTasks/PerformingCommonPeripheralRoleTasks.html#//apple_ref/doc/uid/TP40013257-CH4-SW1
我可以在前台和有时在后台进行广告推送,但它无法一直保持广告。如果您将其设置为在后台运行,则不应该像后台位置服务在重新启动后自动开始工作一样开始广告吗?背景下的限制是否未列在Apple文档中(或难以找到)?是否有任何核心蓝牙外围设备在后台正确广告的示例?
谢谢...

你需要为外围管理器实现恢复功能。观看WWDC视频以了解如何完成此操作。但请记住,如果管理器在恢复时连接了任何外围设备,则存在导致应用程序崩溃的错误。 - allprog
我看了这个视频。它是关于中央而不是外围设备的。有人有一个背景外围设备的工作示例吗?另外,关于这个 bug,它会影响外围设备吗? - jpcoder
两个经理的方案是相同的。这个漏洞影响了外围设备。 - allprog
那么在他们修复那个bug之前,后台处理基本上是无用的吗?还是有什么解决方法?当然,我所说的问题似乎与这个bug无关。我的问题是它没有广告。在后台,这应该由操作系统完成,而不需要我的应用程序运行甚至在管理器恢复之前就完成。 - jpcoder
1
你需要确保在应用程序终止之前,中心设备已经断开连接,并且必须以专有方式完成此操作,因为没有相应的API可供使用。这就是这个错误的全部内容。我将为背景广告发布一个答案。 - allprog
苹果在此确认,重新启动后的状态恢复不受支持。http://lists.apple.com/archives/bluetooth-dev/2014/Apr/msg00047.html - collinsrj
2个回答

9
如果您将bluetooth-peripheral背景模式添加到应用程序的plist中,则可以进行背景广告。一旦这样做,即使在后台运行,您的应用程序也将继续接收回调。
广告是一个棘手的问题,因为苹果实施了几种优化来降低功耗,这些优化会在应用程序进入后台时降低广告质量。即:速率严重降低,广告服务未包括在内,本地名称也未包括在内。一旦应用程序回到前台,这些限制就无效了。
在一般情况下,这种后台操作需要应用程序正在运行。使用iOS 7,已经实现了恢复过程,允许操作系统代表应用程序行动,当某些传输或其他操作即将发生时,恢复应用程序。这要求您将恢复键添加到CBPeripheralManager/CBCentralManager的初始化选项中。仍然需要启动您的应用程序一次,但之后,iOS将继续作为面向中央/外设的BLE外观。 更新: 我在苹果蓝牙设备列表上运行了一个循环,并发现Core Bluetooth管理器被声明为不能在重启后恢复。这在任何文档中都没有描述,但可能在WWDC视频中提到过。我们应该提交一个错误并复制它以提高苹果的意识。

我在苹果蓝牙列表档案和ADF Core Bluetooth部分中搜索,但找不到这个消息。我不记得在哪里看到它了。我刚刚进行了一项测试,无法在重新启动后触发恢复,广告也没有开始。 - allprog
我还没有尝试过中心案例,但为什么会有所不同呢?通常,iOS 不允许任何应用程序自动启动或自行执行任何操作。也许 VoIP 是一个例外,但我没有相关经验。我知道,这不是权威性的答案,但现在我只能提供这些信息。 :) - allprog
我非常确定位置服务可以在重启后启动。假设你有一个蓝牙低功耗门锁(外围设备),当你靠近门时想使用手机(中央设备)来解锁门。如果CoreBluetooth一直在后台扫描,那么你就可以这样做。但是,如果它在重启后停止扫描(似乎也会在应用程序被强制关闭后停止扫描),那么你将被困在房外,直到你启动该应用程序,这使得它不太实用。 - jpcoder
@jpcoder 啊,好的,我记得了。我最初提到的那个人谈论的是iBeacon测距。是的,在重新启动后会恢复。我目前正在深入研究这个问题。 - allprog
我又重新看了一遍视频,可能错过了这个点,会再试一次的。 :) - allprog
显示剩余6条评论

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 添加一个新的参数键/值

Required background modes
      App shares data using CoreBluetooth

苹果表示,对任何键/值进行ctrl +单击,并添加与之前完全相同的以下内容。

UIBackgroundModes
      bluetooth-peripheral 

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

  • 忽略CBCentralManagerScanOptionAllowDuplicatesKey扫描选项键,并将发现的广告外设的多个发现合并为单个发现事件。如果所有正在扫描外设的应用都在后台运行,则您的中央设备扫描广告数据包的间隔增加。因此,可能需要更长时间才能发现广告外设。
  • 这些更改有助于最小化无线电使用,并提高iOS设备的电池寿命。

这个功能是否已经被弃用,还是在新版本的iOS中仍然有效? - kendhia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接