Заметка про то, что в 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.
Такие дела.