У меня проблема с одновременным мониторингом нескольких маяков. Мой код отлично работает только с одним, но я не могу понять, как отслеживать более одного маяка И обновлять UILabel.
Все маяки отслеживаются и распознаются, когда я их включаю, но мой телефон не отображает правильные метки в обзоре. Он постоянно показывает "UNKOWN" в distanceReading.text, если только это не последний маяк в функции (Estimote).
У меня также есть некоторые другие проблемы с обновлением имени, для которого это маяк. Я не уверен, как вызвать идентификатор маяка, что было бы идеальным способом (что-то вроде beacon.identifier). Я пробовал создать другую переменную и обновлять имя при каждом сканировании маяка, но он просто сканирует последнюю и не меняется. Я надеялся, что он просканирует его, КОГДА он был обнаружен, что позволило мне изменить переменную при обнаружении нового маяка.
Я попытался поместить все маяки в одну функцию startScanning (), присвоив каждому уникальному UUID его переменной и используя locationManager.startMonitoring () и locationManager.startRangingBeacon () для каждого отдельного маяка. Затем я попытался создать функцию startScanning (), используя параметры для каждого UUID, основного, второстепенного и идентификатора, а затем вызвать функцию для каждого маяка.
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)
}
}
Я ожидаю, что каждый раз, когда будет обнаружен новый маяк, моя метка будет соответственно меняться. Это работает так, как предназначено для маяка с именем ПОСЛЕДНИЙ, но не для первых трех. Цвет меняется, но этикетка не меняется. Я также хотел бы найти способ вызвать идентификатор маяка, который я установил в CLBeaconRegion.