我的目标是找到附近的所有iBeacons,并计划在找到新的iBeacons时发送本地通知。我假设所有iBeacons都具有相同的邻近UUID。并且我将使用主ID和次ID的组合来标识它们(每个用户将具有唯一的主ID和次ID组合)。
我假设我需要监视这个特定的UUID,并且locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion)
只会在第一个UUID触发,对吗?所以当它发生时,我需要启动Ranging来查找附近的每个信标,除了我找到的那个。从locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)
回调会实现什么。但问题是,如果附近出现新的信标会发生什么?我需要在didExitRegion
上也发射startRangin
?我只是担心,如果一个已经发现的信标将停留在范围内1小时左右,我将无法检测到任何其他信标将出现在这个地区/范围。
有什么建议最有效的搜索?
2条答案
按热度按时间cwxwcias1#
您最初将监视
CLBeaconRegion
,该CLBeaconRegion
仅指定您感兴趣的信标uuid
。当检测到任何通告此
uuid
的信标时,您将收到对didEnterRegion
的调用。此时,您应该调用
startRangingBeacons(satisfying constraint:)
,其中CLBeaconIdentityConstraint
仅指定uuid
。然后,您将获得对
locationManager(_:didRange:satisfying:)
委托方法的调用。您可以检查传递给委托函数的
CLBeacon
对象的minor
和major
值,以确定范围内的信标及其范围。当满足约束条件的信标进入范围时,它们将被传递给委托,即使它们在进入区域时最初不在范围内。在某个时候,将没有指定
uuid
的信标,您将收到对didExitRegion
的调用。此时,您应该停止信标测距。t9aqgxwy2#
使用后台iOS应用程序跟踪具有相同UUID和不同主值和次值的多个BLE信标是一项挑战。(后台测距通常在10秒后超时。)两种基本方法:
对于这种方法,你需要设置你的应用,以便在你处于信标区域内时在后台解锁无限测距。这有点棘手,如果你长时间处于信标附近,则会消耗大量电池。但是,如果你的应用明确表示它在后台使用位置信息是出于批准的目的,则在应用商店分发时这样做是合法的。基本步骤如下:
设置:
1.将以下声明放入您的Info.plist中
1.从用户获取NSLocationAlways权限。
1.开始监视具有ProximityUUID以及nil主设备和nil次设备的
CLBeaconRegion
。1.启动同一区域的范围。没有真正的理由关闭范围,因为下面的逻辑将处理操作系统是否允许它在后台工作的限制。
1.在
didRange
回调中,添加处理所有检测到的信标的逻辑。输入区域时:
1.在最低功率设置下开始位置更新(基本上只使用Hive无线电):
1.开始一个后台任务,如我的博客文章所述:https://developer.radiusnetworks.com/2014/11/13/extending-background-ranging-on-ios
区域退出时:
1.停止上一步中的后台任务
1.使用
self.locationManager.stopUpdatingLocation(
停止位置更新上面的两个变化将有效地使它,使您不再得到测距更新在后台时,没有信标是可见的,这将节省电池。
这种解决方案并不是万无一失的,但它的优点是不需要持续的后台任务和后台更新。根据信标的位置以及用户在它们之间移动的方式,您不能保证检测到每一个信标。但它适用于信标通常不是紧密放置在一起的许多情况。
1.从用户获取NSLocationAlways权限。
1.使用ProximityUUID以及nil主设备和nil次设备开始监视
CLBeaconRegion
。1.启动同一区域的范围。没有真正的理由关闭范围,因为下面的逻辑将处理操作系统是否允许它在后台工作的限制。
1.在
didRange
回调中,添加处理所有检测到的信标的逻辑。每次检测到新信标(具有不同的主要信标和次要信标)时,请执行以下操作:
1.使用已知信标的UUID、major和minor开始监视新的
CLBeaconRegion
。这样可以在didExit
消失时获得回调。由于iOS只允许监视20个区域,因此您只能同时对19个额外区域执行此操作。在特定大调和小调的
CLBeaconRegion
的Region Exit上:1.停止监视那个地区。
这种方法的优点是,如果在重叠的发射器范围内有大量的信标,当你离开每个信标的范围时,你会得到一个额外的
didExit
回调。每次有一个区域转换(进入或退出),你会得到另一个10秒的背景测距时间。这使你有机会在该区域定期寻找新的信标。第二种解决方案并不完美。如果遇到信标A,然后它在遇到信标B之前在范围内停留了20秒,则不会收到信标B的测距回调,因为测距将在10秒后超时。在此方案中,如果信标A在信标B之前超出范围,则可能会在稍后检测到信标B(从信标A的区域出口给你更多的测距时间),但是如果信标A没有在信标B之前超出范围,那么你将永远检测不到信标B。
如果你必须有完美的检测,使用解决方案#1,你的应用程序显然为用户提供了一个位置特定的好处,你可以接受的电池消耗不断测距,而信标周围。
如果您不需要完美的检测,如果信标放置可以容忍该技术的缺点,或者如果您因为其他原因无法忍受电池耗尽或恒定的背景测距,请使用解决方案#2。