iBeacon 约束接受多个 major/minors
iBeacon constraint to accept multiple major/minors
我按照在线教程进行操作,并在我的项目中使用了以下代码,它可以检测到具有特定 uuid/major/minor 的 iBeacon 并对其进行一些逻辑处理。我想知道是否有一种方法可以接受多个 uuid 或多个 major/minors 并将它们传递给其他函数?这是我到目前为止的代码:
class BeaconDetector: NSObject, ObservableObject, CLLocationManagerDelegate {
var locationManager: CLLocationManager?
@Published var lastDistance = CLProximity.unknown
override init(){
super.init()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus){
if status == .authorizedAlways{
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
if CLLocationManager.isRangingAvailable(){
startScanning()
}
}
}
}
func startScanning(){
let uuid = UUID(uuidString: "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")!
let constraint = CLBeaconIdentityConstraint(uuid: uuid, major: 0, minor: 0)
let beaconRegion = CLBeaconRegion(beaconIdentityConstraint: constraint, identifier: "MyBeacon")
locationManager?.startMonitoring(for: beaconRegion)
locationManager?.startRangingBeacons(satisfying: constraint)
}
func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
if let beacon = beacons.first{
update(distance: beacon.proximity)
} else{
update(distance: .unknown)
}
}
func update(distance: CLProximity) {
lastDistance = distance
}
}
我想我知道如何通过将值添加到更新函数来传递值,但是我现在最大的问题是如何检测和接受多个信标,谢谢!
您可以在位置管理器中为最多 20 个区域设置位置监控。这些区域可以是基于 GPS 的地理围栏区域或“信标区域”,也可以是两者的任意组合,但限制为 20 个。要注册多个信标区域,您只需多次调用 locationManager?.startMonitoring(for: beaconRegion)
代码.
当您创建信标区域时,您必须指定一个 UUID。您可以将其设为特定的 UUID 和通配符 major/minor、特定的 UUID 以及主要和通配符次要,或者 UUID、主要和次要 ID 的特定值。 (我不记得你是否可以指定 UUID 和 minor 并让它适用于任何专业。已经有一段时间了。)
如果您对主要或次要 ID 使用通配符,系统会将任何匹配的设备视为同一区域的一部分,并且您必须编写代码来确定检测到哪个特定信标。我似乎记得一旦你进入了一个带有通配符的区域(比如一个特定的 UUID 和任何主要或次要的),那么如果第二个信标具有不同的 major/minor,你将不会收到新的“进入区域”通知被检测到。这被视为同一地区的一部分。在这种情况下,您需要开始收听特定的信标通知并查看您为每个信标获得的值。
我按照在线教程进行操作,并在我的项目中使用了以下代码,它可以检测到具有特定 uuid/major/minor 的 iBeacon 并对其进行一些逻辑处理。我想知道是否有一种方法可以接受多个 uuid 或多个 major/minors 并将它们传递给其他函数?这是我到目前为止的代码:
class BeaconDetector: NSObject, ObservableObject, CLLocationManagerDelegate {
var locationManager: CLLocationManager?
@Published var lastDistance = CLProximity.unknown
override init(){
super.init()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus){
if status == .authorizedAlways{
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
if CLLocationManager.isRangingAvailable(){
startScanning()
}
}
}
}
func startScanning(){
let uuid = UUID(uuidString: "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")!
let constraint = CLBeaconIdentityConstraint(uuid: uuid, major: 0, minor: 0)
let beaconRegion = CLBeaconRegion(beaconIdentityConstraint: constraint, identifier: "MyBeacon")
locationManager?.startMonitoring(for: beaconRegion)
locationManager?.startRangingBeacons(satisfying: constraint)
}
func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
if let beacon = beacons.first{
update(distance: beacon.proximity)
} else{
update(distance: .unknown)
}
}
func update(distance: CLProximity) {
lastDistance = distance
}
}
我想我知道如何通过将值添加到更新函数来传递值,但是我现在最大的问题是如何检测和接受多个信标,谢谢!
您可以在位置管理器中为最多 20 个区域设置位置监控。这些区域可以是基于 GPS 的地理围栏区域或“信标区域”,也可以是两者的任意组合,但限制为 20 个。要注册多个信标区域,您只需多次调用 locationManager?.startMonitoring(for: beaconRegion)
代码.
当您创建信标区域时,您必须指定一个 UUID。您可以将其设为特定的 UUID 和通配符 major/minor、特定的 UUID 以及主要和通配符次要,或者 UUID、主要和次要 ID 的特定值。 (我不记得你是否可以指定 UUID 和 minor 并让它适用于任何专业。已经有一段时间了。)
如果您对主要或次要 ID 使用通配符,系统会将任何匹配的设备视为同一区域的一部分,并且您必须编写代码来确定检测到哪个特定信标。我似乎记得一旦你进入了一个带有通配符的区域(比如一个特定的 UUID 和任何主要或次要的),那么如果第二个信标具有不同的 major/minor,你将不会收到新的“进入区域”通知被检测到。这被视为同一地区的一部分。在这种情况下,您需要开始收听特定的信标通知并查看您为每个信标获得的值。