我想知道在iOS上使用Eddystone信标跟踪实际上是否可以实现这样的功能。
我目前正致力于应用扫描Eddystone信标的app。 该应用程序的基本思想是: - 用户打开应用程序; - 用户在特定时间(将来)注册会议; - 在会议开始前5分钟开始BT扫描; - 当发现信标发出网络请求并向用户显示通知时。
如果应用程序位于前台,则没有问题。只需致电
func startScan() {
if centralManager.state == .poweredOn {
let services = [CBUUID(string: "FEAA")]
let options = [CBCentralManagerScanOptionAllowDuplicatesKey: true]
centralManager.scanForPeripherals(withServices: services, options: options)
}
}
它将开始扫描。 然后,当找到信标并从服务器获取正确的数据时,我将停止扫描。
所以问题是,即使应用程序处于后台,也能以某种方式安排扫描的开始? 当然如果它被杀了那么我们就无法做任何事情。
一个想法是创建一些“无声的本地通知”,但在阅读Apple文档后,似乎
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
}
仅当app在前台时才会调用?
任何帮助或建议都将不胜感激。
答案 0 :(得分:1)
如果应用未在前台运行,则无法安排蓝牙扫描在特定时间启动。并且没有可靠的方法在特定时间通过通知(远程或本地)启动您的应用程序。可以进行静音远程通知,但它们可能需要很长时间才能完成。
您可以做的是设置扫描Eddystone服务UUID,以便当您的应用程序在后台并且第一次看到信标时,CoreBluetooth会获得单个发现回调。主要的问题是,这也不是超级快。检测可能在几秒钟之内,在信标附近的一两分钟内更有可能发生。