iOS - 确保访问位置坐标的正确方法?

时间:2015-11-17 12:50:10

标签: ios swift cllocationmanager location-services

在我的应用程序中,我正在使用webview,我传递了一个包含用户的Lat / Lng的URL。当应用开始时,我startUpdatingLocation并听取CLLocationManager委托方法didUpdateLocations,以使用此方法中提供的坐标初始化网页视图。有一个开关可以确保webview只初始化一次。

问题是这似乎不可靠 - 有时从关闭启动应用程序时,不会触发此方法。这很奇怪,因为大部分时间确实有效。

我注意到如果我在模拟器中更改位置,那么它将触发该方法,但显然这是一种解决方法,而不是解决问题。

这让我觉得这可能是因为位置没有改变,但那我怎么能得到之前的位置坐标呢?

如果它有帮助,我很乐意发布一些代码片段。

非常感谢任何想法 - 谢谢!

要求的附加代码:

初始化位置管理器的功能:

func setupLocationManager() {
        locationManager!.delegate = self
        locationManager!.distanceFilter = kCLDistanceFilterNone
        locationManager!.desiredAccuracy = kCLLocationAccuracyBest
        locationManager!.startUpdatingLocation()
        print("Start updating location...")
}

loadView()中调用:

override func loadView() {
    super.loadView()
    locationManager = CLLocationManager()

    locationManager?.requestWhenInUseAuthorization()
    if CLLocationManager.locationServicesEnabled() {
        setupLocationManager()
    }

//... other code 
}

在我发布代码时,这是didUpdateLocations()方法:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let coords = manager.location?.coordinate
    if !webViewStarted {
        webViewStarted = true
        startWebView(coords!)
    } else {
        updateUserLocation(coords!)
    }
}

didChangeAuthorizationStatus代码:

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    var allow = false
    var message = ""
    switch status {
    case CLAuthorizationStatus.Restricted:
        message = "Restricted Access to location"
    case CLAuthorizationStatus.Denied:
        message = "User denied access to location"
    case CLAuthorizationStatus.NotDetermined:
        message = "Status not determined"
    default:
        print("Allowed to location Access")
        allow = true
    }

    if (allow == true) {
        setupLocationManager()
    } else {
        message = "\(message) \r\n This app requires location services to use"
        let alertView = UIAlertController(title: "Error getting location", message: message, preferredStyle: UIAlertControllerStyle.Alert)
        let cancel = UIAlertAction(title: "Okay", style: .Cancel, handler: nil)
        alertView.addAction(cancel)
        self.presentViewController(alertView, animated: true, completion: nil)
    }
}

0 个答案:

没有答案