ios - 在 ios 上后台进行 BLE 扫描
问题描述
我有 2 台设备 .. 广告和扫描 UUID。在前台和后台。下面是广告和扫码。
问题很简单。2 台设备在后台做广告和扫描并尝试发现彼此。
在前台,两个设备都能够很好地发现彼此。
但是,当我们将两个设备都放在后台时,它们不会相互发现/重新发现。Apple 文档已经表明 CBperipheralallowduplicates 键在后台被忽略,因此它不会重新发现已发现的设备。
但是,通过stackoverflow上的其他一些帖子,我发现如果您在后台重新启动扫描,扫描会被重置。
为此,我发送了一个外部推送通知(已正式收到)并在后台重新启动扫描。
然而,它只在“某些情况下”产生重新发现。我已经用许多设备对此进行了测试:6s、7、7 plus、8、iphoneX、ipad 等以及其他多部手机。
它对某些人有效,对其他人无效。 ios 版本都是 12.3.1
这里也没有出现任何模式 - 它适用于某些 7 和某些 7 它不,它适用于某些 iphone 6s 和一些它不。
有人可以帮助了解这里的问题吗?是什么导致了这种行为?我们怎样才能使重新发现保持一致?
我们已经尝试过的其他事情: 1. 延迟停止和启动扫描 2. 记录以查看中央管理器的状态是否更改 - 未检测到。
let serviceUUID = CBUUID(string: "8D38A460-2F8A-4D1C-8509-324B0377AE44") let service = CBMutableService(type: serviceUUID, primary: true)
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var centralManager: CBCentralManager!
var peripheralManager: CBPeripheralManager! }
extension AppDelegate: CBPeripheralManagerDelegate {
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager)
{
switch peripheral.state {
case .poweredOn:
os_log("advertising")
peripheralManager.add(service)
peripheralManager.startAdvertising([CBAdvertisementDataServiceUUIDsKey: [serviceUUID]])
default:
break
}
}
}
below is scan code:
func scan() {
centralManager.stopScan()
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0)
{let scanOptions = [CBCentralManagerScanOptionAllowDuplicatesKey: true] as [String : Any]
self.centralManager.scanForPeripherals(withServices: [serviceUUID], options: scanOptions)
}
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
os_log("discover: %{public}s", peripheral.description)
}
}
我希望它能够在所有设备上始终如一地显示重新发现
解决方案
推荐阅读
- mysql - 我:正在尝试使用 STR_TO_DATE 但为什么返回 null?
- opencv - 以 VP9、VP8 或 H.264 数据流式传输数据,但将其以 .mov 格式存储在 AWS 上的 s3 存储桶中
- google-apps-script - 应用程序脚本 - 在 xlsx 附件中发送电子表格
- r - 基于跟随另一列的重复数字创建一列
- ios - ARC 语义问题:选择器“componentsWithLink:domain:”没有已知的类方法
- razor - Intellisense 自动完成在错误位置插入文本
- laravel - 在 laravel 通知中使用 route() 函数返回 appname.test 而不是 127.0.0.1:800
- flutter - 如何从 Flutter 中的 Image.asset 中获取属性 AssetName?
- android - 如何将时间选择器添加到 Kotlin 中的 sharedPreference 和 textView 中,因为 sharedPreferences 和 textview 总是显示当前时间?
- visual-studio-code - 如何在 VSCode 中不显示多余的垂直线