位置管理器没有在 swift ios10 中更新

Posted

技术标签:

【中文标题】位置管理器没有在 swift ios10 中更新【英文标题】:location manager not updating in swift ios10 【发布时间】:2016-10-25 05:59:55 【问题描述】:

我是 swift 新手,正在尝试获得一个显示经度和纬度的基本程序。

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate 

@IBOutlet weak var latLabel: UILabel!
@IBOutlet weak var longLabel: UILabel!
@IBOutlet weak var addLabel: UILabel!
var lm = CLLocationManager()

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    lm = CLLocationManager()


@IBAction func getCurrentLocation(_ sender: AnyObject) 
    lm.delegate = self
    lm.desiredAccuracy = kCLLocationAccuracyBest
    lm.startUpdatingLocation()
    print("loc")



func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) 
    print ("error")


func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    print ("location")
    let length = locations.count
    let curLoc = locations[length-0]
    latLabel.text =  String(curLoc.coordinate.latitude)
    print ("loccation")


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




【问题讨论】:

【参考方案1】:

你错过了两件事。

    您必须使用 requestAlwaysAuthorizationrequestWhenInUseAuthorization() 请求许可。

因此,当您在 viewdidlod 中分配位置管理器时,请这样做

locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
    您需要按照@Anbu.Karthik 在他的回答中的建议添加信息。

NSLocationAlwaysUsageDescription 用于想要使用 即使应用未打开且未使用,设备的位置也是如此。

NSLocationWhenInUseUsageDescription 用于想要使用 仅当应用打开和使用时设备的位置。

【讨论】:

【参考方案2】:

检查一次您是否在您的 plist 中添加了以下信息

Location :
Key      :  Privacy - Location Always Usage Description   
Value  :  $(PRODUCT_NAME) location use

Key       :  Privacy - Location When In Use Usage Description   
Value   :  $(PRODUCT_NAME) location use

欲了解更多信息,请参阅this

【讨论】:

【参考方案3】:

我发现的另一个问题导致不调用位置更新回调,没有给出明显的错误消息是它不能是私有函数(当然,一旦你最终注意到它就很明显......) .我意识到 OP 不是,但如果您遇到问题,这是一个常见的地方,所以它可能会帮助某人。

因此,如果不给出任何明显的错误指示,如应用程序崩溃等,以下将导致函数无法被调用:

private func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    print ("location")
    let length = locations.count
    let curLoc = locations[length-0]
    latLabel.text =  String(curLoc.coordinate.latitude)
    print ("loccation")

删除 'private' 关键字,就像在 OP 的代码中一样,将允许调用它。

【讨论】:

以上是关于位置管理器没有在 swift ios10 中更新的主要内容,如果未能解决你的问题,请参考以下文章

位置管理器不更新位置ios7

iOS支持Swift包管理器吗?[已关闭]

更新控制器中的位置,而位置管理器在其他控制器中初始化

如何在位置管理器功能swift 3中使用用户位置

斯威夫特位置管理器

在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]