首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信标是否像地理栅栏一样工作,并具有相同的限制为20?

信标是否像地理栅栏一样工作,并具有相同的限制为20?
EN

Stack Overflow用户
提问于 2017-05-17 22:15:31
回答 3查看 88关注 0票数 0

我在某处读到,苹果上的信标和地理栅栏的工作方式类似,而且每部手机也有20个信标的限制。

真的是这样吗?

我们的用例:我们希望在应用程序未运行且手机未唤醒(在口袋中)时向用户发送推送通知。我们正在考虑依靠信标而不是地理栅栏,以避免达到每部手机20个栅栏的限制,并不得不处理重要的位置改变功能和类似的解决方案(目前)。

EN

回答 3

Stack Overflow用户

发布于 2017-05-17 22:32:43

信标的工作原理类似于geofences。当您进入或退出信标区域(在蓝牙范围内)时,您将得到通知,您还可以对周围的所有信标进行测距,以获取它们的ids。

对于CLBeaconRegions,还有20个区域的限制。请看:https://developer.apple.com/reference/corelocation/cllocationmanager/1423656-startmonitoringforregion使用监控区域和测距的组合,即使只有一个区域,您也可以做自己的事情。(很大程度上取决于您的用例)

如果你想发送基于地理的通知,信标可以为你工作。

票数 1
EN

Stack Overflow用户

发布于 2017-05-17 23:52:27

是的,有最多20个区域的限制( beacon和geofence组合在一起)。有几种方法可以监控上千个信标,但这取决于使用情况。

您可以使用不同的通配符并监视数千个信标,但有一些限制。您必须使用信标配置,如信标UDID、主要值和次要值。

如果您只对任何信标的进入或退出感兴趣(而对特定信标不感兴趣)。实际上,您只需为所有信标设置相同的UDID,并且仅监视一个信标区域就可以解决您的问题。

代码语言:javascript
复制
let region = CLBeaconRegion.init(proximityUUID: UUID.init(uuidString: "YOUR_BEACONS_UDID_32_DIGITS")!, identifier: "beacon_region1")
locationManager.startMonitoring(for: region)

您还可以使用UDID和重大值对信标进行分组。

代码语言:javascript
复制
let r1 = CLBeaconRegion.init(proximityUUID: UUID.init(uuidString: "YOUR_BEACONS_UDID_32_DIGITS")!, major: 1000, identifier: "region_1000")

因此,您可以在后台监控20组信标,并且每组可以拥有您想要的任意多个信标。

票数 1
EN

Stack Overflow用户

发布于 2017-05-18 03:12:18

虽然CoreLocation API将信标区域监控限制在20个区域(结合地理围栏区域),但您可以查找近860亿个不同的信标位置,以便向用户发送通知。

是的,这就对了。860亿--准确地说是85,899,345,920 .你觉得这就够了吗?

简单的技术是将信标监控API与信标测距API结合起来。使用监控,当检测到任何一个信标时,您可以在后台唤醒您的应用程序。然后使用测距API,您可以读取检测到的确切信标标识符,并向用户发送推送通知。当手机仍然放在用户的口袋里时,这一切都会起作用。

由于每个信标标识符包括一个主要(0-63355)和一个次要(0-63335),因此您可以使用不同的ProximityUUID监视最多20个信标区域,并获得20 x 65536 x 65536 = 85,899,345,920个不同的组合。

代码语言:javascript
复制
let region = CLBeaconRegion.init(proximityUUID: UUID.init(uuidString: "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")!, identifier: "beacon_region1")
locationManager.startMonitoring(for: region)
locationManager.startRangingBeacons(in: region)
// TODO: repeat the above for up to 19 more regions

..。

代码语言:javascript
复制
public func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
  for beacon in beacons {
    var uuid = beacon.proximityUUID
    var major = beacon.major
    var minor = beacon.minor
    // TODO: Send a unique local notification to the user for this
    //       uuid/major/minor combination identifying a particular place
  }
}

这种方法有一些局限性。如果您的信标被放置在彼此重叠的无线电范围内(~ 50米),则用户在一个信标旁边居住一段时间,然后步行到隔壁的另一个信标将不会得到背景唤醒,除非这些信标位于两个不同的区域。有一些游戏可以绕过这一限制,但对于许多用例,您甚至不需要麻烦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44027394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档