如何在iOS8中使用MKMapView的"显示用户位置"?

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...

Ton*_*enu 9

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