2016-04-07 9 views
4

Я установил делегат, создал регион, и я прочитал всю документацию. Каждый раз, когда местоположение пользователя изменяется и выходит за пределы указанной области, locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) не вызывается. Я видел, как его вызывали один раз, а затем он прекратил это делать. Я потратил много времени, пытаясь понять, что происходит.Менеджер местоположения didExitRegion не был вызван

Краткий обзор того, что я делаю:

Когда приложение запускает я называю locationManager.startUpdatingLocation(), который в свою очередь, вызывает делегатов locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]), я быстро запрос на сервер с некоторой информацией, мне нужно, создать CLCircularRegion и перейдите по ссылке locationManager.stopUpdatingLocation(). В этом методе я вызываю свой startMonitoringForRegion(_:).

Возможно, это потому, что каждый раз, когда я создаю новый регион, он использует один и тот же идентификатор? Документы Apple говорят, что использовать один и тот же идентификатор вполне нормально, потому что он заменит предыдущий, но мне интересно, не вызывает ли это делегирование делегата не для вызова didExitRegion.

Мой код ниже. Спасибо.

func configureLocation() { 

    if CLLocationManager.locationServicesEnabled() { 

     locationManager.delegate = self 

     locationManager.requestAlwaysAuthorization() 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.allowsBackgroundLocationUpdates = false 
     locationManager.pausesLocationUpdatesAutomatically = true 

     // Distance filter to update location 
     //locationManager.distanceFilter = 10.0 

     // Begin updating user location 
     locationManager.startUpdatingLocation() 

    } else { 

     let title = "Location disabled" 
     let message = "To enable location services go to Settings > Privacy > Location Services" 
     self.locationServicesAlertMessage(title, message: message) 
    } 
} 


func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    print("didUpdateCalled") 
    /* 
    if UIApplication.sharedApplication().applicationState == .Active { 
     print("ACTIVE UPDATE: location") 
    } else if UIApplication.sharedApplication().applicationState == .Background { 
     print("BACKGROUND UPDATE: location") 
    } 
    */ 

    if firstLocationUpdate { 
     let center = CLLocationCoordinate2D(latitude: (manager.location?.coordinate.latitude)!, longitude: (manager.location?.coordinate.longitude)!) 
     let region = MKCoordinateRegion(center: center, span: MKCoordinateSpanMake(0.01, 0.01)) 

     self.mapView.setRegion(region, animated: true) 

     self.firstLocationUpdate = false 
    } 


    // If the user is travelling less than 5 mph, update location 
    if manager.location?.speed <= 3.5 { 

     self.updateLongAndLat(manager.location!) { (lat, long) in 

      print("LAT: \(lat)") 
      print("LONG: \(long)") 
      if lat != nil && long != nil { 
       let center = CLLocationCoordinate2D(latitude: lat!, longitude: long!) 
       let monitoredRegion = CLCircularRegion(center: center, radius: 10.0, identifier: "UserRegion") 
       monitoredRegion.notifyOnEntry = false 
       self.locationManager.startMonitoringForRegion(monitoredRegion) 
       self.locationManager.stopUpdatingLocation() 
      } 
     } 
    } 
} 

func locationManager(manager: CLLocationManager, didExitRegion region: CLRegion) { 
    print("EXITED REGION") 

    print("Identifier: \(region.identifier)") 
    if manager.location?.speed <= 3.5 { 
     self.updateLongAndLat(manager.location!, completion: { (lat, long) in 
      if lat != nil && long != nil { 
       let center = CLLocationCoordinate2D(latitude: lat!, longitude: long!) 
       let monitoredRegion = CLCircularRegion(center: center, radius: 10.0, identifier: "UserRegion") 
       self.locationManager.startMonitoringForRegion(monitoredRegion) 
      } 
     }) 
    } 
} 

ответ

3

Мониторинг региона не зависит от GPS. Это триангуляция точки доступа к ячейке/Wi-Fi. Вы не должны ожидать горизонтальной точности лучше, чем 65 м. Попытка обнаружить 10-метровые движения с помощью точного инструмента 65 м просто не работает.

Я не знаю, что делает iOS при запросе на мониторинг регионов с радиусом менее 100 м. В лучшем случае это просто ударяет радиус до 100. В этом случае ваше приложение все равно будет работать, но, вероятно, не так, как предполагалось.

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

Если вы хотите использовать услуги определения местоположения менее 300 м (да, триста), вам необходимо использовать GPS. Geofencing не будет идти в ногу с постоянно идущим пользователем. Но не все в порядке использовать GPS, постоянно работающий в фоновом режиме, так как вы собираетесь быстро разрядить батарею, и ваше приложение будет удалено с телефона пользователя в кратчайшие сроки.

Geofencing не требует GPS, но с радостью будет использовать GPS-данные, если они доступны (даже если GPS-обновления были запрошены другим приложением). GPS-геодезические работы работают удивительно точно, но я не вижу веских причин использовать обе службы вместе, так как проще просто установить фильтр менеджера местоположений на нужное расстояние.

+0

Итак, несколько вещей: есть ли подробные документы яблока, описывающие это помимо руководства по программированию местоположения и документации по классу? Если мне нужны более мелкие услуги определения местоположения (60 м) или менее, привычно или нормально использовать как GPS, так и отслеживание региона? Спасибо – Mihado

+0

Спасибо, я позаботился проснуться GPS время от времени, чтобы выполнить то, что я ищу. – Mihado

+0

@Mihado «При тестировании кода мониторинга вашего региона в симуляторе iOS или на устройстве осознайте, что события региона могут не произойти сразу же после пересечения границы региона. Чтобы предотвратить ложные уведомления, iOS не доставляет уведомлений региона до тех пор, пока определенные пороговые условия не будут В частности, местоположение пользователя должно пересекать границу региона, удаляться от границы на минимальное расстояние и оставаться на этом минимальном расстоянии в течение как минимум 20 секунд до того, как будут сообщены уведомления. (1/2) – Honey

 Смежные вопросы

  • Нет связанных вопросов^_^