Диалог разрешения текущего местоположения слишком быстро исчезает

Мое приложение принимает местоположение пользователя, получает координаты и обеспечивает расстояние до или от места назначения или от источника. Все эти возможные назначения отображаются в виде таблицы, поэтому я получаю координаты пользователей одновременно с заполнением таблицы. Единственное, что появляется предупреждение, запрашивающее местоположение пользователя, исчезает так быстро, что его невозможно щелкнуть!

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

Хотя трудно отследить, решение для этого довольно простое.

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

Я создавал экземпляр CLLocationManager в моем методе viewDidLoad . Поскольку это был локальный экземпляр метода, экземпляр был выпущен ARC после завершения выполненного метода. Как только экземпляр был выпущен, диалоговое окно исчезло. Решение было довольно простым. Измените экземпляр CLLocationManager как переменную уровня метода, которая будет переменной экземпляра класса. Теперь экземпляр CLLocationManager освобождается только после разгрузки класса.

Я попадаю в одну и ту же проблему (по крайней мере, по симптомам). В моем случае проблема была в приложении - (void)applicationWillResignActive:(UIApplication *)application; метод, когда я выпускал экземпляр CLLocationManager как часть подготовки к переходу фона. Когда я удалил его и оставил его только в - (void)applicationDidEnterBackground:(UIApplication *)application; проблема ушла.
Сложная часть заключается в том, что предупреждение Core Location DO приостанавливает ваше приложение, пока оно остается на переднем плане.
Надеюсь, что это вам поможет, у меня много времени, чтобы найти этого ублюдка 🙂

Я знаю, что это очень поздний ответ. Но это может помочь кому-то. Я также столкнулся с той же проблемой и потратил час, чтобы определить проблему. Сначала мой код был таким.

 CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; CLLocation *location = locationManager.location; //my stuff with the location [locationManager release]; 

Теперь уведомление о местоположении быстро исчезло. Когда я раскомментирую последнюю строку, она работает правильно.

  // [locationManager release]; 

Тот же симптом, другая причина: не вызывать startUpdatingLocation более одного раза подряд .

Я случайно структурировал такие вещи, что код непреднамеренно вызывал startUpdatingLocation два раза подряд, что, по-видимому, плохо. Возможно, это также имело какое-то отношение к выбору очереди, так как я ждал начала обновления в ожидании результата сетевого запроса, но мне не нужно было делать какую-либо магию GCD, чтобы ее исправить … просто нужно было убедиться, что я не повторил старт.

Надеюсь, кто-то сможет извлечь выгоду из моей боли. 🙂

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

В моем приложении я вызывал stopUpdatingLocation из applicationWillResignActive . Это было проблемой, потому что applicationWillResignActive вызывается, когда появляется диалоговое окно с правами. Это вызывало stopUpdatingLocation сразу после startUpdatingLocation , поэтому диалог немедленно исчезнет.

Решение состояло в том, чтобы просто вызвать stopUpdatingLocation из applicationDidEnterBackground .

Это происходило со мной при использовании iOS Simulator. Я решил, что это происходит потому, что моя схема запуска имитировала местоположение. Я думаю, что это имеет тот же эффект, что и вызов locationManager.startUpdatingLocation() при запуске, и поэтому он закрывает диалог.

Отмена проверки флажка «Разрешить определение местоположения» в диалоговом окне «Редактировать схемы» устранила проблему. Как только он будет работать так, как вы хотите, и разрешение будет установлено, вы можете снова включить симуляцию местоположения, и симулятор будет работать нормально с этого момента.

Swift 4 и iOS 11 :

Обязательно добавьте в свой файл CoreLocation строки конфиденциальности (как всегда, так и inInse ) и добавьте CoreLocation Framework в свой проект

Диалог выбора местоположения отображается правильно, когда я изменил:

 locationManager.requestAlwaysAuthorization() 

с:

 locationManager.requestWhenInUseAuthorization() 

PS .: Я пробовал ВСЕ советы и все терпит неудачу (авторизация запроса viewDidLoad , var вместо let для locationManager, не запускайте startUpdatingLocation() после startUpdatingLocation() думаю, что это ошибка, и я надеюсь, что они разрешат ее как можно скорее как возможно ..

вы чаще определяете переменную locationManager как глобальный объект.

 @interface ViewController : UIViewController { CLLocationManager *locationManager; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; } 

Решение SWIFT 4 @Zoli будет выглядеть так:

 class WhateverViewController: UIViewController { let locationManager = CLLocationManager() // here is the point of the @Zoli answer // some code override func viewDidLoad() { super.viewDidLoad() // some other code locationManager.requestWhenInUseAuthorization() // some other code } } 
Interesting Posts

атрибут должен быть readwrite, в то время как его первичный должен быть только для чтения

Возврат в главное меню при длинном нажатии кнопки «Доступ к коммутатору»

iAds вызывает проблемы с автоматической компоновкой?

Как использовать многозначный заголовок и значение из набора настроек

Невозможно присвоить значение типа NSTaggedPointerString 'NSNumber'

AFNetworking setImageWithURLRequest скачать прогресс

Прозрачный мигающий фон UITableViewCell при анимации

Как определить категорию сообщения с помощью MailCore2

Создание SSL-соединения с использованием сертификата

didActivate не вызывается CallKit

Каким размером должны быть изображения TabBar?

ios: как решить эту проблему с утечкой памяти

'init' недоступен: используйте 'fromMemoryRebound (to: capacity: _)', чтобы временно просматривать память как другой тип совместимого с макетами

как создать массив строк или float в Objective-C

Лучший способ создания мастера с раскадрой и основными данными

Давайте будем гением компьютера.