iOS应用程序没有请求位置权限

10

我的Swift-iOS应用程序旨在在地图上显示用户的位置。然而,XCode调试控制台告诉我我需要请求权限来显示用户的位置。我认为我已经做到了,但是对话框从未出现。

这是错误消息,下面是我调用CLLocationManager::requestWhenInUseAuthorization()的ViewController:

错误:

2014-06-30 21:25:13.927 RowingTracker2[17642:1608253] 尝试在未经许可的情况下启动MapKit位置更新。必须首先调用-[CLLocationManager requestWhenInUseAuthorization]或-[CLLocationManager requestAlwaysAuthorization]。

ViewController:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate {
    @IBOutlet var mapview: MKMapView = nil
    var locationmgr : CLLocationManager!
                            
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        locationmgr = CLLocationManager()
        locationmgr.requestWhenInUseAuthorization()
        mapview.showsUserLocation = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

如何请求使用位置授权?您可以在这里找到完整的项目。(提交记录

信息

即使让ViewController继承CLLocationManagerDelegate并将代理设置为self(如此处所示),也无法解决问题。

4个回答

26

从iOS 8开始,您需要调用其中一个请求...函数,并在Info.plist文件中添加相应的条目,即NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription

更多信息,请参考此处

更新

确保地图以模拟位置为中心。

  1. 同时确保已经模拟了位置。可以在XCode的Debug Area(如下图)中这样做,也可以在模拟器中的Debug > Location中进行。

Debug Area: Location Simulation in the debug area


你在哪个环境中进行测试? - David Berry
1
在模拟器中,您必须在方案设置或调试窗口底部的工具栏中启用位置模拟。 - David Berry
它已在模拟器中启用(我找不到“方案设置”),但未出现在调试窗口底部。另外,它以我的国家(德国)为中心,一旦我选择了“伦敦”,它就没有自动居中(我知道如何让它这样做)。 - Unapiedra
现在我怀疑不居中可能一直是问题所在。 - Unapiedra
当您在调试菜单中更改位置时,位置似乎不会动态更新。您必须确保在打开地图之前设置它,然后事情应该没问题。在某个方案设置页面上,有一种选择GPS文件用于位置的方法。 - David Berry
显示剩余3条评论

8

你需要使用requestWhenInUseAuthorization,并且还需要在你的app-Info.plist中创建一个名为NSLocationWhenInUseUsageDescription的值


疯狂的是,这似乎对我起作用了。不确定你是如何找到解决方法的,但非常好的发现...我花了几个小时试图弄清楚这个问题! - jengelsma
现在看起来似乎是必须的。我忘记添加这个了,应用程序不会请求位置权限。 - tyegah123

2

我使用NSLocationAlwaysUsageDescription作为请求权限时弹出的文本,例如:

"我想要获得您的24/7监控权限"

我还会加入NSLocationWhenInUseUsageDescription,并将其值设为相关信息。


0
正如 David BerryCayke PrudenteLevi Johnson 所提到的,我只需要在我的 Info.plist 文件中添加 NSLocationAlwaysUsageDescription。为了更好地理解我为什么需要这个,我查阅了更多的文档,并在此分享,因为它可以帮助其他人,就像他们帮助了我一样。

用户提示包含来自您的应用程序的 Info.plist 文件中的 NSLocationWhenInUseUsageDescription 键的文本,并且在调用此方法时需要该键的存在。

https://developer.apple.com/documentation/corelocation/cllocationmanager/1620562-requestwheninuseauthorization


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