在Swift中使用CLLocation Manager获取用户的位置

8 浏览
0 Comments

在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中无法正常工作。

0
0 Comments

问题:使用startUpdatingLocation方法时,iOS 7模拟器没有弹出用户提示,但是当手动启用时,如果使用新的委托方法,它会按预期工作。

原因:使用的委托方法已经在iOS 5或6之后被弃用,所以在Swift的桥接层中不再受支持。

解决方法:将manager的声明移动到类范围内,确保应用在设置中已启用定位功能。如果在设备上使用,只要不尝试使用已弃用的方法,似乎一切正常工作。

0
0 Comments

问题的出现原因是没有在plist文件中添加获取用户位置的权限描述,解决方法是在plist文件中添加以下两行:

  1. NSLocationWhenInUseUsageDescription
  2. NSLocationAlwaysUsageDescription

然后在AppDelegate.swift文件中实现CLLocationManagerDelegate协议,并在didFinishLaunchingWithOptions方法中调用initLocationManager方法来初始化CLLocationManager对象并请求用户位置权限。

在Controller.swift文件中,可以直接调用initLocationManager方法来获取用户位置,只需将该方法写入viewDidLoad方法中即可。但是需要注意的是,该代码只会在用户第一次接受位置权限请求时执行,之后的应用程序运行中将不再调用locationManager.startUpdatingLocation()方法。

0
0 Comments

使用CLLocation Manager获取用户位置的问题的原因是缺少两个步骤。首先,需要使用requestAlwaysAuthorizationrequestWhenInUseAuthorization()来请求权限。因此,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的有效行,这是我的问题所在。

0