【发布时间】: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的属性,因此如果该类在函数中被实例化为局部变量,那么它将在函数退出后立即释放
标签: ios cllocationmanager