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

RequestAlwaysAuthorization, не отображающая разрешения

Я пытаюсь использовать некоторые причудливые iBeacons без успеха, kCLAuthorizationStatusNotDetermined все время. Согласно другим вопросам, необходимо добавить эти ключи в info.plist(некоторые вопросы говорят одно, другое говорит обоим). Согласно статье для iBeacons мне нужен параметр Always.

<key>NSLocationWhenInUseUsageDescription</key>
<string>Nothing to say</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Permiso para acceder siempre</string>

В viewDidAppear:

self.locManager = [[CLLocationManager alloc]init];
self.locManager.delegate = self;
[self.locManager requestAlwaysAuthorization];
NSUUID* region1UUID = [[NSUUID alloc]initWithUUIDString:@""]; //ibeacon real UUID between "". Checked it not nil.

self.beaconRegion = [[CLBeaconRegion alloc]
                                initWithProximityUUID:proximityUUID
                                identifier:@"myCoolString"];

self.beaconRegion.notifyEntryStateOnDisplay = YES;
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = NO;
[self.locManager startMonitoringForRegion:self.beaconRegion];
[self.locManager startRangingBeaconsInRegion:self.beaconRegion];

Значок не отображался в настройках/Конфиденциальность/Местоположение, пока не был выполнен один из двух последних методов. Предупреждение о подтверждении разрешений никогда не появляется. Если я сделаю ручную замену в настройках местоположения и проверю ее, она изменит статус, но через несколько мгновений Location at Settings удалит статус "Всегда" для моего приложения и снова опустит его. Позже я проверю без везения

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {

Любые идеи, что отсутствует или неправильно? Спасибо вам

4b9b3361

Ответ 1

Для разработчиков iOS 11 вы должны посмотреть этот пост: Службы местоположения, не работающие в iOS 11.


TL; DR: вам нужно ВСЕ ТРЕХ ключей местоположения в Info.plist:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>

Наряду с InfoPlist.strings переводами в случае многоязычных приложений.

Ответ 2

Была такая же проблема. Оказалось, что в моем случае NSLocationAlwaysUsageDescription требуется в моих файлах локализации InfoPlist.strings. Недостаточно иметь NSLocationAlwaysUsageDescription в Info.plist...

Ответ 3

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

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [locationManager requestAlwaysAuthorization];
}

Изменение локальной переменной на переменную экземпляра сделало предупреждение для отображения:

@interface AppDelegate () {
    CLLocationManager *_locationManager;
}
@end

_locationManager = [[CLLocationManager alloc] init];
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [_locationManager requestAlwaysAuthorization];
}

Ответ 4

Просто добавьте эти строки в ваш файл .plist

<key>NSLocationAlwaysUsageDescription</key>
<string>Optional message</string>

Ответ 5

Недавно у меня появилась похожая проблема с IOS 11, когда я пытался использовать

locationManager.requestAlwaysAuthorization()

Решением для меня было добавить все 4 разрешения в plist.info для получения оповещения:

  • Конфиденциальность - Местоположение при использовании Описание использования
  • Конфиденциальность - Описание использования местоположения
  • Конфиденциальность - Расположение Всегда Описание использования
  • Конфиденциальность - Местоположение всегда и когда используется Описание использования

Ответ 6

Попробуйте начать обновление местоположения (помогли мне)

[self.locationManager startUpdatingLocation];

Ответ 7

Найдено, задокументировано на форумах и протестировано его с ошибкой Objective-C iOS 8. Тот же код, написанный в Swift, просто работает. Рабочий быстрый код, делегат - это вызов.

Добавить базовую структуру ядра для Параметры проекта/Цели/Возможности/Режимы фона, установленные "Обновления местоположения" и "Использует аксессуары Bluetooth LE", Добавить ключ в Info.plist NSLocationAlwaysUsageDescription

import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate  {

var locManager: CLLocationManager?

override func viewDidLoad() {
    super.viewDidLoad()
    self.locManager = CLLocationManager();
    self.locManager!.delegate = self;
    if (!CLLocationManager.locationServicesEnabled()) {
        println("Location services are not enabled");
    }
    self.locManager!.requestAlwaysAuthorization();
    self.locManager!.pausesLocationUpdatesAutomatically = false;
    let uuidString = ""  // My ibeacon string there
    let beaconIdentifier = "myCompany"
    let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString)
    let beaconRegion:CLBeaconRegion = CLBeaconRegion(proximityUUID: beaconUUID,
        identifier: beaconIdentifier)
    self.locManager!.startMonitoringForRegion(beaconRegion)
    self.locManager!.startRangingBeaconsInRegion(beaconRegion)
    self.locManager!.startUpdatingLocation()
}

Диалог отображается ОК

Ответ 8

Убедитесь, что вы добавили ключи в правильный файл Info.plist. Не забудьте там один для вашего приложения и один для AppTest.

Ответ 9

Быстрое использование Swift 3.X

import CoreLocation

 public var locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()


        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
        locationManager.startUpdatingLocation()

}



    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        let altitudeG = locations.last?.altitude
        let longitudeG = locations.last?.coordinate.longitude
        let latitudeG = locations.last?.coordinate.latitude

print("\(altitudeG) \(longitudeG) \(latitudeG)")

    }

Ответ 10

Я скопировал этот учебник...

http://willd.me/posts/getting-started-with-ibeacon-a-swift-tutorial

Это не сработало, хотя исправление было очень простым, не объявляйте

let locationManager = CLLocationManager()

Но переместите его в класс как переменную

var locationManager = CLLocationManager()

И это работает!!

Ответ 11

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

Из Документы Apple:

Обсуждение Если текущий статус авторизации не определен, этот метод выполняется асинхронно и предлагает пользователю предоставить разрешение на использование приложений местоположения. Запрос пользователя содержит текст из ключа NSLocationAlwaysUsageDescription в файл приложений Info.plist и наличие этого ключа при вызове этого метода. После определения статуса местоположение менеджер доставляет результаты делегатам Метод locationManager (: didChangeAuthorization:). Если текущий статус авторизации - это ничего, кроме notDetermined, этот метод ничего не делает и не вызывает Метод locationManager (: didChangeAuthorization:), за одним исключением. Если ваше приложение никогда не запрашивало авторизацию и ее текущий статус авторизации разрешенWhenInUse, вы можете назвать это метод один раз, чтобы попытаться изменить статус авторизации вашего приложения на авторизованно.

Ответ 12

Пожалуйста, проверьте Ссылка ссылки

Он описал все изменения, касающиеся iOS 11. Ваша проблема также, по-видимому, относится к числу рассмотренных случаев. Это может дать вам представление о том, какие изменения необходимо внести в свой код, чтобы исправить проблему.

Ответ 13

Для ios 11 Важно добавить ниже упомянуть новое разрешение, которое

NSLocationAlwaysAndWhenInUseUsageDescription

вместе со старым разрешением, которое

NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription

исправить запрос Всегда Авторизация не показывает разрешение оповещения.