Диалоговое окно разрешения текущего местоположения исчезает слишком быстро
мое приложение принимает местоположение пользователя , получает координаты и обеспечивает расстояние до или от места назначения или происхождения. Все эти возможные направления отображаются в виде таблицы, поэтому я получаю координаты пользователей одновременно с заполнением таблицы. Единственное, что появляется предупреждающее представление, которое запрашивает местоположение пользователей, а затем исчезает так быстро, что его невозможно щелкнуть!
есть ли способ вручную представить это предупреждение при первой загрузке приложения? Я попытался получить местоположение пользователя, когда приложение загружается, чтобы попытаться заставить предупреждение показать, но это не сработало.
10 ответов:
в то время как трудно отследить, решение для этого довольно просто.
через много проб и ошибок я узнал, что в то время как диалоговое окно доступа к местоположению появляется при попытке получить доступ к любым службам определения местоположения в приложении в первый раз, диалоговое окно исчезает само по себе (без какого-либо взаимодействия с пользователем), если
CLLocationManager
объект освобождается до того, как пользователь ответит на диалоговое окно.Я создал
CLLocationManager
экземпляр в моейviewDidLoad
метод. Так как это был местный экземпляр метода, экземпляр был выпущен ARC после завершения выполнения метода. Как только экземпляр был выпущен, диалоговое окно исчезло. Решение было довольно простым. ИзменитеCLLocationManager
экземпляр из переменной уровня метода в переменную экземпляра уровня класса. ТеперьCLLocationManager
экземпляр освобождается только после выгрузки класса.
тот же симптом, другая причина:не называть
startUpdatingLocation
более одного раза подряд.я случайно структурировал вещи таким образом, что код непреднамеренно вызывал
startUpdatingLocation
два раза подряд, что, видимо, плохо. Это также могло иметь какое-то отношение к выбору очереди, так как я ждал, чтобы начать обновление в ожидании результата сетевого запроса, но мне не нужно было делать какую-либо магию GCD, чтобы исправить это...просто нужно было убедиться, что я не повторю начать.надеюсь, кто-то может извлечь выгоду из моей боли. :)
я попадаю в ту же проблему (по крайней мере, по симптомам). В моем случае проблема была в
- (void)applicationWillResignActive:(UIApplication *)application;
метод, где я выпускал мойCLLocationManager
экземпляр в рамках подготовки к предпосылки перехода. Когда я удалил его и оставил только в- (void)applicationDidEnterBackground:(UIApplication *)application;
проблема ушла.
сложная часть заключается в том, что Core Location alert приостанавливает ваше приложение, пока оно все еще находится на переднем плане.
надеюсь, что это поможет вам, мне потребовалось много времени, чтобы нашли этого ублюдка :)
Я знаю, что это очень поздний ответ. Но это может кому-то помочь. Я также столкнулся с той же проблемой и потратил час, чтобы определить проблему. Сначала мой код был таким.
CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; CLLocation *location = locationManager.location; //my stuff with the location [locationManager release];
теперь оповещение о местоположении быстро исчезло. Когда я раскомментирую последнюю строку, она работает правильно.
// [locationManager release];
Я тоже столкнулся с этой проблемой, но решение в моем случае оказалось совершенно иным, чем принятый ответ.
в моем приложении, я звонила
stopUpdatingLocation
сapplicationWillResignActive
. Это была проблема, потому чтоapplicationWillResignActive
вызывается при появлении диалогового окна разрешения. Это было причинойstopUpdatingLocation
сразу послеstartUpdatingLocation
, поэтому диалог сразу исчезнет.решение было просто позвонить
stopUpdatingLocation
с .
это происходило со мной во время использования симулятора iOS. Я определил, что это происходит, потому что моя схема запуска имитировала местоположение. Я думаю, что это имеет тот же эффект, что и вызов
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 } }
вы чаще всего определяете переменную locationManager как глобальный объект.
@interface ViewController : UIViewController { CLLocationManager *locationManager; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; CLLocationManager *locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; }
Я встретил такую же ситуацию у вас.
- мое решение было изменено с локальной переменной на экземпляр члена.
- причина была в том, что местный?экземпляр был недопустим после завершения метода, который включает локальную переменную the (of extend my locationManager)
- Мой Env.: Xcode9.3.1
#import @interface ViewController () @end @implementation ViewController @synthesize locManager; // after - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //MyLocationService *locManager = [[BSNLocationService alloc]init:nil]; // before. the loc. delegate did not work because the instance became invalid after this method. self->locManager= [[MyLocationService alloc]init:nil]; // after locManager.startService; }