位置管理器即使在授予 GPS 权限之前也显示默认位置
Location Manager Displays default location even before GPS permissions are given
这是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
//Setting up the Location Manager.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
//Showing user location on the map as a blue dot.
self.theMap.showsUserLocation = true
//Setting the delegate for the map view.
self.theMap.delegate = self
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
//Getting the last recorded location.
let location = locations.last
let ceter = CLLocationCoordinate2D(latitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)!)
//Setting the region of the map.
let region = MKCoordinateRegion(center: ceter, span: MKCoordinateSpanMake(0.01, 0.01))
//Assigning the region to the map.
self.theMap.setRegion(region, animated: true)
//Stop updating the location.
self.locationManager.stopUpdatingLocation()
}
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
//Getting the center coordinate of the screen.
let thecenter = mapView.centerCoordinate
//Storing latitude & longitude in seperate variables.
let centerLat = thecenter.latitude
let centerlon = thecenter.longitude
//Converting CLLocationCoordinate2D to CLLocation.
let movedMap: CLLocation = CLLocation(latitude: centerLat, longitude: centerlon)
//Performing Reverse GeoCoding to retrieve address from Coordinates.
CLGeocoder().reverseGeocodeLocation(movedMap) { (placemarks, error) -> Void in
//Checking for error.
if(error != nil) {
print(error)
}else{
//Taking the first coordinates among the lot & storing in variable 'p'.
if let p = placemarks?.last {
//Unwrapping Optional Strings.
let roadno = p.subThoroughfare ?? ""
//Checking if subThoroughfare exists.
if(p.subThoroughfare != nil) {
//Unwrapping Optional Strings.
let thoroughfare = p.thoroughfare ?? ""
let subLocality = p.subLocality ?? ""
let locality = p.locality ?? ""
let administrativeArea = p.administrativeArea ?? ""
let postalCode = p.postalCode ?? ""
let country = p.country ?? ""
let address = " \(roadno) \r \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
print(address)
//Assigning the address to the address label on the map.
self.addressLabel.text = " \(roadno) \r \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
}else{
//Unwrapping Optional Strings.
let thoroughfare = p.thoroughfare ?? ""
let subLocality = p.subLocality ?? ""
let locality = p.locality ?? ""
let administrativeArea = p.administrativeArea ?? ""
let postalCode = p.postalCode ?? ""
let country = p.country ?? ""
let address = " \(roadno) \r \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
print(address)
//Assigning the address to the address label on the map.
self.addressLabel.text = " \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
}
}
}
}
}
我确定我的错误是 regionDidChangeAnimated()
函数,但我无法理解为什么它是反向地理编码坐标,即使在授予 GPS 权限之前也是如此。
*已编辑
这是我 运行 项目时偶尔收到的新错误消息。
尝试在不提示位置授权的情况下启动 MapKit 位置更新。必须先调用 -[CLLocationManager requestWhenInUseAuthorization] 或 -[CLLocationManager requestAlwaysAuthorization]。
Here is the screen shot for the error.
我认为您的问题的很大一部分是您开始位置更新并在地图视图中显示当前位置之前确保:
- 设备已启用定位服务
- 您的应用有权使用它们
这就是您收到 MapKit 消息的原因。
确保在 之前 将位置服务与 CLLocationManager.locationServicesEnabled()
和 CLLocationManager.authorizationStatus()
一起使用。
满足这两个要求
作为提醒(我经常忘记这一点),请确保您的 Info.plist 中有相关的使用说明密钥,NSLocationWhenInUseUsageDescription
或 NSLocationAlwaysUsageDescription
.
好吧,我找到了解决我面临的问题的方法。我不知道这是否是正确的解决方案,但这样做会使错误消失并且地图工作正常。
override func viewDidLoad() {
super.viewDidLoad()
let coordinate:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0)
let span = MKCoordinateSpanMake(100, 80)
let region = MKCoordinateRegionMake(coordinate, span)
self.theMap.setRegion(region, animated: true)
//Setting up the Location Manager.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
//Showing user location on the map as a blue dot.
self.theMap.showsUserLocation = true
//Setting the delegate for the map view.
self.theMap.delegate = self
}
所以我在这里所做的基本上是将地图初始化为 0 纬度和 0 经度,并在 viewDidLoad() 中设置区域,然后错误消失了。如果万一这不是正确的解决方案,请告诉我这个问题的确切解决方案是什么。
这是我的代码:
override func viewDidLoad() {
super.viewDidLoad()
//Setting up the Location Manager.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
//Showing user location on the map as a blue dot.
self.theMap.showsUserLocation = true
//Setting the delegate for the map view.
self.theMap.delegate = self
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
//Getting the last recorded location.
let location = locations.last
let ceter = CLLocationCoordinate2D(latitude: (location?.coordinate.latitude)!, longitude: (location?.coordinate.longitude)!)
//Setting the region of the map.
let region = MKCoordinateRegion(center: ceter, span: MKCoordinateSpanMake(0.01, 0.01))
//Assigning the region to the map.
self.theMap.setRegion(region, animated: true)
//Stop updating the location.
self.locationManager.stopUpdatingLocation()
}
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
//Getting the center coordinate of the screen.
let thecenter = mapView.centerCoordinate
//Storing latitude & longitude in seperate variables.
let centerLat = thecenter.latitude
let centerlon = thecenter.longitude
//Converting CLLocationCoordinate2D to CLLocation.
let movedMap: CLLocation = CLLocation(latitude: centerLat, longitude: centerlon)
//Performing Reverse GeoCoding to retrieve address from Coordinates.
CLGeocoder().reverseGeocodeLocation(movedMap) { (placemarks, error) -> Void in
//Checking for error.
if(error != nil) {
print(error)
}else{
//Taking the first coordinates among the lot & storing in variable 'p'.
if let p = placemarks?.last {
//Unwrapping Optional Strings.
let roadno = p.subThoroughfare ?? ""
//Checking if subThoroughfare exists.
if(p.subThoroughfare != nil) {
//Unwrapping Optional Strings.
let thoroughfare = p.thoroughfare ?? ""
let subLocality = p.subLocality ?? ""
let locality = p.locality ?? ""
let administrativeArea = p.administrativeArea ?? ""
let postalCode = p.postalCode ?? ""
let country = p.country ?? ""
let address = " \(roadno) \r \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
print(address)
//Assigning the address to the address label on the map.
self.addressLabel.text = " \(roadno) \r \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
}else{
//Unwrapping Optional Strings.
let thoroughfare = p.thoroughfare ?? ""
let subLocality = p.subLocality ?? ""
let locality = p.locality ?? ""
let administrativeArea = p.administrativeArea ?? ""
let postalCode = p.postalCode ?? ""
let country = p.country ?? ""
let address = " \(roadno) \r \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
print(address)
//Assigning the address to the address label on the map.
self.addressLabel.text = " \(thoroughfare) \r \(subLocality) \r \(locality) \(administrativeArea) \(postalCode) \r \(country)"
}
}
}
}
}
我确定我的错误是 regionDidChangeAnimated()
函数,但我无法理解为什么它是反向地理编码坐标,即使在授予 GPS 权限之前也是如此。
*已编辑
这是我 运行 项目时偶尔收到的新错误消息。
尝试在不提示位置授权的情况下启动 MapKit 位置更新。必须先调用 -[CLLocationManager requestWhenInUseAuthorization] 或 -[CLLocationManager requestAlwaysAuthorization]。
Here is the screen shot for the error.
我认为您的问题的很大一部分是您开始位置更新并在地图视图中显示当前位置之前确保:
- 设备已启用定位服务
- 您的应用有权使用它们
这就是您收到 MapKit 消息的原因。
确保在 之前 将位置服务与 CLLocationManager.locationServicesEnabled()
和 CLLocationManager.authorizationStatus()
一起使用。
作为提醒(我经常忘记这一点),请确保您的 Info.plist 中有相关的使用说明密钥,NSLocationWhenInUseUsageDescription
或 NSLocationAlwaysUsageDescription
.
好吧,我找到了解决我面临的问题的方法。我不知道这是否是正确的解决方案,但这样做会使错误消失并且地图工作正常。
override func viewDidLoad() {
super.viewDidLoad()
let coordinate:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0)
let span = MKCoordinateSpanMake(100, 80)
let region = MKCoordinateRegionMake(coordinate, span)
self.theMap.setRegion(region, animated: true)
//Setting up the Location Manager.
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
//Showing user location on the map as a blue dot.
self.theMap.showsUserLocation = true
//Setting the delegate for the map view.
self.theMap.delegate = self
}
所以我在这里所做的基本上是将地图初始化为 0 纬度和 0 经度,并在 viewDidLoad() 中设置区域,然后错误消失了。如果万一这不是正确的解决方案,请告诉我这个问题的确切解决方案是什么。