Arm1.ru

Изменения в Core Location Manager в iOS 8

Заметка про то, что в iOS 8 теперь нужно запрашивать разрешение на использование геолокации иначе.

Например, какой-нибудь такой старый код:

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager  startUpdatingLocation];

в iOS 8 при первом запуске не спросит разрешения у пользователя на использование его геолокации. Просто проигнорирует этот код и местоположение в приложении вы не получите без каких либо предупреждений. 

В iOS 8 теперь нужно использовать один из двух методов:

[locationManager requestWhenInUseAuthorization];
[locationManager requestAlwaysAuthorization];

Первый запрашивает разрешение на использование геолокации только во время собственно работы самого приложения (когда пользователь его запустил и находится в нём). Второй запрашивает на использование геолокации ещё и в фоновом режиме или даже когда приложение убито. Второй включает в себя первый. Если вам не надо следить за пользователем постоянно и в фоне, то достаточно первого.

Далее, чтобы использовать один из этих методом, надо в ваш Info.plist добавить новый пункт:

Key: NSLocationWhenInUseUsageDescription или NSLocationAlwaysUsageDescription, в зависимости от того, какой тип разрешения вы для себя выбрали. Value - текст-объяснение, зачем вам нужно разрешение на использование геолокации. Его можно оставить пустым, тогда пользователь увидит стандартный системный текст. Либо можно заполнить объяснением, тогда при запросе разрешения выведется ваш текст. В принципе, это удобно - объясняешь пользователю зачем - и ему понятно, и тебе больше вероятность, что он разрешит.

Таким образом, после добавления всего, что в предыдущем абзаце, вот такой код запросит для нас разрешение:

// locationManager обязательно должен быть property класса, иначе релизится
locationManager = [[CLLocationManager alloc] init];
   locationManager.delegate = self;
   locationManager.desiredAccuracy = kCLLocationAccuracyBest;
   
   if ( [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined ) {
      
      if ( [locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] ) {
         [[UIApplication sharedApplication] sendAction:@selector(requestAlwaysAuthorization)
                                                    to:locationManager
                                                  from:self
                                              forEvent:nil];
      }
   }
   
   [locationManager startUpdatingLocation];

Проверкап [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined проверяет статус разрешения - если оно ещё не было запрошено - то только тогда спрашиваем пользователя.

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

Такие дела.

keyboard_return back