2015-09-07 2 views
0

После отправки моего приложения мне нужно получить местоположение пользователя с помощью CoreLocation (#import), но НИКОГДА не спрашивайте у меня предупреждения о разрешении.iOS locationmanager не запрашивает разрешения пользователя даже с NSLocationAlwaysUsageDescription и NSLocationWhenInUseUsageDescription в Info.plist

ViewController.h 

#import "RootViewController.h" 
#import <UIKit/UIKit.h> 
#import <CoreLocation/CoreLocation.h> 

@interface AroundMeViewController : RootViewController <CLLocationManagerDelegate> 

@property(nonatomic, strong) CLLocationManager *locationManager; 

... 

@end 

__________ 

ViewController.m 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

NSLog(@"LOG: %d", [CLLocationManager locationServicesEnabled]); 

self.locationManager = [[CLLocationManager alloc] init]; 
// Set a delegate to receive location callbacks 
self.locationManager.delegate = self; 

// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7. 
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 
    [self.locationManager requestAlwaysAuthorization]; 
} 

.... 
// Start the location manager 
[self.locationManager startUpdatingLocation]; 

NSLog(@"LOG: %@", self.locationManager); 

..... 

} 

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

+0

Получаете ли вы обновления местоположения? –

+0

Нет в этом приложении, но тот же код в пустом проекте отлично работает:/ Я думаю, что есть что-то, что молчаливое мое заявление. –

+0

В настройках -> Конфиденциальность -> Службы определения местоположения. Включено ли ваше приложение? Какие разрешения у него есть? –

ответ

0

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

Похоже, этот метод делегата вызывается, когда locationManager настроен, поскольку мой запуск запускался, пока экран всплеска все еще показывался (когда я устанавливал делегат locationManager, я подозреваю), а затем снова, когда я вызывал triggerLocationServices(). Это может быть то, что в действительности «замалчивает» ваш запрос.

Я изменил свои методы к следующему:

func triggerLocationServices() { 
     if CLLocationManager.locationServicesEnabled() { 
      if self.locationManager.respondsToSelector("requestAlwaysAuthorization") { 
       // request authorization to use location 
      } else { 
       // start updating location 
      } 
     } 
    } 

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus){ 
     if status == .AuthorizedAlways || status == .AuthorizedWhenInUse { 
      // start updating location 
     } 
     else { 
      triggerLocationServices() 
     } 
    } 

и удалены любые другие вызовы в triggerLocationServices(). Это, наряду с правильными ключами info.plist, разрешило это для меня.

Извинения за быстрый код, надеюсь, что вы можете перевести на Obj-C.

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