it-swarm.com.ru

requestAlwaysAuthorization не показывает предупреждение о разрешении

Я пытаюсь использовать некоторые модные iBeacon безуспешно, 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's 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];

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

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

Есть идеи, чего не хватает или что не так? Спасибо

27
Carlos Pastor

Разработчикам 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 для многоязычных приложений.

30
Elist

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

19
chris

Я заметил, что если ваш экземпляр 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];
}
13
balkoth

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

<key>NSLocationAlwaysUsageDescription</key>
<string>Optional message</string>
7
Artyom Devyatov

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

2
Josh B

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)")

    }
2
SwiftDeveloper

Обнаружено, задокументировано на форумах и протестировано это ошибка, связанная с iOS 8 в Objective-C . Тот же код, написанный на Swift, просто работает. Работает 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()
}

Диалог появляется ОК

2
Carlos Pastor

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

locationManager.requestAlwaysAuthorization()

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

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

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

[self.locationManager startUpdatingLocation];
2
Anthony Marchenko

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

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

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

let locationManager = CLLocationManager ()

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

var locationManager = CLLocationManager ()

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

0
user3069232

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

От Apple Docs :

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

0
Crag

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

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

0
Aanchal Chaurasia