authorizationStatus для CLLocationManager устарел в iOS 14

#ios #swift #core-location #ios14

#iOS #swift #расположение ядра #ios14

Вопрос:

Я использую этот код, чтобы проверить, есть ли у меня доступ к местоположению пользователя или нет

 if CLLocationManager.locationServicesEnabled() {
    switch CLLocationManager.authorizationStatus() {
        case .restricted, .denied:
            hasPermission = false
        default:
            hasPermission = true
        }
    } else {
        print("Location services are not enabled")
    }
}
  

И Xcode (12) кричит на меня с этим предупреждением:

 'authorizationStatus()' was deprecated in iOS 14.0
  

Итак, какова замена?

Ответ №1:

Теперь это свойство CLLocationManager , authorizationStatus . Итак, создайте CLLocationManager экземпляр:

 let manager = CLLocationManager()
  

Затем вы можете получить доступ к свойству оттуда:

 switch manager.authorizationStatus {
case .restricted, .denied:
    ...
default:
    ...
}
  

В iOS 14 есть несколько изменений, связанных с местоположением. Смотрите WWDC 2020 Что нового в местоположении.


Излишне говорить, что если вам также необходимо поддерживать версии iOS до 14, просто добавьте #available проверку, например:

 let authorizationStatus: CLAuthorizationStatus

if #available(iOS 14, *) {
    authorizationStatus = manager.authorizationStatus
} else {
    authorizationStatus = CLLocationManager.authorizationStatus()
}

switch authorizationStatus {
case .restricted, .denied:
    ...
default:
    ...
}
  

Комментарии:

1. Спасибо, но я получаю, что этот статический член ‘manager’ не может использоваться для экземпляра типа ‘CLLocationManager’

2. Ошибка в бета-версии Xcode, скорее всего, если я установлю цель на iOS 13, то оба примера будут работать с использованием CLLocation literate в качестве исходного плаката и с использованием let manager = CLLocationManager() как вы продемонстрировали, тогда статической ошибки участника не будет. Странно

3. Если вам необходимо одновременно поддерживать iOS 14 и более ранние версии, используйте #available check .

Ответ №2:

Версия Objective C:

В интерфейсе класса

 @property (nonatomic, strong) CLLocationManager *locationManager;
  

В коде класса

 - (id) init {
self = [super init];
if (self != nil) {
    self.locationManager = [[CLLocationManager alloc]init];
}
return self;
}

-(CLLocation*)getLocation
{
    CLAuthorizationStatus status = [self.locationManager authorizationStatus];
    if (status == kCLAuthorizationStatusNotDetermined)
    {
        [self promptToEnableLocationServices];
        return nil;
    }
 etc...