在后台没有得到 didDiscover 外围 ibeacon

Posted

技术标签:

【中文标题】在后台没有得到 didDiscover 外围 ibeacon【英文标题】:didn't get didDiscover peripheral ibeacon in background 【发布时间】:2017-05-22 06:29:13 【问题描述】:

当我这样指定服务时:

centralManager.scanForPeripherals(withServices: [BEAN_SERVICE_UUID], options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])

我确定我输入了正确的BEAN_SERVICE_UUID。事实证明,当我在前台执行该功能时,我可以获得 didDiscover 外围回调。

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) print(advertisementData)

这是我的常规设置功能和我的info.plist

那么,我必须做什么才能使 ScanForPeripheral / didDiscover 外围设备工作?

*已编辑 经过多次测试,我发现我的应用程序可以执行后台扫描外围设备,但只是在应用程序安装后的初始启动(仅一次)之后,ScanForPeripheral / didDiscover 外围设备无法在后台工作。

【问题讨论】:

您可以尝试使用 centralManager.scanForPeripherals(withServices: nil) 扫描所有未指定 UUID 的设备。 CBCentralManagerScanOptionAllowDuplicatesKey 键在后台被忽略,因此您也可以跳过它进行测试。另外,也许您在控制台中有一些错误? 在一些搜索中,我知道如果我们想在后台和前台扫描,我们必须指定 UUID。我没有错误日志,但未发现外围设备。经过多次测试,我发现我的应用可以进行后台扫描外围设备,但只是在应用安装后的初始启动(仅一次) 第一次吃完午饭后,你没有忘记取消外围连接吗? 我没有忘记。但我的后台扫描没有任何反应 是否调用了 func centralManagerDidUpdateState(_ central: CBCentralManager)?你能提供你在这个方法中做了什么吗? 【参考方案1】:

当您在后台发现蓝牙外围设备时,CBCentralManagerScanOptionAllowDuplicatesKey 会被自动忽略并设置为 false。话虽如此,您只会在后台收到一个广告数据包,您必须对其进行一些操作。如果你不这样做,这个外设将永远不会再次调用 didDiscover 方法。

对于 iBeacons,您应该使用 CoreLocation 框架。

【讨论】:

所以,我必须将 CBCentralManagerScanOptionAllowDuplicatesKey 设置为 true 还是 false?你是什​​么意思在后台只收到一个广告包?你能解释一下吗? 在后台允许重复标记将被忽略。这意味着您现在只会获得新设备的 didDiscoverPeripheral 回调。如果在前台看到所有设备,则根本不会收到回调。 如果我使用 CoreLocation 框架,我可以发现信标、连接、写入和读取吗? 当 CoreLocation 信标方法告诉您已关闭时,您可以开始扫描外围设备

以上是关于在后台没有得到 didDiscover 外围 ibeacon的主要内容,如果未能解决你的问题,请参考以下文章

didDiscover 外围设备未调用

Swift 3:如何在后台扫描外围设备?

是否可以使用 CBPeripheral 通过蓝牙从 iOS 连接到 macOS

蓝牙后台模式IOS

在后台扫描外围设备

当应用程序在后台时扫描外围设备(例如屏幕锁定时)