значительное изменение местоположения не срабатывает на устройстве

Я использую мониторинг существенного изменения местоположения. Когда я запускаю код в симуляторе и проверяю опцию «Автострада», я получаю периодические обновления местоположения. Я беру эти обновления и сохраняю их в NSUserDefaults, а затем обновляю таблицу каждые 10 секунд, чтобы я мог видеть, получил ли я какие-либо обновления. Если я запускаю приложение на реальном устройстве, я получаю ноль обновлений. Я держал телефон в кармане и проехал более 80 км, побывал в 2 городах. Ноль обновлений. Не уверен, что я что-то напутал. Я прилагаю код. Код копировать вставить, не стесняйтесь тестировать. Просто убедитесь, что вы используете TableViewController в раскадровке и установите идентификатор ячейки в ID. Что мне не хватает? Я тестирую на iphone 5.

info.plist:

редактировать: нашел это в Apple Docs. Если мойlocationManager быть создан по-другому?

Когда приложение перезапускается из-за обновления местоположения, словарь параметров запуска передается в ваше приложение: willFinishLaunchingWithOptions: или application: didFinishLaunchingWithOptions: метод содержит ключ UIApplicationLaunchOptionsLocationKey. Наличие этого ключа указывает на то, что новые данные о местоположении ожидают доставки в ваше приложение. Чтобы получить эти данные, вы должны создать новый объект CLLocationManager и перезапустить службы определения местоположения, которые вы работали до завершения вашего приложения. При перезапуске этих служб диспетчер местоположений доставляет все ожидающие обновления местоположения своему делегату.

edit2:

Исходя из этого, местоположение должно обновляться как минимум каждые 15 минут. Ошибка в моем коде подтверждена.

Если точность уровня GPS не является критически важной для вашего приложения, и вам не нужно непрерывное отслеживание, вы можете воспользоваться услугой определения местоположения с существенными изменениями. Очень важно правильно использовать службу определения местоположения с существенными изменениями, поскольку она будит систему и ваше приложение не реже одного раза в 15 минут, даже если никаких изменений местоположения не происходило, и работает непрерывно, пока вы не остановите ее.

edit3: добавил этот код в AppDelegatedidFinishLaunchingWithOptions: чтобы увидеть, если приложение пробуждается. Он не просыпается - я не вижу 200 200 записей в табличном представлении. Что-то подозрительное происходит

 if let options = launchOptions {
            print("options")
            if (launchOptions![UIApplicationLaunchOptionsLocationKey] != nil){
                locationManager.startUpdatingLocation()
                self.lat.append(Double(200))
                self.lon.append(Double(200))
                self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
                NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
                NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
                NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
            }

КОД: // AppDelegate:

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

    var lat:[CLLocationDegrees]!
    var lon:[CLLocationDegrees]!
    var times:[String]!
    var distances: [String]!

    var window: UIWindow?
    var locationManager: CLLocationManager!


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        locationManager=CLLocationManager()
        locationManager.delegate=self
        locationManager.requestAlwaysAuthorization()

        let isFirstLaunch = NSUserDefaults.standardUserDefaults().objectForKey("lat")
        if isFirstLaunch == nil{
            lat = [CLLocationDegrees]()
            lon = [CLLocationDegrees]()
            times = [String]()
            NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
            NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
            NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
        }else{
            lat = NSUserDefaults.standardUserDefaults().arrayForKey("lat") as! [CLLocationDegrees]
            lon = NSUserDefaults.standardUserDefaults().arrayForKey("lon") as! [CLLocationDegrees]
            times = NSUserDefaults.standardUserDefaults().objectForKey("time") as! [String]
//            distances = NSUserDefaults.standardUserDefaults().objectForKey("distance") as! [String]

        }  
        return true
    }



    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        print("location updated")

        self.lat.append(locations[0].coordinate.latitude)
        self.lon.append(locations[0].coordinate.longitude)
        self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))

        NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
        NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
        NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")

        print("Location: \(locations[0].coordinate.latitude)   \(locations[0].coordinate.longitude)")
    }

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        print("did change AS")
        switch status {
        case .AuthorizedWhenInUse:
            locationManager.startMonitoringSignificantLocationChanges()
        case .AuthorizedAlways:
            print("to always")
            locationManager.startMonitoringSignificantLocationChanges()
            if lat.count==0{
                self.lat.append((locationManager.location?.coordinate.latitude)!)
                self.lon.append((locationManager.location?.coordinate.longitude)!)

                self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))

                NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
                NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
                NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")


            }

//            locationManager.startUpdatingLocation()
            break
        default:
            locationManager.stopMonitoringSignificantLocationChanges()
            break
        }
    }
}

// Просмотреть контроллер

import UIKit

class TableViewController: UITableViewController {

    let appDel = UIApplication.sharedApplication().delegate as! AppDelegate

    override func viewDidLoad() {
        super.viewDidLoad()

        NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "updateTableView", userInfo: nil, repeats: true)
    }



    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return appDel.lon.count
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("ID", forIndexPath: indexPath)
        cell.textLabel?.text = "\(appDel.lat[indexPath.row])   \(appDel.lon[indexPath.row])    \(appDel.times[indexPath.row])"
        cell.textLabel?.font = UIFont.systemFontOfSize(9)


        return cell
    }

    func updateTableView(){
    self.tableView.reloadData()
    }
}

Ответы на вопрос(1)

Ваш ответ на вопрос