2016-01-18 2 views
41

Ich habe etwas über CoreLocation geforscht. Kürzlich stieß ich auf ein Problem, das anderswo behandelt wurde, aber in Objective C und für iOS 8.Überprüfen Sie, ob die Standortdienste aktiviert sind.

Ich fühle mich irgendwie albern fragen, aber wie können Sie überprüfen, ob Ortungsdienste mit swift, auf iOS 9 aktiviert sind?

auf iOS 7 (und vielleicht 8?) Sie locationServicesEnabled() verwenden könnte, aber das scheint nicht zu funktionieren, wenn für iOS 9.

So wie ich das erreichen würde kompilieren?

Danke!

Antwort

117

die CLLocationManagerDelegate auf Ihre Klassenvererbung hinzufügen und dann können Sie diese Prüfung machen:

Swift 1.x - 2.x Version:

if CLLocationManager.locationServicesEnabled() { 
    switch CLLocationManager.authorizationStatus() { 
    case .NotDetermined, .Restricted, .Denied: 
     print("No access") 
    case .AuthorizedAlways, .AuthorizedWhenInUse: 
     print("Access") 
    } 
} else { 
    print("Location services are not enabled") 
} 

Swift 3.0 Version:

+6

Yup! Vielen Dank! Mein Problem war, dass ich versuche, locatoinServicesEnabled auf meinem Manager zu nennen, das heißt 'manager.locationServicesEnabled()' statt 'CLLocationManager.loationServicesEnabled()' gelöst! –

+1

Ich bekomme es, dass Ihr Code nur ein Beispiel ist, aber es ist ein wenig irreführend ... Ich denke, es ist besser, wenn "authorizationStatus" ist * set * zu 'notDetermined' dann anstelle nur Protokollierung wäre es besser, den Benutzer 'Zulassen'/Lassen Sie nicht " – Honey

+0

@Honey, sicher, dass Sie natürlich verwenden könnten, wie Sie bevorzugen und wie Sie sagten, der Code ist nur ein Beispiel, um zu zeigen, wie es verwendet werden könnte. –

3

Wenn Sie -startLocation aufrufen und der Benutzer die Standortdienste verweigert, erhält der Stellverteiler des Standortmanagers einen Anruf an - locationManager:didFailWithError: mit dem Fehlercode kCLErrorDenied. Dies funktioniert in allen Versionen von iOS.

+0

Danke. Leider, wenn ich das versuchte, zeigt es: 'Verwendung des unaufgelösten Bezeichners 'kCLErrorDenied''. Gedanken? –

5

In Ziel-c

Sie sollten Benutzer, die bereits abgelehnt wurden oder nicht ermittelt wurden, nach einer Erlaubnis fragen oder den Nutzer zur Einstellungs-App schicken.

Implementieren Sie den AlertView-Delegierten und senden Sie den Benutzer, um den Standortdienst zu aktivieren, wenn der Benutzer dies bereits ablehnt.

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 

    if (alertView.tag == 199) { 
     if (buttonIndex == 1) { 
      [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; 
     } 
     return; 
    } 
} 

Init Location Manager

-(void)initLocationManager{ 
    self.locationManager = [[CLLocationManager alloc] init]; 
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
     [self.locationManager requestAlwaysAuthorization]; 
    } 
} 

Bitte beachten Sie kCLAuthorizationStatusAuthorizedAlways und kCLAuthorizationStatusAuthorizedWhenInUse Unterschied.

5

SWIFT 3(Stand: 4. Juli 2017)

if CLLocationManager.locationServicesEnabled() { 

} 

dies wird Ihnen sagen, wenn der Benutzer bereits eine Einstellung für den Standort

3

Für swift3 eingereicht hat.0 und oben, wenn häufige Kontrollen sind für die Verfügbarkeit von Standortdienste gemacht, eine Klasse wie unten zu erstellen,

import CoreLocation 

    open class Reachability { 
     class func isLocationServiceEnabled() -> Bool { 
      if CLLocationManager.locationServicesEnabled() { 
       switch(CLLocationManager.authorizationStatus()) { 
        case .notDetermined, .restricted, .denied: 
        return false 
        case .authorizedAlways, .authorizedWhenInUse: 
        return true 
        default: 
        print("Something wrong with Location services") 
        return false 
       } 
      } else { 
        print("Location services are not enabled") 
        return false 
       } 
      } 
     } 

und es dann wie dies in Ihrem VC verwendet

if Reachability.isLocationServiceEnabled() == true { 
    // Do what you want to do. 
    } else { 
    //You could show an alert like this. 
     let alertController = UIAlertController(title: "Location 
     Services Disabled", message: "Please enable location services 
     for this app.", preferredStyle: .alert) 
     let OKAction = UIAlertAction(title: "OK", style: .default, 
     handler: nil) 
     alertController.addAction(OKAction) 
     OperationQueue.main.addOperation { 
      self.present(alertController, animated: true, 
      completion:nil) 
     } 
    } 
2

Es ist nur ein 2-Line-Funktion in Swift 4:

import CoreLocation 

static func isLocationPermissionGranted() -> Bool 
{ 
    guard CLLocationManager.locationServicesEnabled() else { return false } 
    return [.authorizedAlways, .authorizedWhenInUse].contains(CLLocationManager.authorizationStatus()) 
} 
1

in Swift 3,0

if (CLLocationManager.locationServicesEnabled()) 
      { 
       locationManager.delegate = self 
       locationManager.desiredAccuracy = kCLLocationAccuracyBest 
       if ((UIDevice.current.systemVersion as NSString).floatValue >= 8) 
       { 
        locationManager.requestWhenInUseAuthorization() 
       } 

       locationManager.startUpdatingLocation() 
      } 
      else 
      { 
       #if debug 
        println("Location services are not enabled"); 
       #endif 
      } 
1

Um Erlaubnis für standortbezogene Dienste fragen Sie verwenden:

yourSharedLocationManager.requestWhenInUseAuthorization() 

Wenn der Status zur Zeit wird ein Alarm Zugang zu ermöglichen, den Benutzer auffordert, zeigt nicht bestimmt. Wenn der Zugriff verweigert wird, wird Ihre App im CLLocationManagerDelegate benachrichtigt. Wenn die Berechtigung zu irgendeinem Zeitpunkt verweigert wird, werden Sie hier ebenfalls aktualisiert.

Es gibt zwei separate Status, die Sie prüfen müssen, um die aktuellen Berechtigungen zu ermitteln.

  • Wenn der Benutzer über die allgemeinen Standortdienste aktiviert oder nicht

CLLocationManager.locationServicesEnabled()

  • Wenn der Benutzer die entsprechende Berechtigung für Ihre Anwendung erteilt hat ..

CLLocationManager.authorizationStatus() == .authorizedWhenInUse

Sie könnten eine Erweiterung hinzufügen, ist eine praktische Option:

extension CLLocationManager { 
static func authorizedToRequestLocation() -> Bool { 
    return CLLocationManager.locationServicesEnabled() && 
     (CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse) 
} 

}

Hier wird zugegriffen wird, wenn der Benutzer zum ersten Mal Richtungen angefordert hat:

private func requestUserLocation() { 
    //when status is not determined this method runs to request location access 
    locationManager.requestWhenInUseAuthorization() 

    if CLLocationManager.authorizedToRequestLocation() { 

     //have accuracy set to best for navigation - accuracy is not guaranteed it 'does it's best' 
     locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation 

     //find out current location, using this one time request location will start the location services and then stop once have the location within the desired accuracy - 
     locationManager.requestLocation() 
    } else { 
     //show alert for no location permission 
     showAlertNoLocation(locationError: .invalidPermissions) 
    } 
} 

Hier ist der Delegierte:

func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 

    if !CLLocationManager.authorizedToRequestLocation() { 
     showAlertNoLocation(locationError: .invalidPermissions) 
    } 
}