2015-04-19 30 views
0

坐标返回零,我已经进入请求AlwaysAuthorization和requestWhenInUseAuthorization在plist文件中,但没有任何反应。 这是我的代码。位置坐标返回零在SWIFT

这段代码怎么回事?我找不到错误在哪里。它只是cordinates

import UIKit 
import CoreLocation 

class ViewController: UIViewController,CLLocationManagerDelegate { 
//Location 
var seenError : Bool = false 
var locationFixAchieved : Bool = false 
var locationStatus : NSString = "Not Started" 
var locationManager: CLLocationManager! 
var userLocation : String! 
var userLatitude : Double! 
var userLongitude : Double! 

//Current weather Outlets "Display Objects" 
@IBOutlet weak var userLocationLabel: UILabel! 
@IBOutlet weak var visibilityLabel: UILabel! 
@IBOutlet weak var temperatureLabel: UILabel! 
@IBOutlet weak var iconView: UIImageView! 
@IBOutlet weak var currentTimeLabel: UILabel! 
@IBOutlet weak var humidityLabel: UILabel! 
@IBOutlet weak var precipitationLabel: UILabel! 
@IBOutlet weak var summaryLabel: UILabel! 
@IBOutlet weak var windSpeedLabel: UILabel! 
@IBOutlet weak var refreshButton: UIButton! 
@IBOutlet weak var refreshActivityIndicator: UIActivityIndicatorView! 


//API KEY 
private let apiKey = "09ca8e3e75fafbadaf4b8594dabe860e" 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from   a nib. 
    refreshActivityIndicator.hidden = true 
    getCurrentWeatherData() 
} 


//Location Code 

func initLocationManager() { 
    seenError = false 
    locationFixAchieved = false 
    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestAlwaysAuthorization() 
    locationManager.startUpdatingLocation() } 

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    locationManager.stopUpdatingLocation() 
    if ((error) != nil) { 
     if (seenError == false) { 
      seenError = true 
      print(error) 
     } 
    } 
} 

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    CLGeocoder().reverseGeocodeLocation(manager.location, completionHandler: {(placemarks, error)->Void in 

     let pm = placemarks[0] as! CLPlacemark 
     self.displayLocationInfo(pm) 
    }) 

    if (locationFixAchieved == false) { 
     locationFixAchieved = true 
     var locationArray = locations as NSArray 
     var locationObj = locationArray.lastObject as! CLLocation 
     var coord = locationObj.coordinate 
     self.userLatitude = coord.latitude 
     self.userLongitude = coord.longitude 

     getCurrentWeatherData() 


    } 
} 


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 : "" 
     //println(locality) 
     //println(postalCode) 
     //println(administrativeArea) 
     //println(country) 

     self.userLocationLabel.text = "\(locality), \(administrativeArea)" 
    } 
} 


func locationManager(manager: CLLocationManager!, 
    didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
     var shouldIAllow = false 

     switch status { 
     case CLAuthorizationStatus.Restricted: 
      locationStatus = "Restricted Access to location" 
     case CLAuthorizationStatus.Denied: 
      locationStatus = "User denied access to location" 
     case CLAuthorizationStatus.NotDetermined: 
      locationStatus = "Status not determined" 
     default: 
      locationStatus = "Allowed to location Access" 
      shouldIAllow = true 
     } 
     NSNotificationCenter.defaultCenter().postNotificationName("LabelHasbeenUpdated", object: nil) 
     if (shouldIAllow == true) { 
      NSLog("Location to Allowed") 
      // Start location services 
      locationManager.startUpdatingLocation() 
     } else { 
      NSLog("Denied access: \(locationStatus)") 
     } 
} 


func getCurrentWeatherData() -> Void { 
    userLocation = "\(userLatitude),\(userLongitude)" 

    // DC cord. = "44.029002,-92.855343" 
    //URL 
    let baseURL = NSURL(string: "https://api.forecast.io/forecast/\(apiKey)/") 
    let forecastURL = NSURL(string:"\(userLocation)", relativeToURL: baseURL) 


    // creates data object; to get and save data from online 
    let sharedSession = NSURLSession.sharedSession() 
    let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(forecastURL!, completionHandler: { (location:NSURL!, response:NSURLResponse!, error: NSError!) -> Void in 

     // if everything goes alright (no errors then run code) 
     if (error == nil) { 

      //turn JSON dictionary to NSDictionary so it's easier to work with 
      let dataObject = NSData(contentsOfURL: location) 
      let weatherDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataObject!, options: nil, error: nil) as! NSDictionary 

      //bring weather dictionary from the CurrentWeather file 
      let currentWeather = Current(weatherDictionary: weatherDictionary) 
      println(weatherDictionary) 

      //update view with current weather information 
      dispatch_sync(dispatch_get_main_queue(), {() -> Void in 
       self.temperatureLabel.text = "\(currentWeather.temperature)" 
       self.iconView.image = currentWeather.icon! 
       self.currentTimeLabel.text = "\(currentWeather.currentTime!)" 
       self.humidityLabel.text = "\(currentWeather.humidity * 100)%" 
       self.precipitationLabel.text = "\(currentWeather.precipProbability * 100)%" 
       self.summaryLabel.text = "\(currentWeather.summary)" 
       self.windSpeedLabel.text = "\(currentWeather.windSpeed) MPH" 
       self.visibilityLabel.text = "\(currentWeather.visibility) Mi" 

       //stop refresh animation 
       self.refreshActivityIndicator.stopAnimating() 
       self.refreshActivityIndicator.hidden = true 
       self.refreshButton.hidden = false 
      }) 
} 

else { 

     let networkIssueController = UIAlertController(title: "Error", message: "Network Connectivity Error! Can't load data", preferredStyle: .Alert) 
    println(error) 
      //information for ok button in alertView 
     let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil) 
     networkIssueController.addAction(okButton) 

      //information for cancel button in alertView 
     let cancelButton = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
     networkIssueController.addAction(cancelButton) 

     //if an error occurs show alert 
     self.presentViewController(networkIssueController, animated: true, completion: nil) 

     dispatch_async(dispatch_get_main_queue(), {() -> Void in 
     //Stop refresh animation 
     self.refreshActivityIndicator.stopAnimating() 
     self.refreshActivityIndicator.hidden = true 
     self.refreshButton.hidden = false 

     }) 

     } 
}) 

    downloadTask.resume() 
} 
//refresh method 
@IBAction func refresh() { 
    getCurrentWeatherData() 
    refreshButton.hidden = true 
    refreshActivityIndicator.hidden = false 
    refreshActivityIndicator.startAnimating() 
} 

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


} 
+0

在viewDidLoad中,代码调用getCurrentWeatherData,但位置管理器未初始化或未启动。在viewDidLoad中,调用initLocationManager而不是getCurrentWeatherData。 – Anna

回答

1

也许你已经处理未显示在代码中的所有这些情况,但这里返回nil的东西,我认为是缺少在代码列表:

  • 我不要以为你在代码中调用initLocationManager
  • getCurrentWeatherData()在您的viewDidLoad()将不起作用,您需要从locationManager(didUpdateLocations)呼叫它。
  • 仅向应用程序选项添加requestAlwaysAuthorizationrequestWhenInUseAuthorization是不够的。您还需要提供NSLocationAlwaysUsageDescription文本,说明您需要访问的原因。
  • 您需要检查授权状态。如果未确定,则需要请求访问并实施回调以等待用户响应。如果您以任何其他状态调用requestAuthorization而不确定,我相信该函数不会执行任何操作,也不会提供任何反馈。
  • 对于进一步的疑难解答,我建议您(1)获得授权的状态,并(2)在locationManager(didUpdateLocations)处输入打印语句或断点,以查看它是否被调用。
+0

上投MirekE – MwcsMac

1

我也在为这一步努力。 MirekE指出了所有的重点。我已经建立在MirekE所陈述的内容上,并展示了一些代码,可能有助于更详细地解释它。
步骤1)确保您的info.plist具有以下内容。不要忘记给他们一个值,例如 - 需要使用您的位置获取当前位置的天气。或类似的规定。
NSLocationAlwaysUsageDescription
隐私 - 位置用法说明
NSLocationWhenInUseUsageDescription

步骤2)我加入这个代码,我的项目和步骤1相结合,那么我会得到警告的意见,使定位服务。

 //this is part of my viewDidLoad() 
     if (ios8()) { 
     locationManager.requestAlwaysAuthorization() 
     locationManager.requestWhenInUseAuthorization() 
    } 
    locationManager.startUpdatingLocation() 

/* 
iOS 8 Utility 
*/ 
func ios8() -> Bool { 
    if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) { 
     return false 
    } else { 
     return true 
    } 
} 

步骤3)I使用默认为它们存储用于另一目的。

// MARK: CLLocationManagerDelegate 
public func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    var location:CLLocation = locations[locations.count-1]as! CLLocation 

    if (location.horizontalAccuracy > 0) { 
     self.locationManager.stopUpdatingLocation() 
     self.defaults.setDouble(location.coordinate.latitude, forKey: "lat") 
     self.defaults.setDouble(location.coordinate.longitude, forKey: "lon") 
     println("lat \(location.coordinate.latitude) lon \(location.coordinate.longitude)") 
     defaults.synchronize() 
     updateLocationInfo() // This is where you would call your getCurrentWeatherData()  

    } 
} 
// MARK: locationManager 
public func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    println(error) 
    self.loading.text = "Can't get your location!" 
}