当前位置权限对话消失得太快

我的应用程序需要用户的位置,获得坐标,并提供到目的地或来源的距离。 所有这些可能的目的地都以表格的forms显示出来,所以我在填充表格的同时获取用户坐标。 唯一的问题是,要求显示用户位置的警报视图会很快消失,因此无法点击它!

有什么办法来手动提出这个警报时,第一次加载应用程序? 我尝试获取用户的位置,当应用程序加载试图强制警报显示,但没有奏效。

虽然难以追查,但解决方法非常简单。

通过大量的试验和错误,我发现当你第一次尝试访问应用程序中的任何位置服务时,popup位置访问对话框,如果CLLocationManager对象被释放,对话框将自行消失(没有任何用户交互)在用户响应对话之前。

我在我的viewDidLoad方法中创build一个CLLocationManager实例。 由于这是该方法的本地实例,因此该方法完成执行后,该实例由ARC发布。 一旦实例被释放,对话消失。 解决scheme相当简单。 将CLLocationManager实例从方法级variables更改为类级实例variables。 现在CLLocationManager实例只有在类被卸载后才会被释放。

我陷入了同样的问题(至less是症状)。 在我的情况下,问题是在- (void)applicationWillResignActive:(UIApplication *)application; 方法,我正在释放我的CLLocationManager实例作为准备进行背景转换的一部分。 当我删除它,只留在- (void)applicationDidEnterBackground:(UIApplication *)application; 问题没有了。
棘手的部分是,核心位置警报DO暂停您的应用程序,而它仍然在前台。
希望它会帮助你,花了我很多时间来发现那个混蛋:)

我知道这是一个非常晚的答复。 但它可能有助于某人。 我也面临同样的问题,并花了一个小时来确定问题。 起初我的代码是这样的。

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

现在位置警报迅速消失。 当我取消注释最后一行时,它正常工作。

  // [locationManager release]; 

同样的症状,不同的原因: 不要startUpdatingLocation多次调用startUpdatingLocation

我不小心构造了这样的东西,代码无意中在连续两次调用startUpdatingLocation ,这显然是不好的。 它可能也有select的队列,因为我等待开始更新,等待networking请求的结果,但我不需要做任何GCD魔术来解决它…只是需要确保我没有重复开始。

希望有人能从我的痛苦中受益。 🙂

我也遇到了这个问题,但是我的解决scheme与被接受的答案完全不同。

在我的应用程序中,我从applicationWillResignActive调用stopUpdatingLocation 。 这是一个问题,因为在权限对话框出现时调用applicationWillResignActive 。 这是stopUpdatingLocation之后立即导致stopUpdatingLocation ,这就是为什么对话框会立即消失。

该解决scheme只是简单地从applicationDidEnterBackground调用stopUpdatingLocation

这在使用iOS模拟器时发生在我身上。 我确定这是因为我的运行scheme模拟了一个位置。 我认为这与在启动时调用locationManager.startUpdatingLocation()具有相同的效果,因此它正在closures对话框。

在“编辑scheme”对话框中取消选中“允许位置模拟”checkbox可解决问题。 一旦它按照你想要的方式工作,权限被设置,你可以重新启用位置模拟,模拟器将从此工作正常。

Swift 4和iOS 11

确保将隐私线(包括alwayswhenInUse )添加到您的.plist文件,并将CoreLocation框架添加到您的项目

当我更改时,位置权限对话框正确显示:

 locationManager.requestAlwaysAuthorization() 

有:

 locationManager.requestWhenInUseAuthorization() 

PS :我试过所有的build议,都失败(请求授权viewDidLoadvar而不是let locationManager,请不要启动startUpdatingLocation()后请求startUpdatingLocation()我认为这是一个错误,我希望他们会尽快解决尽可能

你大多数定义locationManagervariables为全局对象。

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

SWIFT 4 @Zoli解决scheme将如下所示:

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