iOS 8和Swift中的MapKit

Phi*_*hil 7 mapkit ios swift ios8

我正在尝试在iOS 8上使用MapKit并且我不断收到错误:

Trying to start MapKit location updates without prompting for location authorization. Must call   
-[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager 
requestAlwaysAuthorization] first. 
Run Code Online (Sandbox Code Playgroud)

在这里查找,我发现我必须NSLocationWhenInUsageDescription在我的plist中实现并且也调用locationManager.requestWhenInUseAuthorization()但没有任何反应,我仍然在控制台中得到错误.我究竟做错了什么?

小智 10

在我的应用程序委托中,我为类外的locationManager创建了一个可选的var,然后进行设置

locManager = CLLocationManager()
locManager!.requestWhenInUseAuthorization()
Run Code Online (Sandbox Code Playgroud)

如果您正确更改它,则会导致使用NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription弹出警报视图.

然后在视图控制器文件中,我在类外部创建了另一个var来保存本地CLLocationManager.我接着说

if locManager {
        locMan = locManager!
        locMan!.delegate = self
    }
Run Code Online (Sandbox Code Playgroud)

然后您可以使用委托方法

func locationManager(_manager: CLLocationManager!,didChangeAuthorizationStatus status: CLAuthorizationStatus)
Run Code Online (Sandbox Code Playgroud)

当授权状态改变时调用它,当用户响应弹出时它会执行.在此内部,您可以使用这段代码将用户位置放在地图上

if status == CLAuthorizationStatus.AuthorizedWhenInUse {
        map.showsUserLocation = true
    }
Run Code Online (Sandbox Code Playgroud)

仅当您在使用时获得授权时,才会将用户位置添加到地图中.


小智 9

我也被那个人困扰,直到我意识到info.plist钥匙已经改变.如果您有NSLocationUsageDescription,则需要更改为?NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription(至少设置一个YES),现在在iOS8中必须更改.

然后,Robert的代码可以正常工作(感谢分享).


Jon*_*own 7

它是NSLocationWhenInUseUsageDescription,而不是NSLocationWhenInUsageDescription.网上的大多数地方都有错误的密钥