位置服务权限警报消失
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()
【讨论】:
以上是关于位置服务权限警报消失的主要内容,如果未能解决你的问题,请参考以下文章
用自定义警报视图替换对话框“打开位置服务以允许应用程序确定您的位置服务”[关闭]