Как проверить, находится ли текущее местоположение пользователя внутри круга местоположения - PullRequest
0 голосов
/ 14 мая 2019

Я хочу проверить, находится ли пользователь в непосредственной близости.Например, я указал радиус 50 метров вокруг текущего местоположения пользователя.Допустим, если пользователь движется, теперь я хочу проверить, находится ли пользователь в радиусе 50 метров или нет.Вот мой код

 override func viewDidLoad() {
        super.viewDidLoad()

          locationManager.startMonitoringVisits()
          locationManager.delegate = self
          locationManager.distanceFilter = 1
          locationManager.allowsBackgroundLocationUpdates = true
          locationManager.startUpdatingLocation() 
    }


Вот код для проверки расстояния


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        guard let location = locations.first else {
            return
        }
        let officeLocation = CLLocationCoordinate2D.init(latitude: 31.471303736482234, longitude: 74.27275174139386)

        let circle = MKCircle(center: officeLocation, radius: 50 as CLLocationDistance)
        if location.distance(from: officeLocation) > circle.radius {
            self.newVisitReceived(des: "YOU ARE OUT OF OFFICE")
        }
        else{ 
            self.newVisitReceived(des: "YOU ARE IN OFFICE")
         }

    }

Даже если я не двигаюсь, этот код отправляет уведомление "ВЫ ВЫХОДИТЕ".

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

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

override func viewDidLoad() {
    super.viewDidLoad()

    let locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.requestAlwaysAuthorization()
}

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedAlways || status == .authorizedWhenInUse {

        // CLLocationCoordinate2D; You have to put the coordinate that you want to listen
        let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: 324234, longitude: 23423), radius: 50, identifier: "Ur ID")
        region.notifyOnExit = true
        region.notifyOnEntry = true
        manager.startMonitoring(for: region)
    }
}

func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
    // User has exited from ur regiom
}

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
    // User has exited from ur region
}

Надеюсьэто будет полезно

0 голосов
/ 14 мая 2019

Общая проблема с услугами определения местоположения состоит в том, что измерения различаются по точности, в зависимости от множества факторов. Как бы вы хотели, чтобы ваш код вел себя, если пользователь стоит прямо на границе 50 метров? Ваш текущий код будет случайным образом переключаться между «в офисе» и «вне офиса», если точность плохая.

Я думаю, что точность GPS на самом деле превышает 4 метра при наилучших условиях, поэтому фильтр расстояния 1 может не подходить.

Полагаю, вам понадобится какое-то состояние в вашем приложении, которое отслеживает , когда пользователя в последний раз видели в радиусе 50 метров, а также некоторый льготный период перед повторным обновлением этой переменной, чтобы избежать «мерцания».

...