IOS. CLLocationManager получает обновление местоположения только один раз в didUpdateLocations

У меня есть следующий код для получения обновлений местоположения (iOS 7):

import UIKit
import CoreLocation

class FirstViewController: UIViewController, CLLocationManagerDelegate {

 var locationManager: CLLocationManager!

 override func viewDidLoad() {
 super.viewDidLoad()
 }

 override func didReceiveMemoryWarning() {
 super.didReceiveMemoryWarning()
 }

 @******** func startTracking(sender : AnyObject) {
 NSLog("Start tracking")
 if (locationManager == nil) {
 locationManager = CLLocationManager()
 locationManager.delegate = self
 locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
 locationManager.distanceFilter = kCLDistanceFilterNone
 locationManager.pausesLocationUpdatesAutomatically = false
 }

 locationManager.startUpdatingLocation()
 }

 @******** func stopTracking(sender : AnyObject) {
 NSLog("Stop tracking")
 stopUpdatingLocation()
 }

 func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
 NSLog("Error" + error.description)
 }

 func locationManager(manager:CLLocationManager, didUpdateLocations locations:AnyObject[]) {
 println("locations = \(locations)")
 }

 func locationManager(manager: CLLocationManager!,
 didChangeAuthorizationStatus status: CLAuthorizationStatus) {

 switch status {
 case CLAuthorizationStatus.Restricted:
 locationStatus = "Access: Restricted"
 break
 case CLAuthorizationStatus.Denied:
 locationStatus = "Access: Denied"
 break
 case CLAuthorizationStatus.NotDetermined:
 locationStatus = "Access: NotDetermined"
 shouldIAllow = true
 break
 default:
 locationStatus = "Access: Allowed"
 shouldIAllow = true
 }
 NSLog(locationStatus)
 }
}

Я получил только одно обновление в didUpdateLocations: после вызова startTracking didUpdateLocations будет вызываться только один раз и через 5 секунд индикатор GPS исчезнет.

Некоторые детали:

  • приложение имеет право использовать службы определения местоположения
  • приложение находится на переднем плане
  • достаточно интересно: если бы я поставил didUpdateLocations останова в didUpdateLocations она будет didUpdateLocations 4 - 5 раз.

Я видел ответы на подобные вопросы здесь (например, " Внедрить методы CLLocationManagerDelegate" в Swift), но он по-прежнему не работает для меня.

Что я делаю не так?

Благодарю!

3 ответа

Xcode 6 сделал множество дополнений к службам местоположения.

1) Вам нужно изменить файл info.plist, чтобы включить в него строку "NSLocationWhenInUseUsageDescription". Значением этого будут ваши приложения, которые рассуждают о включении служб определения местоположения: "Использование служб определения местоположения для отслеживания вашего прогона".

2) использовать "[self.locationManager requestWhenInUseAuthorization];" в вашем коде, чтобы вызвать всплывающее окно с указанной выше строкой.

Больше информации о видео WWDC 2014.


Это то, что разрешило проблему - я добавил очень короткий сон для didUpdateLocations:

func locationManager(manager:CLLocationManager, didUpdateLocations locations:AnyObject[]) {
 println("locations = \(locations)")
 NSThread.sleepForTimeInterval(0.001)
}

Я согласен с @Mike, что это выглядит очень странно, но это исправление. Если кто-нибудь найдет лучшее объяснение/ответ, пожалуйста, опубликуйте его.


Попробуйте реализовать этот метод, чтобы проверить, приостановлен ли ваш менеджер местоположений:

func locationManagerDidPauseLocationUpdates(manager: CLLocationManager!)

Если вы делаете паузу, попробуйте изменить точность на kCLLocationAccuracyBest.

licensed under cc by-sa 3.0 with attribution.