ios - 在应用程序启动时在 iOS 模拟器中获取用户坐标

标签 ios objective-c cllocationmanager


有人要求我用 Objective C 为 iOS 编写一个小应用程序,该应用程序应该在一组坐标中选择离用户最近的对象
计划是在应用程序首次加载时仅加载一次用户坐标。
这是我当前的代码:

(void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.headingFilter = 1;
    self.locationManager.delegate = self;
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    [self.locationManager startUpdatingLocation];

    self.userLat = self.locationManager.location.coordinate.latitude;
    self.userLon = self.locationManager.location.coordinate.longitude;
    NSLog(@" ----------------------------- ");
    NSLog(@"User lat : %lf", self.userLat);
    NSLog(@"User lon : %lf", self.userLon);
    NSLog(@" ----------------------------- ");
}

我没有 Apple iOS 开发者程序,所以我只能使用 xCode 的 iOS 模拟器。 我尝试通过调试在 iOS 模拟器中设置一些自定义坐标,如下所示:

当我执行应用程序时(显然是在设置坐标之后),日志中的 userLat 和 userLon 为 0.00..

Apr  6 03:16:20 Locals-Mac.local app[5683]:  ----------------------------- 
Apr  6 03:16:20 Locals-Mac.local app[5683]: User lat : 0.000000
Apr  6 03:16:20 Locals-Mac.local app[5683]: User lon : 0.000000
Apr  6 03:16:20 Locals-Mac.local app[5683]:  ----------------------------- 

我记得在某处听说 iOS 模拟器不能与 CoreLocation 库一起工作(这可能是对的,也可能是错的,我不知道)。
这是纬度/经度值为 0 的原因吗?
如果原因确实是 iOS 模拟器,此代码是否为用户提供当前位置?

提前致谢!

编辑:

有了答案和评论,我现在正在使用 didUpdateLocations 回调函数:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation *location = [locations lastObject];
    self.userLat = location.coordinate.latitude;
    self.userLon = location.coordinate.longitude;

    NSLog(@" ----------------------------- ");
    NSLog(@"User lat : %lf", self.userLat);
    NSLog(@"User lon : %lf", self.userLon);
    NSLog(@" ----------------------------- ");
}

我要求 xCode 使用以下 Scheme 选项模拟我到伦敦的位置:

我的新加载函数:

-(void)viewDidLoad {
    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.headingFilter = 1;
    self.locationManager.delegate = self;

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
        [self.locationManager requestWhenInUseAuthorization];

    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    [self.locationManager startUpdatingLocation];
}

这段代码仍然没有打印放置在位置回调函数中的 NSLog。我错过了什么吗?

最佳答案

当您开始更新时,位置管理器不会立即获得用户的位置。如果您在调用 startUpdatingLocation 后立即检查 location 属性,它通常为 nil 除非其他应用最近更新了它。您需要实现 locationManager:didUpdateLocations: 委托(delegate)方法,一旦它有一个位置就会被调用。

您还需要检查并可能请求位置权限。

关于ios - 在应用程序启动时在 iOS 模拟器中获取用户坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29464192/

相关文章:

Javascript - 带蓝牙键盘的 iPad Tab 键检测

ios - 使用 KeyChain 在 iOS 中存储数百个值的缺点

ios - SWRevealViewController插入对象:atIndex object cannot be nil

ios - CLLocation 在 IOS 中停止

ios - 使用 Geocoder 更新属性以获取用户实际地址,EXC_BAD_ACCESS

ios - 奇怪的 iPad2 位置问题

ios - UIApplication 将在后台运行多长时间

ios - 使用AVFoundation扫描PDF417条码

iphone - 对同一对象多次调用 -retain

objective-c - 发送 POST 后重新加载 UITableView