Kub*_*der 12 core-location mapkit cllocationmanager ios ios8
MKMapView
在Interface Builder中向视图添加组件时,可以使用复选框配置它显示的内容:
当您选中"用户位置"时,它会自动在地图上显示用户的位置.
但是,从iOS 8开始,您应该在显示用户位置之前询问位置许可.如果不这样做,您将在控制台中收到"尝试启动MapKit位置更新而不提示"警告.
所以我已经NSLocationWhenInUseUsageDescription
为plist 添加了一个键,并将此代码添加到viewDidLoad
:
if CLLocationManager.authorizationStatus() == .NotDetermined {
CLLocationManager().requestWhenInUseAuthorization()
}
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用.我确实得到了一个要求许可的弹出窗口,但在我选择一个答案之前,它自己隐藏,地图加载到它下面,我在控制台中收到警告.
我知道showsUserLocation
只有获得许可后我才能在代码中设置属性; 但我的观点是,IB中的这个复选框应该做同样的事情,除了它立即开始跟踪.这是否意味着自iOS 8以来我们根本不应该使用此复选框?还是我错误地使用它?
-
更新:实际上,无论是否设置"显示用户位置",弹出窗口都会自行隐藏.我尝试过viewWillAppear
或者viewDidAppear
做过,但这没有帮助.所以,我不知道究竟在何处,我应该叫requestwhenInUseAuthorization
使用时MKMapView
...
CLLocationManager
方法完成执行后,ARC将释放您的实例.实例一释放,对话框就消失了.解决方案相当简单.将CLLocationManager实例从方法级变量更改为类级实例变量,并将其设置为Strong - 这适用于ObjC :)
对于Swift ......做那样的事情:
class YourViewController: UIViewController,CLLocationManagerDelegate {
...
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Ask for permission for location
locationManager.delegate = self
if(locationManager.respondsToSelector("requestAlwaysAuthorization")) {
locationManager.requestAlwaysAuthorization()
//or
//locationManager.requestWhenInUseAuthorization()
}
...
}
Run Code Online (Sandbox Code Playgroud)
所以...不要使用CLLocationManager().requestWhenInUseAuthorization()
- 而是使用locationManager.requestWhenInUseAuthorization()
- 提前声明的locationManager
归档时间: |
|
查看次数: |
10250 次 |
最近记录: |