significant location change wird auf dem Gerät nicht ausgelöst

Ich verwende eine signifikante Standortänderungsüberwachung. Wenn ich den Code im Simulator ausführe und die Option Freeway aktiviere, werden die Standorte regelmäßig aktualisiert. Ich greife nach diesen Updates und speichere sie in NSUserDefaults und aktualisiere dann alle 10 Sekunden die Tabellenansicht, damit ich sehen kann, ob ich Updates habe. Wenn ich die App auf einem realen Gerät ausführe, erhalte ich keine Updates. Ich habe das Telefon in der Tasche behalten und bin über 80 km gefahren, in 2 Städten. Keine Updates. Ich bin mir nicht sicher, ob ich etwas durcheinander gebracht habe. Ich hänge den Code an. Der Code ist Kopieren Einfügen, zögern Sie nicht zu testen. Stellen Sie einfach sicher, dass Sie TableViewController im Storyboard verwenden, und setzen Sie die Zellen-ID auf ID. Was vermisse ich? Ich teste auf dem iPhone 5.

info.plist:

edit: Gefunden in Apple Docs. Sollte meinlocationManager anders erstellt werden?

Wenn eine App aufgrund einer Standortaktualisierung erneut gestartet wird, wird das Wörterbuch der Startoptionen an Ihre Anwendung übergeben: willFinishLaunchingWithOptions: oder application: didFinishLaunchingWithOptions: method enthält den Schlüssel UIApplicationLaunchOptionsLocationKey. Das Vorhandensein dieses Schlüssels signalisiert, dass neue Standortdaten auf Ihre App warten. Um diese Daten abzurufen, müssen Sie ein neues CLLocationManager-Objekt erstellen und die Standortdienste neu starten, die vor der Beendigung Ihrer App ausgeführt wurden. Wenn Sie diese Dienste neu starten, sendet der Standortmanager alle ausstehenden Standortaktualisierungen an seinen Stellvertreter.

edit2:

Auf dieser Grundlage sollte der Standort mindestens alle 15 Minuten aktualisiert werden. Fehler in meinem Code bestätigt.

Wenn die Genauigkeit der GPS-Ebene für Ihre App nicht von entscheidender Bedeutung ist und Sie kein kontinuierliches Tracking benötigen, können Sie den Dienst für signifikante Standortänderungen verwenden. Es ist von entscheidender Bedeutung, dass Sie den Dienst für wichtige Standortänderungen korrekt verwenden, da er das System und Ihre App mindestens alle 15 Minuten aktiviert, auch wenn keine Standortänderungen aufgetreten sind. Er wird kontinuierlich ausgeführt, bis Sie ihn beenden.

edit3: Fügte diesen Code zu AppDelegate @ hindidFinishLaunchingWithOptions: um zu sehen, ob die App erwacht. Es wird nicht geweckt - ich sehe keinen 200 200-Eintrag in der Tabellenansicht. Etwas faul ist los.

 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")
            }

CODE: // 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
        }
    }
}

// View Controller

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()
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage