2017-03-18 8 views
1

Wird der Location Manager (_: hat Change Authorization:) immer dann aufgerufen, wenn eine App zum ersten Mal ausgeführt wird, auch wenn weder die Location Manager-Methode requestWhenInUseAuthorization() noch startUpdatingLocation() aufgerufen wurde? Ich versuche Lage an dem Klick auf eine Schaltfläche zu berichten, die ich in den @IBAction unten nennen:locationManager (_: Wurde Change Authorization:) ausgeführt, wenn die App zum ersten Mal ausgeführt wird?

@IBAction func findOutPressed(_ sender: UIButton) { 
    getLocation() 
} 

Mein Corelocation-Code ist in der Verlängerung unter:

extension ViewController: CLLocationManagerDelegate { 
     
    // Called from findOutPressed to get location when button is clicked 
    func getLocation() { 
        let status = CLLocationManager.authorizationStatus() 
        handleLocationAuthorizationStatus(status: status) 
    } 
     
    // Respond to the result of the location manager authorization status 
    func handleLocationAuthorizationStatus(status: CLAuthorizationStatus) { 
        switch status { 
        case .notDetermined: 
            locationManager.requestWhenInUseAuthorization() 
        case .authorizedWhenInUse, .authorizedAlways: 
            locationManager.startUpdatingLocation() 
        case .denied: 
            print("I'm sorry - I can't show location. User has not authorized it") 
        case .restricted: 
            print("Access denied - likely parental controls are restricting use in this app.") 
        } 
    } 
     
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
        handleLocationAuthorizationStatus(status: status) 
    } 
     
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
         
        let currentLocation = locations.last 
         
        let labelText = "My location is: latitude = \((currentLocation?.coordinate.latitude)!), longitude = \((currentLocation?.coordinate.longitude)!)" 
         
        resultLabel.text = labelText 
         
        locationManager.stopUpdatingLocation() 
    } 
     
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { 
        print("Dang, there was an error! Error: \(error)") 
    } 
} 

Ich finde Lage Manager (did Change Authorization:) wird sofort ausgeführt, auch wenn die @IBAction findOutPressed nicht mit einem Klick ausgelöst wurde, und die Ergebnisse werden in meinem ursprünglich leeren resultLabel aktualisiert, bevor der Benutzer auf die Schaltfläche geklickt hat . Ich weiß, dass ich eine Markierung setzen kann, um zu bestimmen, ob der Knopf angeklickt wurde oder nicht, die Etikette verhinderend, das Etikett zu aktualisieren, aber ich versuche zu verstehen, wenn Standortmanager (_: hat Änderung Berechtigung) ausgelöst wird. Apple sagt: "Diese Methode wird immer dann aufgerufen, wenn sich die Fähigkeit der Anwendung ändert, Standortdienste zu verwenden. Änderungen können auftreten, weil der Benutzer die Verwendung von Standortdiensten für Ihre Anwendung oder für das gesamte System zugelassen oder verweigert hat." Es scheint nicht, dass dies den Fall der Auslösung abdeckt, wenn eine App zum ersten Mal ausgeführt wird. Ich bin dankbar für jeden, der mich in meinem Verständnis darüber, was mit Autorisierungsänderungen passiert, klarstellen kann. Entschuldigung, wenn ich etwas Grundlegendes verpasst habe. Danke!

Antwort

3

didChangeAuthorization aufgerufen, wenn der CLLocationManager erstellt wird, so dass auch diese auslösen:

var locationManager = CLLocationManager() 
// ... 
locationManager?.delegate = self 
// ... 
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
    print("authorization checked...") 
} 

So haben Sie wahrscheinlich & Initialisierung Ihre Locationmanager an der Spitze der AppDelegate setzen? Das würde es auslösen. Was dann passiert, ist, dass die didChangeAuthorization den Update-Ort startet, der dann Ihren diductuateLocation aufruft, bevor die Schaltfläche angetippt wurde.

Vielleicht Locationmanager als optional und nur init in findOutPressed() z.B .:

// class var: 
var locationManager:CLLocationManager?location managers, 
// ... 
@IBAction func findOutPressed(_ sender: UIButton) { 
    locationManager = CLLocationManager() 
    locationManager?.delegate = self 

    getLocation() 
} 
+0

Dank erklären! Das hat funktioniert - sehr geschätzt! Ich bemerke auch noch eine andere seltsame Sache: Wenn ich den Standort im Simulator ändere: vom benutzerdefinierten Ort zu Apple, wird der Standort von Apple nicht mit nachfolgenden Klicks angezeigt. Wenn ich den Simulator verlasse und die App erneut starte, sehe ich, dass die Änderungen wirksam werden, aber wenn ich zu meinem benutzerdefinierten Ort zurückwechsle, muss ich dieselbe App beenden und erneut ausführen, bevor ich die Änderung sehe. Ist das Standardverhalten oder ist etwas anderes seltsam passiert? – Gallaugher

Verwandte Themen