使用iOS中的CLLocationmanager监控20多个BLE信标区域

时间:2018-04-12 07:24:03

标签: ios bluetooth-lowenergy ibeacon beacon altbeacon

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

我知道如果我想要超过20个区域,我可以使用范围信标但不幸的是,据我所知,范围不允许我注册条目(RegionDidEnter)和退出(RegionDidExit)事件。

在我的用例中,我需要在特定信标区域触发用户输入和用户退出的操作,即使app处于被杀死状态或后台也是如此。

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

2 个答案:

答案 0 :(得分:3)

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)
}

为了确保您的应用在设置信标范围之前不会重新进入睡眠状态,您还可以使用background task,然后(伪)代码看起来像:

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)
}

答案 1 :(得分:1)

您可以为此添加变通方法。仅注册用户位置附近的区域。当位置发生变化时,您可以删除现在更远的区域并添加用户路径上的区域。

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

为何核心位置限制为20

  

区域是共享系统资源,以及区域总数   可用的系统范围有限。出于这个原因,核心位置限制   到20可以同时监测的区域数量   单个应用程序要解决此限制,

相关问题