我想在我的应用程序中将didEnterRegion方法与RegionBootstrap或MonitorNotifier结合使用。目前我正在使用 RegionBootstrap,但也许 MonitorNotifier 更适合我的应用程序。
特别是,我将iBeacon解析器添加到信标管理器,然后设置区域的"Id1"以查找iBeacon的UUID部分,并将"Id2"和"Id3"设置为空。尽管它们在区域中设置为 Null,但我希望能够在输入 didEnterRegion 方法时解析这些位置的信息。我正在使用"Id2"(主要)和"Id3"(次要)来提供信标的随机识别参数.
然后,此信息以及来自UUID的部分数据将在通知中发送给电话用户。测试时,我输入了didEnterRegion方法,但提供的数据只是与"Id1"的设置区域匹配的数据。如果有人能提供任何见解,将不胜感激!
我还想每 10 秒收到一次相同 iBeacon 的 didEnterRegion 方法, 但经过测试,似乎一旦看到该特定 iBeacon 一次, didEnterRegion 将不会再次收到后续调用.有什么方法可以清除iBeacon已被捕获,以便可以进行后续捕获?
我试图将电池使用率保持在尽可能低的水平,当使用来自onNonBeaconLESscan的scanRecord数据来解析信息时,我注意到即使将前景和后台时间"BetweenScanPeriod"设置为非常大的东西,也会显着消耗电池。我真的只需要看到iBeacon进入该区域并提取信息, 然后 10 秒后再次执行此操作.
预期申请流程-
- 用户输入具有匹配 UUID 的信标区域 (ID1)
- 来自 ID2 和 ID3 的信标信息被解析并与 ID1 一起通过通知发送给用户
- 10 秒后,用户收到另一个包含相同数据的通知
- 重复直到人离开区域或iBeacon停止传输
获取所需信息的最简单方法是在didDetermineStateForRegion
回调中启用范围:
public void didDetermineStateForRegion(int state, Region region) {
beaconManager.startRangingBeaconsInRegion(region);
beaconManager.addRangeNotifier(this);
}
public void didRangeBeaconsInRegion(Region region, List<Beacon> beacons) {
for (Beacon beacon : beacons) {
Identifier id2 = beacon.getId2();
Identifier id3 = beacon.getId3();
// Now do something with id2 and id3
}
}
didRangeBeaconsInRegion
回调将在默认设置下每 1100 毫秒进行一次, 但如果您愿意,您可以在第一次访问 BeaconManager 时使用这样的行将其更改为 10 秒:
beaconManager.setScanPeriod(10000l);
beaconManager.setBetweenScanPeriod(0l);
在电池方面,如果您想每 10 秒获得一次扫描更新,您将使用大量电池,因为这意味着几乎不间断地进行蓝牙扫描。 在后台,您可能希望退后一步,每 5 分钟仅执行一次 10 秒扫描,如下所示:
beaconManager.setBackgroundScanPeriod(10000l);
beaconManager.setBackgroundBetweenScanPeriod(290000l);
BackgroundPowerSaver powerSaver = new BackgroundPowerSaver();