我的基于 CoreLocation 的 Swift 应用未请求用户访问位置的许可
My CoreLocation based Swift app is not asking user's permission to access location
我正在构建一个基于 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 天以来,我一直被困在这个问题上。 Pint 啤酒给一个帮助我相处的极客。
将 LocationManager.requestAlwaysAuthorization()
移动到 viewDidAppear
方法。
编辑:
好的,你问的是 requestAlwaysAuthorization
但在 info.plist 中你设置了 When in usage...
键条目,所以将 requestAlwaysAuthorization
更改为 requestWhenInUseAuthorization
我正在构建一个基于 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 天以来,我一直被困在这个问题上。 Pint 啤酒给一个帮助我相处的极客。
将 LocationManager.requestAlwaysAuthorization()
移动到 viewDidAppear
方法。
编辑:
好的,你问的是 requestAlwaysAuthorization
但在 info.plist 中你设置了 When in usage...
键条目,所以将 requestAlwaysAuthorization
更改为 requestWhenInUseAuthorization