Подтвердить что ты не робот

IOS 8 requestWhenInUseAuthorization no Popup

Я попытался сделать свой AppProject iOS 8 готовым. Я много читал о

[_locationManager requestWhenInUseAuthorization];

и запись в plist

NSLocationWhenInUseUsageDescription

Итак, я изменил все необходимые строки кода.

Он отлично работает, но теперь я снова скопировал свой проект с моей базы iOS 7, чтобы включить новые функции. Но когда я вношу изменения в iOS8 Location Privacy, всплывающее окно больше не отображается.

Мой код работал до тех пор, пока я не скопировал.

<?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>NSLocationWhenInUseUsageDescription</key>
        <string>tolle sache </string>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        <key>CFBundleExecutable</key>
        <string>${EXECUTABLE_NAME}</string>
        <key>CFBundleIdentifier</key>
        <string>fapporite.${PRODUCT_NAME:rfc1034identifier}</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</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>
    </dict>
</plist>

и вот мой вызов

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {

        _UserLocation = [[CLLocation alloc]init];
        _locationManager = [[CLLocationManager alloc]init]; // initializing locationManager
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest; // setting the accuracy
        [_locationManager requestWhenInUseAuthorization]; // iOS 8 MUST
        [_locationManager startUpdatingLocation];  //requesting location updates

        NSLog(@"passed initwithcode");

    }
    return self;
}

Как я могу это исправить?

4b9b3361

Ответ 1

Из документации

NSLocationWhenInUseUsageDescription (String - iOS) описывает причина, по которой приложение обычно выполняет доступ к местоположению пользователей во время работы на переднем плане. Включите этот ключ, когда ваше приложение использует местоположение услуги для отслеживания текущего местоположения пользователей напрямую. Этот ключ делает не поддерживают использование служб определения местоположения для мониторинга регионов или мониторинга пользователей, используя значительную услугу изменения местоположения. система включает значение этого ключа в панели предупреждений, отображаемой на пользователь, запрашивающий разрешение на использование служб определения местоположения.

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

Этот ключ поддерживается в iOS 8.0 и более поздних версиях. Если ваш файл Info.plist включает в себя как этот ключ, так и ключ NSLocationUsageDescription, система использует этот ключ и игнорирует ключ NSLocationUsageDescription.

Прочитайте об этом здесь.

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

Открыть как- > Исходный код

а затем добавить в конце до </dict></plist>

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

Если вы хотите, вы можете добавить текст между <string></string>, который описывает пользователя, почему вы хотите использовать его/ее местоположение. Этот текст будет отображаться в тексте по умолчанию в сообщении.

Ответ 2

Попробуйте написать NSLocationWhenInUseUsageDescription в Info.plist

Ответ 3

iOS 8.3, Xcode 6.3.1, ARC включен

Вопрос был разрешен, но у меня есть (2) заметки для добавления из моего недавнего участия в CLLocationManager.

1) В ваш файл *.plist должны быть введены следующие ключи:

enter image description here

Наиболее часто используемые ключи имеют общие более описательные имена, такие как "Конфиденциальность - Описание использования местоположения", который действительно является ключом "NSLocationUsageDescription".

Чтобы увидеть имена "сырых" ключей, перейдите в "* -Info.plist" и щелкните правой кнопкой мыши в области "Навигатор", где указаны ключи, см. ниже:

enter image description here

И вы получите следующие результаты:

enter image description here

Три ключа, относящиеся к этой статье:

enter image description here

2) Убедитесь, что вы выделили и инициализировали реализацию CLLocationManager, прежде чем пытаться запросить авторизацию или местоположение обновления.

*. h файл:

@interface SomeController : UIViewController <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

*. m file:

- (IBAction)locationButton:(UIButton *)sender
{
    if (self.locationManager == nil)
    {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
    }
    else
    {
        nil;
    }

    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
    {
        [self.locationManager requestWhenInUseAuthorization];
    }
    else
    {
        nil;
    }

    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}

Надеюсь, это сэкономит время! Спасибо.

Ответ 4

Вот немного получилось. Убедитесь, что вы добавляете ключи NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription в основной пучок пакетов, а не один из ваших целевых целевых объектов!

Ответ 5

Была ли та же проблема вызвана тем, что я создавал экземпляр CLLocationManager в локальном var внутри метода, решив его, создав свойство CLLocationManager класса.
Через некоторое время я нашел решение здесь, но я оставляю его здесь, так как это первый результат в google, надеюсь, что я сэкономлю вам время:

requestWhenInUseAuthorization() не работает в iOS 8 с NSLocationWhenInUseUsageDescription Key в Info.plist

Ответ 6

Относительно Apple Watch:

Вам нужно поместить ключ requestWhenInUseAuthorization в iPhone Info.plist, а не в приложение WatchKit.

Это уже дважды укусило меня.