在ios上检测附近具有相同uuid的所有iBeacons

5cg8jx4n  于 2023-02-10  发布在  iOS
关注(0)|答案(2)|浏览(168)

我的目标是找到附近的所有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小时左右,我将无法检测到任何其他信标将出现在这个地区/范围。
有什么建议最有效的搜索?

cwxwcias

cwxwcias1#

您最初将监视CLBeaconRegion,该CLBeaconRegion仅指定您感兴趣的信标uuid
当检测到任何通告此uuid的信标时,您将收到对didEnterRegion的调用。
此时,您应该调用startRangingBeacons(satisfying constraint:),其中CLBeaconIdentityConstraint仅指定uuid
然后,您将获得对locationManager(_:didRange:satisfying:)委托方法的调用。
您可以检查传递给委托函数的CLBeacon对象的minormajor值,以确定范围内的信标及其范围。当满足约束条件的信标进入范围时,它们将被传递给委托,即使它们在进入区域时最初不在范围内。
在某个时候,将没有指定uuid的信标,您将收到对didExitRegion的调用。此时,您应该停止信标测距。

t9aqgxwy

t9aqgxwy2#

使用后台iOS应用程序跟踪具有相同UUID和不同主值和次值的多个BLE信标是一项挑战。(后台测距通常在10秒后超时。)两种基本方法:

    • 溶液#1:在区域内时恒定测距**

对于这种方法,你需要设置你的应用,以便在你处于信标区域内时在后台解锁无限测距。这有点棘手,如果你长时间处于信标附近,则会消耗大量电池。但是,如果你的应用明确表示它在后台使用位置信息是出于批准的目的,则在应用商店分发时这样做是合法的。基本步骤如下:
设置:
1.将以下声明放入您的Info.plist中

<key>UIBackgroundModes</key>
    <array>
        <string>location</string>
    </array>

1.从用户获取NSLocationAlways权限。
1.开始监视具有ProximityUUID以及nil主设备和nil次设备的CLBeaconRegion
1.启动同一区域的范围。没有真正的理由关闭范围,因为下面的逻辑将处理操作系统是否允许它在后台工作的限制。
1.在didRange回调中,添加处理所有检测到的信标的逻辑。
输入区域时:
1.在最低功率设置下开始位置更新(基本上只使用Hive无线电):

locationManager.pausesLocationUpdatesAutomatically = false
        locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
        locationManager.distanceFilter = 3000.0
        
        if #available(iOS 9.0, *) {
          locationManager.allowsBackgroundLocationUpdates = true
        } else {
          // not needed on earlier versions
        }
        // start updating location at beginning just to give us unlimited background running time
        self.locationManager.startUpdatingLocation()

1.开始一个后台任务,如我的博客文章所述:https://developer.radiusnetworks.com/2014/11/13/extending-background-ranging-on-ios
区域退出时:
1.停止上一步中的后台任务
1.使用self.locationManager.stopUpdatingLocation(停止位置更新
上面的两个变化将有效地使它,使您不再得到测距更新在后台时,没有信标是可见的,这将节省电池。

    • 溶液#2:每个信标使用一个额外区域**

这种解决方案并不是万无一失的,但它的优点是不需要持续的后台任务和后台更新。根据信标的位置以及用户在它们之间移动的方式,您不能保证检测到每一个信标。但它适用于信标通常不是紧密放置在一起的许多情况。
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。

相关问题