位置服务权限警报消失

Posted

技术标签:

【中文标题】位置服务权限警报消失【英文标题】:Location services permission alert disappears 【发布时间】:2018-01-11 02:17:39 【问题描述】:

我正在向 CLLocationManager 请求 requestWhenInUseAuthorization,用户提示会显示,但很快就会消失。

根据 SO 上的其他帖子,它说您必须在类级别声明您的 CLLocationManager var 才能解决此问题。 问题是我已经这样做了,但仍然会发生这种情况。

任何帮助将不胜感激。

class myLocation: CLLocationManagerDelegate 
    var locationManager:CLLocationManager?
    // Have also tried it as: let locationManager = CLLocationManager()

    func start() 
        if CLLocationManager.locationServicesEnabled() 
            self.locationManager = CLLocationManager()

            guard let manager = self.locationManager else 
                print("Error creating Location Manager")
                return
            

            manager.delegate = self
            manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
            manager.requestWhenInUseAuthorization()
        
        else 
            print("Location Services Disabled")
        
    

    //Delegate Methods
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) 
        switch status 
            case .authorizedAlways, .authorizedWhenInUse:
                manager.startUpdatingLocation()

            default:
                manager.requestWhenInUseAuthorization()
        
    

    ...

【问题讨论】:

你是如何创建myLocation 的实例的(它应该被称为MyLocation)?它可能正在被释放,这意味着你的位置经理将被释放。 我展示了我创建上述实例的两种方法。 var 的名称无关紧要,你可以调用你的 vars 任何东西。我同意它可能已发布,问题是我正在做你应该做的事情来保持引用(将 var 放在类级别) 不是 var 的名称,而是类的名称。按照惯例,Swift 中的类以大写字母开头。显然,它仍然可以使用小写字母,但是使用大写字母可以帮助您(和其他人)知道您指的是一个类而不是一个变量。您还没有显示在哪里创建 myLocation 类的实例。您已经展示了如何创建位置管理器,但位置管理器是 myLocation 的属性,因此如果该类在函数中被实例化为局部变量,那么它将在函数退出后立即释放 【参考方案1】:

解决这个问题的关键是我实例化这个类的 var 也是一个本地 var。我将它移到一个类 var 中,它不再消失。

例如:

class ViewController: UIViewController 
    let location = myLocation.init()

    override func viewDidLoad() 
        super.viewDidLoad()

        location.start()
    

【讨论】:

以上是关于位置服务权限警报消失的主要内容,如果未能解决你的问题,请参考以下文章

iOS 在允许位置服务权限后获取位置

位置管理器不会迅速更新位置。警报视图消失

iOS 通知和位置服务权限在启动时显示多次

用自定义警报视图替换对话框“打开位置服务以允许应用程序确定您的位置服务”[关闭]

Xamarin 表单:iPhone 设备中未显示位置权限警报

仅显示一个位置权限警报