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


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

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

10 146

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 и iOS 11:

обязательно добавьте строки конфиденциальности (оба всегда и whenInUse) к

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;
}