在Swift中使用CLLocation Manager获取用户的位置
在Swift中使用CLLocation Manager获取用户的位置
我正在尝试将一个旧的ObjC应用转换成Swift作为练习,并且遇到了一些问题。在旧应用中,我会先建立CLLocation Manager,然后使用以下代码:\nmanager = CLLocationManager()\nmanager.delegate = self\nmanager.desiredAccuracy = kCLLocationAccuracyBest\nmanager.startUpdatingLocation()\n
\n这样会自动调用以下方法:\nfunc locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {\n}\n
\n然后我可以从这里提取所需的所有信息。但是在Swift中,没有自动补全该方法,我无法弄清楚如何重现它。文档中表示,委托仍会调用`startUpdatingLocation()`,但实际上没有发生。以下是我目前的代码:\nimport UIKit\nimport CoreLocation\nclass ViewController: UIViewController, CLLocationManagerDelegate {\n @IBOutlet var gpsResult: UILabel!\n var manager: CLLocationManager!\n override func viewDidLoad() {\n super.viewDidLoad()\n manager = CLLocationManager()\n manager.delegate = self\n manager.desiredAccuracy = kCLLocationAccuracyBest\n manager.startUpdatingLocation()\n }\n func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {\n print(\"locations = \\(locations)\")\n gpsResult.text = \"success\"\n }\n}\n
\n如果有任何帮助或指导,请告诉我。谢谢。\n编辑:根据建议进行了更新,但仍然无法正常工作。\n编辑2:似乎有一些错误导致该方法在ViewController中无法正常工作。
问题的出现原因是没有在plist文件中添加获取用户位置的权限描述,解决方法是在plist文件中添加以下两行:
- NSLocationWhenInUseUsageDescription
- NSLocationAlwaysUsageDescription
然后在AppDelegate.swift文件中实现CLLocationManagerDelegate协议,并在didFinishLaunchingWithOptions方法中调用initLocationManager方法来初始化CLLocationManager对象并请求用户位置权限。
在Controller.swift文件中,可以直接调用initLocationManager方法来获取用户位置,只需将该方法写入viewDidLoad方法中即可。但是需要注意的是,该代码只会在用户第一次接受位置权限请求时执行,之后的应用程序运行中将不再调用locationManager.startUpdatingLocation()方法。
使用CLLocation Manager获取用户位置的问题的原因是缺少两个步骤。首先,需要使用requestAlwaysAuthorization
或requestWhenInUseAuthorization()
来请求权限。因此,viewDidLoad()
应该像这样:
var locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
其次,根据Info.plist
的要求进行编辑。可以在这里找到相关信息。
确保在info.plist中有iOS 8的有效行,这是我的问题所在。