2014-12-29 2 views
7

ОБНОВЛЕНИЕ: ЭТО НЕ ДУБЛИКАТ. Я уже добавил необходимый ключ в info.plist, как указано в моем первоначальном вопросе, и проблема остается. Я пробовал все три ключа в разных комбинациях.Не предложено включить службы местоположения в приложении

Прежде, чем кто-либо расстроится, я прочитал много сообщений на форуме Apple Dev и переполнял сообщения о переполнении и не могу понять, почему мое приложение отказывается предлагать пользователю разрешить использование In In Use.

Я добавил следующий ключ к моему Info.plist файлу с сопровождающим строковым значением:

NSLocationWhenInUseUsageDescription 

Я тогда написанным (как в Swift и Obj-C) код, который должен подсказать пользователь:

@property CLLocationManager *location; 
... 
@synthesize location; 
... 
location = [[CLLocationManager alloc] init]; 
location.delegate = self; 

location.desiredAccuracy = kCLLocationAccuracyBest; 
location.distanceFilter = kCLDistanceFilterNone; 

[location requestWhenInUseAuthorization]; 
[location startUpdatingLocation]; 


I'm using the following CLLocationManagerDelegate methods. 
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status 

Это было в основном скопировано прямо из примера кода Apple «LocateMe».

Независимо от того, какие различные последовательности или незначительные изменения я стараюсь, приложение никогда не запрашивает разрешение. Я использовал оператор switch для определения состояния [CLLocationManager authorizationStatus], но постоянно получаю ответ «Не определено».

if ([CLLocationManager locationServicesEnabled]) { 
     switch ([CLLocationManager authorizationStatus]) { 
      case kCLAuthorizationStatusAuthorizedAlways: 
       NSLog(@"Always Authorized"); 
       break; 
      case kCLAuthorizationStatusDenied: 
       NSLog(@"Denied"); 
       break; 
      case kCLAuthorizationStatusAuthorizedWhenInUse: 
       NSLog(@"Authorized in Use"); 
       break; 
      case kCLAuthorizationStatusNotDetermined: 
       NSLog(@"Not Determined"); 
       break; 
      case kCLAuthorizationStatusRestricted: 
       NSLog(@"Restricted"); 
       break; 
     } 

    } 

Любая помощь была бы принята с благодарностью. Я запускаю Xcode 6.2 (6C101) с физическим устройством iOS 8.1.2 и iOS 8.2 (12D5452a) для тестирования.

+0

@ n00bПрограммист Я не вижу этот параметр сброса, доступный на вкладке «Настройки»> «Сброс» симулятора. Кроме того, я написал две программы: одну в Swift и одну в Obj-C, и обе делают то же самое. Я также тестировал с помощью физического устройства и получил те же результаты. Я еще не пробовал перезагрузить оборудование. – Andrew

ответ

1

Много полезных сравнений здесь: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Кроме того, глупый вопрос времени: смешать _location и self.location, но вы не показываете свой код свойства/синтеза. Вы уверены, что работаете на одном объекте?

+0

Я отредактировал код, чтобы добавить @synthesize и изменить свойство, просто используя значение 'location'. Также. Я прочитал эту страницу, но по какой-то причине мне это не помогает. 'NSLocationWhenInUseUsageDescription' является значением String в моем файле Info.plist. – Andrew

+0

Вот отрезок от моего активного проекта, который подсказывает правильно. За исключением теста совместимости с iOS7/8, он в основном соответствует вашим требованиям. '_locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; if ([_locationManager отвечаетToSelector: @selector (requestWhenInUseAuthorization)]) { [_locationManager requestWhenInUseAuthorization]; } [_locationManager startUpdatingLocation]; ' Huh. GuessMode: проверьте настройки> Конфиденциальность> Службы местоположения. Есть ли какие-либо настройки для вашего приложения? –

+0

Не отображаются настройки и статус CLAuthorization не определен. – Andrew

1

Я обнаружил, что в вашем info.plst файл, который вы не можете использовать конфиденциальности - Расположение Описание использования ключ, вы должны иметь ключ с именем NSLocationWhenInUseUsageDescription и значение. Я был в состоянии получить код работает, добавляя этот ключ в мой info.plist

enter image description here

#import <MapKit/MapKit.h> 

@interface ViewController() 

@property CLLocationManager * location; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    _location = [[CLLocationManager alloc] init]; 

    self.location.delegate = self; 
    self.location.desiredAccuracy = kCLLocationAccuracyBest; 
    self.location.distanceFilter = kCLDistanceFilterNone; 

    [_location requestWhenInUseAuthorization]; 
    [self.location startUpdatingLocation]; 
} 
+0

Однако я тестирую 8.1, а не 8.2. –

+0

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

2

Я столкнулся с одной и той же проблемой, после того, как в течение двух дней выкопались, оказалось, что приложение не читает из файла info.plist, который входит в комплект на панели навигатора проекта, поскольку он локализован в другой язык и основа интернационализация используется, это означает, что в Finder будет 3 Info.plist файлов:

1- под папкой Tests

2- под base.lproj папки

3- под аргоном .lprj (ar относится к арабскому языку).

проект читает версию base.lproj, которая не входит в комплект поставки в панели навигатора проекта.

Я сделал то, что я взял резервную копию файла plist, который я хочу (номер 2 выше), и удалил локализацию информации.который находится внутри навигатора проекта и выбрал удаление с диска, чтобы полностью удалить его, затем я взял резервную копию и поместил ее под корень проекта в Finder и импортировал обратно в Xcode, и теперь проект читается из нового info.plist файл и ключ NSLocationWhenInUseUsageDescription запускает оповещение авторизации пользователя при запуске приложения.

надеюсь, что это поможет.

0

Это может быть глупо, но я просто потратил почти 2 часа в два раза и тройную проверку всех ответов, которые я мог найти о разрешениях CLLocationManager.

Я чувствовал себя глупо, когда понял, что у меня было 2 файла info.plist, и я использовал неправильный!

Вы можете проверить настройки своего проекта - есть значение Info.plist File.

Просто хотите оставить его здесь для будущих читателей.

0

Если вы изменили настройки местоположения на вашем симуляторе iPhone, это может привести к тому, что приглашение не появится. Например, если вы уже установили разрешения на доступ через Allow Locations, чтобы получить доступ к подсказке iOS и приняли решение, это будет сохранено в настройках конфиденциальности для симулятора iPhone, и поэтому последующие вызовы на locationManager.requestAlwaysAuthorization() или locationManager.requestWhenInUseAuthorization() не будут отображать подсказку iOS, поскольку у вас уже есть определили вашу Конфиденциальность -> Настройки местоположения для вашего приложения.

Для сброса настроек для iPhone тренажере: "iOS Simulator" -> "Reset Content and Settings..."

Также я сделал чистую сборку в Xcode и выйти и перезапустить симулятор iPhone в какой-то момент, я мог бы быть неправильно об этом часть бытия любой помощи ...

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