Swift 4 locationManager didEnterRegion не запускается, когда пользователь находится в регионе при запуске приложения - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь определить, входит ли пользователь в определенный регион в моем приложении.

Это работает нормально, если пользователь не находится в определенном регионе, когда приложение запускается, а затем входит вобласть, край.

Но если пользователь находится в определенном регионе при запуске приложения, функция didEnterRegion не запускается.

Вот мой код:

override func viewDidLoad() {
    super.viewDidLoad()
    self.dbRef = Database.database().reference()
    self.mapView.delegate = self
    self.initLocationManager()
    guard let userLocation = locationManager.location?.coordinate else {return}
    self.userLocation = userLocation
    let region = MKCoordinateRegion(center: userLocation, latitudinalMeters: 1200, longitudinalMeters: 1200)
    mapView.setRegion(region, animated: true)
    self.getPlaces { (places) in
        self.places = places
        self.addAnnotationsToMap(places)
        if(CLLocationManager.authorizationStatus() == .authorizedAlways){
            if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self){
                for place in places{
                    self.startMonitoring(place)
                }
            }
        }
    }
}

func startMonitoring(_ place: Place){
    let region = CLCircularRegion(center: place.getCoordinate(), radius: 50, identifier: place.identifier)
    region.notifyOnEntry = true
    region.notifyOnExit = true
    locationManager.startMonitoring(for: region)
}

func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
    print("Entered Region : \(region.identifier)")
}

1 Ответ

0 голосов
/ 01 декабря 2018

Это ожидаемое поведение, как следует из названия, оно срабатывает только при пересечении более широкой области.Если вы хотите определить, находится ли пользователь внутри или за пределами региона, используйте locationManager.requestState(for region: CLRegion), а затем получите результат в функции делегата locationManager(_:didDetermineState:for:)

Чтобы запросить все контролируемые регионы, вызовите requestState(region) для каждого объекта в locationManager.monitoredRegions.

...