CLLocationManager使我的应用程序崩溃,位置已激活

时间:2015-12-25 12:56:06

标签: ios swift crash cllocationmanager

很奇怪。有些设备会崩溃,有些设备则没有。问题是,当位置未激活时,应用程序永远不会死亡,但是当我允许我的应用程序访问某些设备崩溃的位置时,以及其他设备中没有。

这是代码:

longitude = self.locationManager.location!.coordinate.longitude
latitude = self.locationManager.location!.coordinate.latitude

当应用程序崩溃时,错误指向此行:

customers

我已经在10个设备上测试了应用程序,其中有1-2个设备在此时崩溃。

发生了什么?我认为我正确地管理要做什么以及什么时候不允许做位置。

4 个答案:

答案 0 :(得分:4)

你应该知道

self.locationManager.location

使用前为空

答案 1 :(得分:1)

请尝试使用整个代码来获取位置及其详细信息。在Swift 3.0中尝试使用的解决方案

import CoreLocation
import Foundation

class ViewController: UIViewController,CLLocationManagerDelegate {
       let locationManager = CLLocationManager()
    override func viewDidLoad() {
    super.viewDidLoad()
        findMyLocation()

    }


       func findMyLocation(){
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
    }
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in

            if (error != nil) {
                print("Reverse geocoder failed with error" + error!.localizedDescription)
                return
            }

            if placemarks!.count > 0 {
                let pm = placemarks![0] 
                self.displayLocationInfo(pm)
            } else {
                print("Problem with the data received from geocoder")
                }
        })
    }

    func displayLocationInfo(_ placemark: CLPlacemark?) {
        if let containsPlacemark = placemark {
            //stop updating location to save battery life
            locationManager.stopUpdatingLocation()
            let locality = (containsPlacemark.locality != nil) ? containsPlacemark.locality : ""
            let postalCode = (containsPlacemark.postalCode != nil) ? containsPlacemark.postalCode : ""
            let administrativeArea = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea : ""
            let country = (containsPlacemark.country != nil) ? containsPlacemark.country : ""
            print(" Postal Code \(postalCode)")
            print(" administrativeArea \(administrativeArea)")
            print(" country \(country)")
            print(" locality \(locality)")
        }

    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("Error while updating location " + error.localizedDescription)
    }

谢谢

答案 2 :(得分:0)

不要向变量声明可选值。总是处理错误 别打开位置

self.locationManager.location //您的错误

  if var longitude = self.locationManager.location.coordinate.longitude {
       // do your thing
    }else {
   // handle the error by declaring default value
}

第二件事你也可能会收到空值,即使用户在获取位置时丢失了互联网,或者你在模拟器中测试时忘记了模拟位置,所以总是处理错误

答案 3 :(得分:0)

请检查您的didUpdateLocations方法,您只需要检查位置是否正确或是否为零。

if((self.locationManager.location)!= nil){

//在此处获取位置信息。

}