2016-01-18 3 views
41

Я занимался некоторыми исследованиями в области CoreLocation. Недавно я столкнулся с проблемой, которая была рассмотрена в другом месте, но в Objective C и для iOS 8.Проверьте, включены ли службы определения местоположения

Мне кажется, что это глупо спрашивать об этом, но как вы можете проверить, разрешены ли службы определения местоположения с помощью swift на iOS 9?

КСН 7 (и, возможно, 8?) Можно использовать locationServicesEnabled(), но это, кажется, не работает при компиляции для прошивкой 9.

Так как бы я это сделать?

Спасибо!

ответ

117

Добавьте CLLocationManagerDelegate в свой класс наследования, а затем вы можете сделать эту проверку:

Swift 1.x - 2.x версия:

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 Версия:

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

Yup! Благодаря! Моя проблема была, что я пытался позвонить locatoinServicesEnabled на мой менеджер, то есть 'manager.locationServicesEnabled()' вместо 'CLLocationManager.loationServicesEnabled()' Решено! –

+1

Я понимаю, что ваш код - всего лишь пример, но он немного вводит в заблуждение ... Я думаю, что лучше, если 'authorizationStatus' * установлен * на' notDetermined', вместо того, чтобы просто регистрировать, было бы лучше запросить пользователя «Разрешить/Do not Allow " – Honey

+0

@ Хоуни, конечно, вы, конечно, можете использовать его, как хотите, и, как вы сказали, код является просто примером, чтобы показать, как он может быть использован. –

3

Когда вы вызываете -startLocation, если услуги определения местоположения были отклонены пользователем, делегат менеджера местоположений получит вызов - locationManager:didFailWithError: с кодом ошибки kCLErrorDenied. Это работает как во всех версиях iOS.

+0

Спасибо. К сожалению, когда я это пробовал, он показывает: «Использование неразрешенного идентификатора« kCLErrorDenied ». Мысли? –

5

В объективе-c

вы должны отслеживать пользователя, который уже отрицал или не определился, затем попросить разрешения или отправил пользователя в приложение «Настройка».

-(void)askEnableLocationService 
{ 
    BOOL showAlertSetting = false; 
    BOOL showInitLocation = false; 

    if ([CLLocationManager locationServicesEnabled]) { 

     switch ([CLLocationManager authorizationStatus]) { 
     case kCLAuthorizationStatusDenied: 
      showAlertSetting = true; 
      NSLog(@"HH: kCLAuthorizationStatusDenied"); 
      break; 
     case kCLAuthorizationStatusRestricted: 
      showAlertSetting = true; 
      NSLog(@"HH: kCLAuthorizationStatusRestricted"); 
      break; 
     case kCLAuthorizationStatusAuthorizedAlways: 
      showInitLocation = true; 
      NSLog(@"HH: kCLAuthorizationStatusAuthorizedAlways"); 
      break; 
     case kCLAuthorizationStatusAuthorizedWhenInUse: 
      showInitLocation = true; 
      NSLog(@"HH: kCLAuthorizationStatusAuthorizedWhenInUse"); 
      break; 
     case kCLAuthorizationStatusNotDetermined: 
      showInitLocation = true; 
      NSLog(@"HH: kCLAuthorizationStatusNotDetermined"); 
      break; 
     default: 
      break; 
     } 
    } else { 

     showAlertSetting = true; 
     NSLog(@"HH: locationServicesDisabled"); 
    } 

    if (showAlertSetting) { 
     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"Please enable location service for this app in ALLOW LOCATION ACCESS: Always, Go to Setting?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Open Setting", nil]; 
     alertView.tag = 199; 
     [alertView show]; 
    } 
    if (showInitLocation) { 
     [self initLocationManager]; 
    } 

} 

Внедрение alertView Затем делегат отправил пользователя, чтобы включить службу определения местоположения, если пользователь уже отклонил его.

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

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

Init Расположение Менеджер

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

Обратите внимание kCLAuthorizationStatusAuthorizedAlways и kCLAuthorizationStatusAuthorizedWhenInUse разница.

5

СВИФТ 3(По состоянию на 4 июля 2017 года)

if CLLocationManager.locationServicesEnabled() { 

} 

это скажет вам, если пользователь уже подавлено настройки расположения

3

Для swift3.0 и выше, если частые проверки сделаны за доступность услуг определения местоположения, создать класс, как показано ниже,

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

, а затем использовать его как это в VC

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

Это просто функция 2 линии в Swift 4:

import CoreLocation 

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

в 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

Чтобы запросить разрешение на месте службы, которые вы используете:

yourSharedLocationManager.requestWhenInUseAuthorization() 

Если состояние в данный момент неопределенное предупреждение покажет подсказки пользователя разрешить доступ. Если доступ запрещен, ваше приложение будет уведомлено в CLLocationManagerDelegate, так же, если в любой момент вам будет отказано в разрешении, вы будете обновлены здесь.

Для определения текущих разрешений необходимо проверить два отдельных состояния.

  • Если пользователь имеет общие службы определения местоположения включены или не

CLLocationManager.locationServicesEnabled()

  • Если пользователь предоставил правильное разрешение для вашего приложения ..

CLLocationManager.authorizationStatus() == .authorizedWhenInUse

Вы можете добавить расширение представляет собой удобный вариант:

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

}

Здесь осуществляется доступ, когда пользователь первый просил направления:

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

Здесь делегат:

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

    if !CLLocationManager.authorizedToRequestLocation() { 
     showAlertNoLocation(locationError: .invalidPermissions) 
    } 
} 
Смежные вопросы