2015-10-29 5 views
2

Я использовал службы определения местоположения во многих приложениях, но это новое приложение имеет проблемы с iOS 8.0 и выше. Я не получаю уведомление о первом запросе загрузки приложения, чтобы разрешить услуги определения местоположения. Однако на моем устройстве iOS 7.1 я получаю подсказку.iOS: Отслеживание местоположения пользователя

Вот что у меня в AppDelegate в didFinishLaunchingWithOptions:

self.locationManager = [CLLocationManager new]; 
[self.locationManager setDelegate:self]; 
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
    [self.locationManager requestAlwaysAuthorization]; 
} 

[self initializeRegionMonitoring]; 

И метод initializeRegionMonitoring является:

-(void) initializeRegionMonitoring { 

NSLog(@"initialize region monitoring"); 

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

// radius of region being monitored 
CLLocationDistance radius = 25; // 20 metre sensitivity 
CLLocationCoordinate2D coordinate; 
coordinate.latitude = 25.886099; 
coordinate.longitude = -80.165124; 

self.someRegion = [[CLCircularRegion alloc] initWithCenter:coordinate radius:radius identifier:@"Qualex"]; 
self.someRegion.notifyOnEntry = YES; 
self.someRegion.notifyOnExit = YES; 
[self.locationManager startMonitoringForRegion:self.someRegion]; 

// notify changes when the device has moved x meters 
self.locationManager.distanceFilter = 20; // or set to 20 meters 
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation; 
[self.locationManager startUpdatingLocation]; 
[self.locationManager startMonitoringSignificantLocationChanges]; 
} 

Я также установил NSLocationAlwaysUsageDescription в моем info.plist, так что должен быть тем, что я забыл, не так ли? Спасибо за помощь!

Edit:

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

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

+0

Вы намеревались заменить экземпляр вашего 'locationManager' в методе' initializeRegionMonitoring'? У второго экземпляра никогда не будет вызвана «requestAlwaysAuthorization», которая может быть источником вашей проблемы. – thelaws

+0

Вы действительно намеревались использовать два разных менеджера местоположения, как это? – matt

+0

@thelaws Это не должно иметь значения. Авторизация местоположения является глобальной в текущем приложении во всех экземплярах CLLocationManager. После того, как пользователь предоставил постоянный доступ к местоположению, все управляющие местоположением будут иметь этот доступ – n00neimp0rtant

ответ

2

Перед тем, как iOS 8, вы можете запросить разрешение на размещение просто путем создания экземпляра объекта CLLocationManager и попытки начать отслеживание местоположения. В iOS 8 и выше это не дает приглашения на разрешение; вы должны запросить авторизацию вручную с помощью методов requestAlwaysAuthorization или requestWhenInUseAuthorization.

Как говорится, на iOS 8, если вы вызываете любой из этих методов, то экземпляр CLLocationManager, по которому вы его вызвали, освобождается, запрос разрешения на размещение отклоняется. Что здесь происходит, так это то, что вы создаете диспетчер местоположений, запрашивая разрешение (iOS начинает пытаться представить диалог разрешения), вызывая initializeRegionMonitoring и устанавливая свойство self.locationManager новому экземпляру диспетчера местоположений. Это приводит к тому, что вы создали первый, который вы создали, чтобы освободить ARC, поэтому приглашение на разрешение отклоняется, прежде чем он даже получит шанс появиться.

Снятие линии self.locationManager = [[CLLocationManager alloc] init]; в вашем методе initializeRegionMonitoring должно устранить проблему.

+0

AFAIK, эта причуда CLLocationManager и процесс авторизации не задокументированы, поэтому +1 по вашему вопросу :) – n00neimp0rtant

Смежные вопросы