Как можно ранжировать пользователей firebase в соответствии с их расстоянием друг от друга через iBeacon? - PullRequest
0 голосов
/ 01 июля 2019

У меня есть пользователи в firebase. Я хочу оценить их на странице, основываясь на том, насколько они близки друг к другу через сигнал iBeacon, который могут излучать их телефоны. Лучший способ отобразить их - по порядку сверху вниз и по цвету от синего (близко) к красному (далеко).

class homepage: UITableViewController, CLLocationManagerDelegate, CBPeripheralManagerDelegate{
    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        var localBeacon: CLBeaconRegion!
        var beaconPeripheralData: NSDictionary!
        var peripheralManager: CBPeripheralManager!

        let localBeaconUUID = "5A4BCFCE-174E-4BAC-A814-092E77F6B7E5"
        let localBeaconMajor: CLBeaconMajorValue = 123
        let localBeaconMinor: CLBeaconMinorValue = 456
        let uuid = UUID(uuidString: localBeaconUUID)!
        localBeacon = CLBeaconRegion(proximityUUID: uuid, major:
            localBeaconMajor, minor: localBeaconMinor, identifier: "Your private identifer here")
        beaconPeripheralData = localBeacon.peripheralData(withMeasuredPower: nil)
        peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: nil)
    }
    func initLocalBeacon() {
        if localBeacon != nil {
            stopLocalBeacon()
        }


        func stopLocalBeacon() {
            peripheralManager.stopAdvertising()
            peripheralManager = nil
            beaconPeripheralData = nil
            localBeacon = nil
        }
        func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
            if peripheral.state == .poweredOn {
                peripheralManager.startAdvertising(beaconPeripheralData as? [String: Any])
            } else if peripheral.state == .poweredOff {
                peripheralManager.stopAdvertising()
            }
        }

        super.viewDidLoad()
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
        self.locationManager.requestWhenInUseAuthorization()
        if CLLocationManager.locationServicesEnabled(){
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            locationManager.startUpdatingLocation()
        }
    }
    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: "5A4BCFCE-174E-4BAC-A814-092E77F6B7E5")!
        let beaconRegion = CLBeaconRegion(proximityUUID: uuid, major: 123, minor: 456, identifier: "MyBeacon")
        locationManager.startMonitoring(for: beaconRegion)
        locationManager.startRangingBeacons(in: beaconRegion)
    }
    func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
        if beacons.count > 0 {
            updateDistance(beacons[0].proximity)
        }     else     {
            updateDistance(.unknown)
        }
    }
    func updateDistance(_ distance: CLProximity) {
        UIView.animate(withDuration: 0.8) {
            switch distance {
            case .unknown:
                self.view.backgroundColor = UIColor.gray
            case .far:
                self.view.backgroundColor = UIColor.blue
            case .near:
                self.view.backgroundColor = UIColor.orange
            case .immediate:
                self.view.backgroundColor = UIColor.red
            }
        }
    }

У меня есть некоторый код IBeacon (позволяющий iPhone излучать и принимать сигнал), но, если честно, мне нужно пройти через него, чтобы лучше понять. Моя большая проблема - связать код iBeacon с пользователями Firebase. Я не знаю, как это кодировать, и нигде не видел его в своих поисках.

В конце я хочу, чтобы данные о базе данных от пользователей, которые в данный момент отображались в случайном порядке, упорядочивались по тому, насколько близко каждый пользователь находится к тому пользователю, который смотрит на его экран.

...