iOS 8和Swift中的MapKit

7

我正在尝试在iOS 8上使用MapKit,但是一直出现错误:

Trying to start MapKit location updates without prompting for location authorization. Must call   
-[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager 
requestAlwaysAuthorization] first. 

在这里查找,我发现我需要在我的plist中实现NSLocationWhenInUsageDescription并调用locationManager.requestWhenInUseAuthorization()。但是什么也没有发生,我仍然在控制台中得到那个错误。我做错了什么?

1
NSLocationWhenInUsageDescription 是错误的键。请使用 NSLocationWhenInUseUsageDescription - Klaas
3个回答

10
在我的应用程序委托中,我在类的外部创建了一个可选的变量,用于定位管理器(locationManager),然后进行了设置。
locManager = CLLocationManager()
locManager!.requestWhenInUseAuthorization()

如果你适当更改了NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription,这将导致警报视图弹出。

然后在视图控制器文件中,我又创建了一个类外部的变量来保存本地CLLocationManager。接着我进行了设置。

if locManager {
        locMan = locManager!
        locMan!.delegate = self
    }

然后您可以使用委托方法

func locationManager(_manager: CLLocationManager!,didChangeAuthorizationStatus status: CLAuthorizationStatus)

当授权状态发生变化时,会调用此函数,而用户响应弹出窗口后授权状态就会发生变化。在此函数内,您可以使用以下代码将用户位置放置在地图上:

if status == CLAuthorizationStatus.AuthorizedWhenInUse {
        map.showsUserLocation = true
    }

仅在获得前台定位授权时,将用户的位置添加到地图中。


那样做消除了错误,但仍然没有请求权限或显示用户的位置。 - Phil
我认为它只在您第一次打开应用程序时提示您,因此您必须从模拟器或设备中删除,或进入设置并允许位置。 - Robert Mcc
那没起作用,应用程序甚至在位置设置下也没有显示出来。 - Phil
我遇到了这个问题,现在弹出窗口已经出现。但问题是,弹出窗口在1/2秒后消失了。它不接受任何用户输入。你能帮我吗?我正在使用objective c。 - Rabby Alam
关键信息是方法焦点外的变量。当我创建一个属性时,弹出框会显示出来。当locationManager被创建为函数内的局部变量时,当弹出框准备显示时它可能已经被释放了。 - auco
显示剩余6条评论

9

我也曾困扰于此,直到意识到info.plist的关键字已经改变。如果你在使用NSLocationUsageDescription,则需要更改为NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription(至少将一个设置为YES),这在iOS8中现在是强制性的。

然后,Robert的代码按照它应该的方式工作(感谢分享)。


1
请注意:这些键不是YES/NO。你应该放置一些文本,解释为什么需要位置信息,以便用户能够看到(例如:“该应用程序会查找您附近的兴趣点。”)。因此,放置“YES”可以工作,但是只要为键设置了某个值,“NO”或“42”也可以工作。 - user467105

7

正确的键名是NSLocationWhenInUseUsageDescription,而不是NSLocationWhenInUsageDescription。很多网站上都写错了。


1
感谢上帝!花了一整天的时间试图弄清楚为什么什么都不起作用,实际上看起来很多帖子都错了。谢谢! - TommyG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接