gpt4 book ai didi

ios - 如何监控多个 iBeacon 并根据每个信标更改 UILabel?

转载 作者:行者123 更新时间:2023-11-28 10:29:26 25 4
gpt4 key购买 nike

我在同时监控多个信标时遇到问题。我的代码只用一个就可以正常工作,但我似乎无法弄清楚如何监视多个信标并更新 UILabel。

当我打开信标时,它们都在被监控和识别,但我的手机无法在 View 中显示正确的标签。它不断地在 distanceReading.text 中显示“UNKOWN”,除非它是函数 (Estimote) 中的最后一个信标。

我还遇到了一些更新信标名称的其他问题。我不确定如何调用信标标识符,这将是理想的方式(类似于 beacon.identifier)。我已经尝试创建另一个变量并通过每次信标扫描更新名称,但它只扫描最后一个并且不会改变。我希望它会在检测到它时对其进行扫描,从而允许我在检测到新信标时更改变量。

我已经尝试将所有信标放在一个 startScanning() 函数中,为每个唯一的 UUID 分配变量,并为每个单独的信标使用 locationManager.startMonitoring() 和 locationManager.startRangingBeacon()。然后我尝试使用每个 UUID、主要、次要和标识符的参数创建一个 startScanning() 函数,然后为每个信标调用该函数。

class ViewController: UIViewController, CLLocationManagerDelegate {

@IBOutlet var distanceReading: UILabel!
@IBOutlet var nameLabel: UILabel!
var locationManager: CLLocationManager?
var beaconDict: [String: String]?
var labelName: String?

override func viewDidLoad() {
super.viewDidLoad()

locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestAlwaysAuthorization()

alertShown = false

view.backgroundColor = .gray // default is in "unknown mode"

}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways {
// Can we monitor beacons or not?
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
// Can we detect the distance of a beacon?
if CLLocationManager.isRangingAvailable() {
startScanning(uuid: UUID(uuidString: "5A4BCFCE-174E-4BAC-A814-092E77F6B7E5")!, major: 123, minor: 456, identifier: "Apple Beacon", name: "Apple")
startScanning(uuid: UUID(uuidString: "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")!, major: 123, minor: 456, identifier: "Radius Beacon", name: "Radius")
startScanning(uuid: UUID(uuidString: "5AFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")!, major: 123, minor: 456, identifier: "Red Bear Beacon", name: "Red Bear")
startScanning(uuid: UUID(uuidString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D")!, major: 123, minor: 456, identifier: "Estimote", name: "Estimote")
}
}
}
}

func startScanning(uuid: UUID, major: UInt16, minor: UInt16, identifier: String, name: String) {
let uuidApple = uuid
let beaconRegion1 = CLBeaconRegion(proximityUUID: uuidApple, major: major, minor: minor, identifier: identifier)
locationManager?.startMonitoring(for: beaconRegion1)
locationManager?.startRangingBeacons(in: beaconRegion1)
labelName = name
}

func update(distance: CLProximity) {
UIView.animate(withDuration: 1) {
switch distance {
case .far:
self.view.backgroundColor = .blue
self.distanceReading.text = "FAR"
case .near:
self.view.backgroundColor = .orange
self.distanceReading.text = "NEAR"
case .immediate:
self.view.backgroundColor = .red
self.distanceReading.text = "RIGHT HERE"
default:
self.view.backgroundColor = .gray
self.distanceReading.text = "UNKNOWN"
}
}
}

func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if let beacon = beacons.first {
nameLabel.text = labelName
update(distance: beacon.proximity)
} else {
update(distance: .unknown)
}
}

我希望每次检测到新信标时,我的标签都会相应更改。这适用于名为 LAST 的信标,但不适用于前三个。颜色改变了,但标签拒绝改变。我还想找出一种方法来调用我在 CLBeaconRegion 中设置的信标标识符。

最佳答案

尝试像 for beacons in beacons 中那样遍历所有远程信标,而不是像 beacons.first 中那样只处理数组中的第一个信标。

关于ios - 如何监控多个 iBeacon 并根据每个信标更改 UILabel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56976585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com