我正在构建一个基于CoreLocation的应用程序,该应用程序根据纬度,经度,水平精度,海拔高度,垂直精度,行进距离等6个参数向用户显示其位置.
它假设要求用户允许第一次访问位置,但我也尝试重置所有模拟器的设置.
灰色部分将在稍后填充地图.
这就是我的View.Controller.swift的样子:
// Created by 16246 on 6/7/16. // Copyright © 2016 16246. All rights reserved. // import UIKit import CoreLocation class ViewController: UIViewController,CLLocationManagerDelegate { private let LocationManager = CLLocationManager() private var prevIoUsPoint:CLLocation? private var totalMovementDistance:CLLocationDistance = 0 @IBOutlet var latitudeLabel: UILabel! @IBOutlet var longitudeLabel: UILabel! @IBOutlet var horizontalAccuracy: UILabel! @IBOutlet var altitudeLabel: UILabel! @IBOutlet var verticalAccuracyLabel: UILabel! @IBOutlet var distanceTraveledLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() LocationManager.delegate = self LocationManager.desiredAccuracy = kCLLocationAccuracyBest LocationManager.requestAlwaysAuthorization() // Do any additional setup after loading the view,typically from a nib. } func locationManager(manager: CLLocationManager,didChangeAuthorizationStatus status: CLAuthorizationStatus) { print("Authorization Status Changed to \(status.rawValue)") switch status { case .Authorized,.AuthorizedWhenInUse: LocationManager.startUpdatingLocation() default: LocationManager.stopUpdatingLocation() } } func locationManager(manager: CLLocationManager,didFailWithError error: NSError) { let errorType = error.code == CLError.Denied.rawValue ? "Access Denied": "Error \(error.code)" let alertController = UIAlertController(title: "Location Manager Error",message: errorType,preferredStyle: .Alert) let okAction = UIAlertAction(title: "OK",style: .Cancel,handler: {action in}) alertController.addAction(okAction) presentViewController(alertController,animated: true,completion: nil) } func locationManager(manager: CLLocationManager,didUpdateLocations locations: [CLLocation]) { let newLocation = (locations as [CLLocation]) [locations.count-1] let latitudeString = String(format: "%g\u{00B0}",newLocation.coordinate.latitude) latitudeLabel.text = latitudeString let longitudeString = String(format: "%g\u{00B0}",newLocation.coordinate.longitude) longitudeLabel.text = longitudeString let horizontalAccuracyString = String(format: "%g\u{00B0}",newLocation.horizontalAccuracy) horizontalAccuracy.text = horizontalAccuracyString let altitudeString = String(format: "%g\u{00B0}",newLocation.altitude) altitudeLabel.text = altitudeString let verticalAccuracyString = String(format: "%g\u{00B0}",newLocation.verticalAccuracy) verticalAccuracyLabel.text = verticalAccuracyString if newLocation.horizontalAccuracy < 0 { return } if newLocation.horizontalAccuracy > 100 || newLocation.verticalAccuracy > 50 { return } if prevIoUsPoint == nil { totalMovementDistance = 0 } else { totalMovementDistance += newLocation.distanceFromLocation(prevIoUsPoint!) } prevIoUsPoint = newLocation let distanceString = String(format: "%gm",totalMovementDistance) distanceTraveledLabel.text = distanceString } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
这是我的Info.plist文件:
这是我的模拟器:
我想要这样的输出:
自从过去2天以来我一直坚持这一点.品脱啤酒给一个帮我相处的极客.
解决方法
将LocationManager.requestAlwaysAuthorization()移动到viewDidAppear方法.
编辑:
好的,您正在询问requestAlwaysAuthorization,但在info.plist中设置了When in usage …键入条目,因此将requestAlwaysAuthorization更改为requestWhenInUseAuthorization