2

Das Problem, das ich gegenüberstelle ist, dass, wenn ich eine UIButton - Standortdienste sind erforderlich, um die Aktion einzuleiten. Wenn der Benutzer jedoch beim ersten Start der App die Standortdienste ablehnen wollte, stürzt die App ab.Prompt Benutzer Ortungsdienste zu erlauben, nachdem verweigert ohne Absturz

Ich habe versucht, einen Weg zu finden, CLAuthorizationStatus .Denied zu implementieren, aber ich kann keinen Weg finden, dies zu tun. Der einzige Code, den ich zu implementieren scheint, ist der didChangeAuthorizationStatus, der die Anfrage nur beim ersten Start der Anwendung auslöst.

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) 
{ 
    if status == .AuthorizedAlways || status == .AuthorizedWhenInUse 
    { 
     manager.startUpdatingLocation() 
    } 
    else 
    { 
     manager.requestWhenInUseAuthorization() 
    } 
} 

Wenn ich die UIButton drücken, um die API-Anfrage zu senden, stürzt die App ab, wenn die Standortdienste verweigert wurden.

Meine Frage ist, wie kann ich eine Methode implementieren, innerhalb der IBAction der Schaltfläche, die den Benutzer anweisen, zu ihren Einstellungen zu gehen und Standortdienste zu aktivieren. :)

+0

Welches Problem haben Sie genau zu lösen versuchen? – nhgrif

+0

Wenn die Berechtigung zur Verwendung der Standortdienste verweigert wird und die Schaltfläche gedrückt wird -> Alarm anzeigen, um anzugeben, dass der Benutzerstandort zur Verwendung der Anwendung erforderlich ist, und den Benutzer zu den Einstellungen umleiten, um ihn zu ändern. – lifewithelliott

+0

Und was ist passiert, wenn Sie 'sonst wenn Status == .Denied' versucht haben? – nhgrif

Antwort

5

CLLocationManager hat eine statische Funktion authorizationStatus(), die Sie verwenden können, um den aktuellen Autorisierungsstatus zu erhalten, ohne sogar ein CLLocationManager Objekt zu initialisieren.

So in der Funktion, die Sie aufrufen, wenn der Benutzer die Taste drückt, können Sie den Berechtigungsstatus prüfen und entsprechend handeln:

import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 

    lazy var locationManager = CLLocationManager() 

    ... 

    func didPressButton(sender: UIButton) { 
     switch CLLocationManager.authorizationStatus() { 
     case .AuthorizedAlways, .AuthorizedWhenInUse: 
      locationManager.delegate = self 
      locationManager.startUpdatingLocation() 
     case .NotDetermined: 
      locationManager.delegate = self 
      locationManager.requestWhenInUseAuthorization() 
     case .Denied: 
      print("Show Alert with link to settings") 
     case .Restricted: 
      // Nothing you can do, app cannot use location services 
      break 
     } 
    } 

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
     if status == .AuthorizedWhenInUse { 
      manager.startUpdatingLocation() 
     } 
    } 
} 
+0

Fantastisch! Ich schätze es sehr! :) – lifewithelliott