Ios SWIFT:CoreLocation-使用CLBeaconIdentityConstraint测距信标不测距多个信标
因此,我们遇到了一个问题,在iOS 13的Swift中开发。当我们使用更新的方法对信标进行测距时,“StarTrangBeacons(Successing:CLBeaconIdentityConstraint)”,它只对最近添加的信标进行测距,因此如果有多个信标,我们就有问题了。当我们使用较旧的方法“StarTrangBeacons(in:region)”时,该应用程序已被弃用,但在iOS 13中仍能正常运行,它可以按预期工作 详细信息(使用带有“约束”的较新方法):Ios SWIFT:CoreLocation-使用CLBeaconIdentityConstraint测距信标不测距多个信标,ios,swift,core-location,ibeacon,geofencing,Ios,Swift,Core Location,Ibeacon,Geofencing,因此,我们遇到了一个问题,在iOS 13的Swift中开发。当我们使用更新的方法对信标进行测距时,“StarTrangBeacons(Successing:CLBeaconIdentityConstraint)”,它只对最近添加的信标进行测距,因此如果有多个信标,我们就有问题了。当我们使用较旧的方法“StarTrangBeacons(in:region)”时,该应用程序已被弃用,但在iOS 13中仍能正常运行,它可以按预期工作 详细信息(使用带有“约束”的较新方法): 应用程序启动监控2个信标区
func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
for beacon in beacons {
if [.near, .immediate].contains(beacon.proximity){
if let index = beaconsInProximity.firstIndex(of: beacon) {
beaconsInProximity.remove(at: index)
}
beaconsInProximity.append(beacon)
if beaconsInProximity.count > 1 { beaconsInProximity = beaconsInProximity.sorted(by: {$0.accuracy < $1.accuracy})}
if nearestBeacon == nil || !nearestBeacon!.isEqual(beaconsInProximity[0]) {
if(nearestBeacon != nil) {
notifyUser(isExiting: true, isBeacon = true)
}
nearestBeacon = beaconsInProximity[0]
displayOrSendNotification()
}
} else if let index = beaconsInProximity.firstIndex(of: beacon){
if(beaconsInProximity.count > 1) {
beaconsInProximity.remove(at: index)
if nearestBeacon != nil && nearestBeacon!.isEqual(beacon) {
notifyUser(isExiting: true, isBeacon = true)
nearestBeacon = beaconsInProximity.count > 0 ? beaconsInProximity[0] : nil
displayOrSendNotification()
}
}
}
}
}
海滩数据定义
struct BeaconData: RegionData{
let uuid: UUID
let major: NSNumber
let minor: NSNumber
let beaconRegion: CLBeaconRegion
let name: String
let detail: String
let image: String
init(uuid: UUID, major: NSNumber, minor: NSNumber, name: String, description: String, image: String) {
self.uuid = uuid
self.major = major
self.minor = minor
self.beaconRegion = CLBeaconRegion(beaconIdentityConstraint: CLBeaconIdentityConstraint(uuid: uuid), identifier: name)
self.name = name
self.detail = description
self.image = image
}
init(uuid: UUID, major: NSNumber, minor: NSNumber, beaconRegion: CLBeaconRegion, name: String, description: String, image: String) {
self.uuid = uuid
self.major = major
self.minor = minor
self.beaconRegion = beaconRegion
self.name = name
self.detail = description
self.image = image
}
func contains(region: CLRegion) -> Bool {
return self.beaconRegion == region
}
}
下面是开始测距的代码。底部的注释调用可以根据需要工作。上面的未注释调用是不可靠的。W在调用中内联创建约束,仅创建UUID。它适用于一个信标,但只要我们添加第二个信标(如上所述使用不同的UUID),它就只适用于最新的信标
BeaconRegionStorRange中的区域的{
打印(“开始测距\(region.uuid)”)
locationManager.StarTransingBeacons(令人满意的:CLBeaconIdentityConstraint(uuid:region.uuid))
//locationManager.startRangingBeacons(区域内)
}
我们如何使用较新的“令人满意的约束”方法确定所有信标的范围?请编辑您的问题以显示相关代码;特别是当您获得区域条目后如何开始对信标进行测距。完成,谢谢@paulw11请显示您的代码,该代码构造了导致您描述的问题的CLBeaconIdentityConstraint。还请显示用于开始使用不推荐的方法进行测距的CLRegion定义,以使其正常工作。最后,请告诉我们导致您描述的问题的两个信标的具体标识符;一旦我开始第二个
CLBeaconIdentityConstraint
,我就停止接收与第一个CLBeaconIdentityConstraint
匹配的信标的范围更新,即使rangedBeaconConstraints
同时显示第一个和第二个约束。@CaptainChaos,你可以发布错误报告的链接吗?请编辑你的问题以显示相关代码;特别是当您获得区域条目后如何开始对信标进行测距。完成,谢谢@paulw11请显示您的代码,该代码构造了导致您描述的问题的CLBeaconIdentityConstraint。还请显示用于开始使用不推荐的方法进行测距的CLRegion定义,以使其正常工作。最后,请告诉我们导致您描述的问题的两个信标的具体标识符;一旦我开始第二个CLBeaconIdentityConstraint
的测距,我就停止接收与第一个CLBeaconIdentityConstraint
匹配的信标的测距更新,即使rangedBeaconConstraints
同时显示第一个和第二个约束。@CaptainChaos,您能发布一个到错误报告的链接吗?
struct BeaconData: RegionData{
let uuid: UUID
let major: NSNumber
let minor: NSNumber
let beaconRegion: CLBeaconRegion
let name: String
let detail: String
let image: String
init(uuid: UUID, major: NSNumber, minor: NSNumber, name: String, description: String, image: String) {
self.uuid = uuid
self.major = major
self.minor = minor
self.beaconRegion = CLBeaconRegion(beaconIdentityConstraint: CLBeaconIdentityConstraint(uuid: uuid), identifier: name)
self.name = name
self.detail = description
self.image = image
}
init(uuid: UUID, major: NSNumber, minor: NSNumber, beaconRegion: CLBeaconRegion, name: String, description: String, image: String) {
self.uuid = uuid
self.major = major
self.minor = minor
self.beaconRegion = beaconRegion
self.name = name
self.detail = description
self.image = image
}
func contains(region: CLRegion) -> Bool {
return self.beaconRegion == region
}
}