Я установил делегат, создал регион, и я прочитал всю документацию. Каждый раз, когда местоположение пользователя изменяется и выходит за пределы указанной области, 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)
}
})
}
}
Итак, несколько вещей: есть ли подробные документы яблока, описывающие это помимо руководства по программированию местоположения и документации по классу? Если мне нужны более мелкие услуги определения местоположения (60 м) или менее, привычно или нормально использовать как GPS, так и отслеживание региона? Спасибо – Mihado
Спасибо, я позаботился проснуться GPS время от времени, чтобы выполнить то, что я ищу. – Mihado
@Mihado «При тестировании кода мониторинга вашего региона в симуляторе iOS или на устройстве осознайте, что события региона могут не произойти сразу же после пересечения границы региона. Чтобы предотвратить ложные уведомления, iOS не доставляет уведомлений региона до тех пор, пока определенные пороговые условия не будут В частности, местоположение пользователя должно пересекать границу региона, удаляться от границы на минимальное расстояние и оставаться на этом минимальном расстоянии в течение как минимум 20 секунд до того, как будут сообщены уведомления. (1/2) – Honey