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


175

我的应用程序获取用户的位置,获取坐标,并提供往返于其目的地或起点的距离。所有这些可能的目标都显示在表格视图中,因此我在填充表格的同时获取了用户的坐标。唯一的事情是,询问用户位置的警报视图出现然后消失得如此之快,以至于无法单击它!

有什么方法可以在应用首次加载时手动显示此警报?我尝试在应用程序加载时获取用户的位置,以尝试强制显示警报,但这没有用。

Answers:


698

尽管很难找到答案,但是解决方案非常简单。

经过多次尝试和错误,我发现,当您首次尝试访问应用中的任何位置服务时,会弹出位置访问对话框,但如果该CLLocationManager对象之前已释放,则该对话框会自行消失(无需任何用户交互)用户响应对话框。

我正在CLLocationManager用我的viewDidLoad方法创建一个实例。由于这是该方法的本地实例,因此该方法在执行完成后由ARC释放。实例释放后,对话框就消失了。解决方案非常简单。将CLLocationManager实例从方法级变量更改为类级实例变量。现在,CLLocationManager仅在卸载类后才释放实例。


117
希望我能给您+100
编码员

1
只是使用Xamarin.iOS遇到了同样的问题。使CLLocationManager类的作用域和对话框保持可见。
Krumelur 2014年

1
Yaaaaa ....如果您可以继续前进并给自己加薪,那将是greeeeeaaaat。(严重的是,这对我来说也是一个很大的节省)
Garfonzo 2014年

2
我也必须参加这个聚会。在这里,从我这里获得互联网高五!
Matthieu Riegler,2015年

3
在Swift中遇到此问题的任何人都请确保将LocationManager的声明移到viewDidLoad之外。干杯!
KD。

5

相同的症状,不同的原因:不要startUpdatingLocation连续多次打电话

我意外地构造了一些东西,使得代码无意中startUpdatingLocation连续调用了两次,这显然很糟糕。自从我等待开始更新以等待网络请求的结果以来,它还可能与队列的选择有关,但是我不需要做任何GCD魔术来解决它...只是需要确保我没有重复开始。

希望有人能够从我的痛苦中受益。:)


5

我也遇到过类似的情况。调试后我发现

let locationManager = CLLocationManager()

在方法范围内被调用,但应全局调用。

为什么?

简而言之,该方法返回后已释放locationManager。但是在用户给予或拒绝许可之前,不应释放它


4

我陷入了同样的问题(至少是症状)。就我而言,问题出在- (void)applicationWillResignActive:(UIApplication *)application;方法中,在该方法中,我释放CLLocationManager实例作为准备进行后台转换的一部分。当我将其删除并仅留- (void)applicationDidEnterBackground:(UIApplication *)application;在问题中时,它就消失了。
棘手的是,核心位置警报在您的应用程序仍然处于前台时会挂起它。
希望它能对您有所帮助,花了我很多时间才发现那个混蛋:)


4

我知道这是一个很晚的答复。但这可能会帮助某人。我也遇到了同样的问题,花了一个小时来确定问题。起初我的代码是这样的。

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

CLLocation *location = locationManager.location;
//my stuff with the location

    [locationManager release];

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

   // [locationManager release];

3
这是真的。我唯一需要说明的是,当您的项目启用了ARC时,无需在代码中包含release语句,并且仍然会遇到此问题。解决这种情况下的问题的唯一方法是将变量设置为类级别而不是方法级别。
佐利2012年

3

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

在我的应用中,我是stopUpdatingLocation从打来的applicationWillResignActive。这是一个问题,因为applicationWillResignActive权限对话框出现时会被调用。这是stopUpdatingLocation在之后立即引起的startUpdatingLocation,这就是对话框立即消失的原因。

解决的方法就是直接打电话stopUpdatingLocationapplicationDidEnterBackground


2

这是我在使用iOS Simulator时发生的。我确定是因为我的运行方案正在模拟位置。我认为这与locationManager.startUpdatingLocation()在启动时调用具有相同的效果,因此它正在关闭对话框。

取消选中“编辑方案”对话框中的“允许位置模拟”复选框,可以解决此问题。一旦它按预期工作并设置了权限,就可以重新启用位置模拟,然后模拟器将正常运行。


这对我有用。我至少看到了对话框
CppChase

2

Swift 4和iOS 11

确保在文件中添加了隐私行(始终whenInUse.plist,并将CoreLocationFramework 添加到项目中

更改后,位置权限对话框将正确显示:

locationManager.requestAlwaysAuthorization()

与:

locationManager.requestWhenInUseAuthorization()

PS。:我尝试了所有建议,但都失败了(请求授权到viewDidLoadvar而不是letlocationManager,请不要startUpdatingLocation()在请求后启动。。我认为这是一个错误,希望他们尽快解决。


我也遵循了所有建议,但是我总是遇到同样的问题。位置权限对话框会短暂出现,然后立即消失。然后出现我的通知对话框权限(这是正常的),当我按接受或拒绝时,出现另一个位置许可(这次它保持不变,让我接受或拒绝)。

@BitoQ是的,对我也是。同样的情况,但至少我们可以看到这个对话框,我与未来的iOS希望他们11.1纠正将这个错误..
亚历山德罗Ornano

1

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

0

您最多将locationManager变量定义为全局对象。

@interface ViewController : UIViewController
{
    CLLocationManager *locationManager;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    [locationManager startUpdatingLocation];
}

0

我遇到了你的同样情况。

  • 我的解决方案从局部变量更改为成员实例。
  • 原因是方法完成后,local?instance无效,其中包括局部变量(扩展我的locationManager)
  • 我的环境:Xcode9.3.1
#进口 
@interface ViewController()

@结束

@implementation ViewController
@synthesize locManager; //之后
-(void)viewDidLoad {
    [super viewDidLoad];
    //加载视图后,通常从笔尖进行其他任何设置。

    // MyLocationService * locManager = [[BSNLocationService alloc] init:nil]; //之前。地方。委托不起作用,因为使用此方法后实例变得无效。
    self-> locManager = [[MyLocationService alloc] init:nil]; //之后
    locManager.startService;
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.