Ios SWIFT:CoreLocation-使用CLBeaconIdentityConstraint测距信标不测距多个信标

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个信标区

因此,我们遇到了一个问题,在iOS 13的Swift中开发。当我们使用更新的方法对信标进行测距时,“StarTrangBeacons(Successing:CLBeaconIdentityConstraint)”,它只对最近添加的信标进行测距,因此如果有多个信标,我们就有问题了。当我们使用较旧的方法“StarTrangBeacons(in:region)”时,该应用程序已被弃用,但在iOS 13中仍能正常运行,它可以按预期工作

详细信息(使用带有“约束”的较新方法):

  • 应用程序启动监控2个信标区域
  • 如果用户输入信标区域,则开始测距信标
  • 打开Beacon1,应用程序将开始搜索Beacon1
  • 打开Beacon2,应用程序开始设置Beacon2的范围,但不设置beacon1的范围。(注意-两个信标区域重叠,旧方法可以处理此问题)
  • 当使用startRangingBeacons(in:region)对信标进行测距时,应用程序可以同时对两个信标进行测距

    当关闭最新的远程信标时,didRangeBeacons事件将使用空的CLBeacon列表触发,该列表应仍包含其他信标,但它不包含

    以下是不起作用的代码:

        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
        }
    }