iOS 8.1 CoreLocationManager requestWhenInUseAuthorization не запрашивает AlertView

Я пытаюсь использовать местоположение пользователя в своем приложении для iOS. Приложение работает на iOS 7, но не работает на iOS 8.

Я пробовал все это. Прочитал кучу туториалов и знаю, что в iOS 8 нужно вызвать метод requestWhenInUseAuthorization и добавить ключ NSLocationWhenInUseUsageDescription в Info.plist.

Но он все еще не работает, он не спрашивает разрешения пользователя, я тестирую на реальном устройстве (iPhone 5c под управлением iOS 8.1.x). Я пытался переустановить приложение много раз.

Это коды очень-очень небольшого проекта, который я создал для проверки этой штуки.

Мой ViewController.m

#import "ViewController.h"

#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

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

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = kCLHeadingFilterNone;

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        NSLog(@"Pôde chamar o método"); // It could call the method
        [self.locationManager requestWhenInUseAuthorization];
    }

//    [self.locationManager startUpdatingLocation];

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - CLLocationManagerDelegate

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    NSLog(@"Atualizou Localização para: %@", [locations lastObject]); // Updated the location to
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSLog(@"Location Manager falhou com erro: %@", error); // Location manager failed with error
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status == kCLAuthorizationStatusAuthorized) {
        [self.locationManager startUpdatingLocation];
    }
}

@end

Моя информация.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>wallace.$(PRODUCT_NAME:rfc1034identifier)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>BNDL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1</string>

    <key>NSLocationWhenInUseUsageDescription</key>
    <string></string>


</dict>
</plist>

Кто-то знает, как это выяснить?


person Wallace    schedule 09.03.2015    source источник
comment
Просто для подтверждения, входит ли он в оператор if, где вы запрашиваете авторизацию и регистрируете Pôde chamar o método? И когда вы говорите, что он не работает, вы имеете в виду, что он никогда не запрашивает авторизацию? Или он не отслеживает местоположение должным образом? Если он просто не запрашивает пользователя, проверьте приложение настроек, чтобы убедиться, что оно еще не авторизовано и что ваши службы определения местоположения включены.   -  person Stonz2    schedule 09.03.2015
comment
Оператор if выполняется. Под неработающим я подразумеваю, что он не запускает AlertView, запрашивая разрешение пользователя. И метод locationManager:didChangeAuthorizationStatus: вызывается один раз со значением статуса kCLAuthorizationStatusNotDetermined.   -  person Wallace    schedule 09.03.2015
comment
Рассмотрите возможность добавления строкового значения к NSLocationWhenInUseUsageDescription в вашем plist. Я думаю, вам нужно предоставить текст, который пользователь увидит при отображении предупреждения.   -  person Stonz2    schedule 09.03.2015
comment
@Stonz2 Stonz2 Я добавил текст к строковому значению. Но результат тот же. Это ключ и значение: ‹key›NSLocationWhenInUseUsageDescription‹/key› ‹string›Quando em uso‹/string›   -  person Wallace    schedule 09.03.2015
comment
Не знаю, что еще вам сказать - я создал новый проект и точно скопировал ваш код, и он сработал с первой попытки. Если я отключу службы определения местоположения на телефоне, я получу kCLAuthorizationStatusDenied в методе locationManager:didChangeAuthorizationStatus:. Если у вас включены службы определения местоположения (Настройки -> Конфиденциальность -> Службы определения местоположения), то нет видимых причин, по которым они не должны работать.   -  person Stonz2    schedule 09.03.2015
comment
@Stonz2, это очень странно. Я действительно не знаю, что происходит. Какова версия xCode вашего компьютера? Вы тестировали устройство или симулятор iOS 8? Потому что с iOS 7 работает нормально. Я использую xCode 6.1.1.   -  person Wallace    schedule 09.03.2015
comment
Создано с использованием Xcode 6.1.1 (6A2008a) и протестировано на iPhone 5S под управлением iOS 8.1 (12B411). Это также работало на симуляторе под управлением 8.1.   -  person Stonz2    schedule 09.03.2015
comment
У меня была похожая проблема, но это была просто глупая ошибка. (Может быть, вы сделали ту же ошибку, кто знает). Я отредактировал plist тестового проекта с новыми записями, а не с самим проектом.   -  person user2043332    schedule 10.03.2015


Ответы (3)


Добавьте NSLocationAlwaysUsageDescription и NSLocationWhenInUseUsageDescription к Info.plist. Затем вы можете указать, каким будет текст AlertView для каждого из этих значений.

Менеджер местоположения просматривает текст в этих полях для запроса в AlertView.

person aahrens    schedule 09.03.2015
comment
NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription. - person Stonz2; 09.03.2015
comment
Да, они оба не требуются, но я обычно просто включаю их обоих. - person aahrens; 09.03.2015
comment
Он включен. См. конец моего Info.plist: ‹key›NSLocationWhenInUseUsageDescription‹/key› ‹string›‹/string› И я попытался добавить оба значения ключа. - person Wallace; 09.03.2015
comment
но у вас нет строкового значения. Вам нужно строковое значение для представления текста для отображения - person aahrens; 09.03.2015
comment
@aahrens, на самом деле мне это не нужно. Это поле может быть пустым. Но просто чтобы не сомневаться я добавил строковое значение. Результат тот же. - person Wallace; 09.03.2015

Добавьте следующее в locationManager:didChangeAuthorizationStatus:

if (status == kCLAuthorizationStatusNotDetermined) {
    [manager requestAlwaysAuthorization];
}
person CW0007007    schedule 20.05.2015

Я не знаю почему, но по какой-то причине добавление NSLocationWhenInUseUsageDescription к info.plist и вызов requestWhenInUseAuthorization у меня не сработало, после нескольких попыток я нашел решение ниже. Проводной, но работал для меня.

Сначала добавьте ключи NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription в info.plist и вызовите оба метода requestAlwaysAuthorization и requestWhenInUseAuthorization. Теперь вы должны получить уведомление. Получив уведомление, вы можете удалить ненужный код и элементы info.plist.

Это сработало после нескольких испытаний, надеюсь, это поможет хотя бы нескольким людям.

person Trident    schedule 03.06.2015