在iOS中使用CLLocationManager监控20多个BLE信标区域



目前我正在使用CLLocationmanager来监视iOS中的BLE信标区域。

我知道如果我想要超过 20 个区域,我可以范围信标,但不幸的是,范围不允许我注册条目(区域输入( 和退出(区域迪退出( 据我所知的事件.

在我的用例中,我需要在特定信标区域中触发用户进入和退出的操作,即使应用程序处于终止状态或后台也是如此.

我需要一种有效的方法来做到这一点,就像我寻找重大的位置变化一样,它也使用电池,而且如果我使用 GPS,使用信标就没有多大意义了。

didEnter发生时,iOS 会在后台启动您的应用程序,并给它几秒钟的执行时间来处理事件。您可以利用这段时间开始测距,接收测距结果,并且由于测距始终提供完整的 UUID/主要/次要信息,因此请在此基础上触发适当的操作。

伪代码:

let myUUID = x
startMonitoring(myUUID)
func onDidEnter {
    startRanging(myUUID)
}
func onDidRange(beacons) {
    if beacons.empty { return } // keep ranging until we find something
    let major = beacons.first.major
    if major == 1 { show("Welcome to X") }
    if major == 2 { show("Welcome to Y") }
    stopRanging(myUUID)
}

为了确保您的应用在设法设置信标范围之前不会重新进入睡眠状态, 您还可以使用后台任务, 然后(伪(代码将如下所示:

func onDidEnter {
    self.task = beginBackgroundTask(expirationHadler: {
        // our background time is up, iOS requires us to finish our work
        stopRanging(myUUID)
        endBackgroundTask(self.task)
    })
    startRanging(myUUID)
}
func onDidRange(beacons) {
    if beacons.empty { return }
    let major = beacons.first.major
    if major == 1 { show("Welcome to X") }
    if major == 2 { show("Welcome to Y") }
    stopRanging(myUUID)
    endBackgroundTask(self.task)
}

您可以为此添加解决方法。仅注册靠近用户位置的区域。当位置更改时,您可以删除现在更远的区域,并添加用户路径上出现的区域。

为了在处理位置时节省电池电量,请注册重大更改位置更新或使用延迟位置更新或使用访问监控。

为什么核心位置限制为 20

区域是共享系统资源,区域总数 全系统可用是有限的。因此,核心位置限制 到 20 个可由 单个应用。要绕过此限制,

最新更新