首先:我有一台 iPad Air 2 和一台 iPhone 7。为了进一步阅读,我们估计该应用程序在 iPad 上处于活动状态并打开,在 iPhone 上处于后台模式。该应用程序完全相同,即使具有相同的蓝牙服务 UUID 和相同的 DataLocalNameKey。
我想编写一个应用程序,可以在后台宣传蓝牙服务,并且能够发现该服务(在后台也是最佳的)。正如我已经读过的 https://stackoverflow.com/questions/18944325/run-iphone-as-an-ibeacon-in-the-background我无法使用苹果信标技术,因为只能在后台附近通过信标进行扫描/通知(我对此进行了测试,工作正常),但不能做广告。所以我开始使用 CoreBluetooth,如上述 SO 答案中所述,因为可以在后台做广告。
我的应用程序调用didDiscoverPeripheral
iPhone 上的 CBCentralManagerDelegate 中的方法(应用程序在后台),因此它检测到了 iPad。这isAdvertising
iPhone 上 CBPeripheralManager 的属性是true
. But didDiscoverPeripheral
iPad 上不调用。我有点困惑。一种选择是我的 iPad 由于某些原因无法再检测到 iPhone,或者我的 iPhone 正在撒谎并且它不是广告。
所以我认为我只是有点愚蠢并在谷歌上搜索“CoreBluetooth 调试应用程序”。我发现Vicinity https://github.com/Instrument/Vicinity and 替代信标 https://github.com/Decemberlabs/AltBeacon。这两个应用程序的行为是相同的!如果您将广告应用程序置于后台(按主页/睡眠按钮),则浏览应用程序将无法再发现它。如果您打开后台应用程序,它会立即发现它。这两个应用程序都提到它们可以在后台播放。
难道我做错了什么;这是预期的行为吗?我是否误解了框架?你能确认这个行为吗?
要确认这一点,最快的方法是安装Vicinity https://github.com/Instrument/Vicinity在两台设备上(您必须添加NSBluetoothPeripheralUsageDescription
键(Info.plist)设置要广播的一台设备,然后按主页按钮。
这并不是 iOS 10 特有的——iOS 上一直都是这样。在 iOS 上,应用程序在后台时根本无法发送标准蓝牙 LE 广告。他们必须在前台才能执行此操作。
也就是说,iOS 对后台广告 GATT 服务的应用程序的支持有限。这使用了一种专有技术,仅适用于正在寻找这些服务的其他 iOS 设备。 (例如,由于它使用非标准专有方案,因此相同的技术不适用于信标广告。)
苹果是这样描述的:
...您应该意识到,当您的应用程序位于后台时,广告的运作方式与您的应用程序位于前台时的运作方式不同。特别是当您的应用程序在后台投放广告时:
- 忽略 CBAdvertisementDataLocalNameKey 通告键,并且不通告外设的本地名称。
- CBAdvertisementDataServiceUUIDsKey 广告键值中包含的所有服务 UUID 均放置在特殊的“溢出”区域中;它们只能被明确扫描它们的 iOS 设备发现。
- 如果所有广告应用程序都在后台运行,则外围设备发送广告数据包的频率可能会降低。
在这里阅读更多内容:https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)