【问题标题】:location access permission alert disappears after phone locked手机锁定后位置访问权限警报消失
【发布时间】:2016-10-11 02:41:38
【问题描述】:

我正在使用 CLLocationManager 来监控我的应用中的用户位置。下面列出了产​​生问题的步骤:-

  1. 当我第一次调用 CLLocationmanager 的 requestwheninuseauthorization 方法时,它会显示位置访问权限警报,并且我没有选择允许或不允许按钮。

  2. 现在如果手机由于闲置一段时间或被电话打断而被锁定。

  3. 我解锁手机并查看我的应用程序,该应用程序已经在前台运行并带有位置访问权限对话框,现在解锁手机后,我在我的应用程序的屏幕上找不到位置访问权限警报。它只是消失了,尽管我既没有拒绝也没有接受提供位置访问。

这可能是什么原因以及我该如何解决这个问题,否则可能是一种解决方法,因为这似乎是 iOS 的问题。根据我的要求,用户必须在使用我的应用之前提供位置访问权限。

【问题讨论】:

  • 允许应用使用位置信息只显示一次。在此之后,您必须自己处理授权状态。因此,一旦您的应用程序进入前台,请检查状态。当kCLAuthorizationStatusNotDetermined 时,您可以再次使用requestWhenInUseAuthorization 。您无法访问该位置的任何其他状态都应将用户重定向到设置屏幕。另外,我建议您向 Apple 提交有关对话框消失的错误报告。
  • 除了对话消失的问题,我在使用位置管理器时没有任何困惑。

标签: ios iphone core-location


【解决方案1】:

每当您想访问位置信息时,您都可以使用它来测试用户是否已授予位置访问权限:)

BOOL isAuthorized = [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse;
    BOOL isTurnedOn = [CLLocationManager locationServicesEnabled];
     if (isAuthorized || !isTurnedOn) {
         [self.locationManager startUpdatingLocation];
     }
     else {
         [self.locationManager requestWhenInUseAuthorization];
     }

【讨论】:

  • Sandeep,你还没理解我的问题。除了对话消失的问题,我在使用位置管理器时没有任何困惑。
  • @ios-geek :您的问题指出“否则可能是一种解决方法,因为它似乎是 iOS 的问题”。因此我写了一个答案,因为位置使用授权警报只出现一次,如果用户因为他的设备被锁定而错过了,那么当应用程序进入前台或当你的应用程序尝试访问位置信息时,你应该检查权限是否存在,如果不存在应该再次对他表现出警觉,让他再有机会提供它
  • 但是当 iPhone 解锁时,用户位于我请求位置权限的同一页面上。由于视图控制器现在已经加载,我在任何视图生命周期方法中都没有收到电话解锁的回调,现在我如何在没有事件回调的情况下再次执行 requestWhenInUseAuthorization ?这就是我所说的解决方法。你能在这方面提出一些建议吗?
  • @iOSGeek : 你可以添加 [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector(didBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];到您的 ViewController 这将在您的应用程序变为活动状态时触发您的代码,其中包括解锁设备 :) 您始终可以在方法 didBecomeActive 中检查位置状态
  • 非常感谢!这是我所期待的。
【解决方案2】:

正如 Sandeep 所暗示的,我通过在 viewDidLoad: 方法的 viewcontroller 方法中使用以下代码添加了 UIApplicationDidBecomeActiveNotification 的观察者。

[NSNotificationCenter defaultCenter] addObserver:self 
                                     selector:@selector(didBecomeActive) 
                                     name:UIApplicationDidBecomeActiveNotification 
                                     object:nil];

现在我再次在 viewcontroller 的 didBecomeActive 方法中展示了位置授权对话。

    - (void)didBecomeActive {
// Here put your conditions to check that user hasn't already authorised or rejected the location access permissions.
        [self.locationManager requestWhenInUseAuthorization];
    }

因此,由于上述实现,现在每当用户解锁设备时,授权对话始终存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2015-01-29
    • 2017-07-12
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多