我正在测试CoreLocation以了解如何捕获和记录用户的位置。我构建了一个简单的Master-Detail应用程序,它在详细信息窗格中显示了用户的实时位置。一切都按预期工作。
接下来,我开始制作我的真正应用程序,它也使用CoreLocation。我使用Master-Detail样式构建了应用程序,并且当用户打开详细信息窗格时,它应该显示它们当前的实时位置。但是,一切都没有发生。
我经过大量的调试和研究后确定,我的locationManager
创建后,我致电locationManager.startUpdatingLocation()
授权获取,该地点已更改为denied
(或假,或其他任何称为)。我可以获得实时跟踪的唯一方法是在Xcode中构建并运行应用程序,一旦它在模拟器中打开,打开位置服务并更改应用程序设置以允许位置跟踪到#34;始终"。然后我可以在控制台中看到正在获取位置。
我不明白为什么我必须继续将授权更改为" Always"一遍又一遍。我已经在模拟器上删除了应用程序,完成了#34; clean"从XCode开始新鲜,仍然在未经授权的情况下在模拟器上启动。
有人有想法吗?
更新现在我看到,当我构建并在模拟器中运行时,我获得了一个位置,然后授权被更改为不允许位置服务。
这是我的代码(适用于其他应用):
import UIKit
import CoreLocation
class DetailViewController: UIViewController, CLLocationManagerDelegate {
var locationManager : CLLocationManager!
func startTrackingLocation() {
println("tracking engaged")
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization() // <-- this was originally commented out
locationManager.startUpdatingLocation()
println("and we're tracking")
println(locationManager.location)
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
println("location acquired") // <--- Only see this when I manually allow location when app is running
self.newLongLabel?.text = "\(locations[0].coordinate.longitude)"
self.newLatLabel?.text = "\(locations[0].coordinate.latitude)"
}
override func viewDidLoad() {
super.viewDidLoad()
self.startTrackingLocation()
self.configureView()
}
// more class stuff...
答案 0 :(得分:0)
如果您确定已将密钥添加到plist文件,请尝试在didChangeAuthorizationStatus:location manager委托方法中检查它。
确保plist中的两个键都是类型字符串,并且您希望向用户显示值:
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways){
if ([CLLocationManager locationServicesEnabled]) {
[yourLocationManager startMonitoringSignificantLocationChanges];
//run your code here
}
}
}