如何在IOS SDK 8.0中获取当前位置的经纬度

Posted

技术标签:

【中文标题】如何在IOS SDK 8.0中获取当前位置的经纬度【英文标题】:How to get current location latitude and longitude in IOS SDK 8.0 【发布时间】:2014-11-26 16:25:26 【问题描述】:

如何获取当前位置的经纬度。

我已经尝试过了。使用 Xcode 6.01 和 ios SDK 8.0

-(CLLocationCoordinate2D) getLocation
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = kCLDistanceFilterNone;
    [locationManager startUpdatingLocation];
    CLLocation *location = [locationManager location];
    CLLocationCoordinate2D coordinate = [location coordinate];
    return coordinate;


- (void)getCurrentLocation    
    CLLocationCoordinate2D coordinate = [self getLocation];
    NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];
    NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];
    NSLog(@"Latitude  = %@", latitude);
    NSLog(@"Longitude = %@", longitude);



- (void)viewDidLoad
    [super viewDidLoad];
    [self getCurrentLocation];


在这里,我将模拟器位置启用为 Deployment 8.0 iPhone 模拟器 4s。 即使在设备上也无法正常工作。

@所有 请告诉我,我在这里做错了什么。

【问题讨论】:

【参考方案1】:

我在 IOS 8.0 中发现了问题

NSLocationAlwaysUsageDescription将此手动添加到应用程序 plist 文件中,将字符串值留空。 这将调用委托方法。永远不要忘记添加 NSLocationAlwaysUsageDescription ,除非您没有添加此委托方法将不起作用。其余代码相同。向控制器类添加委托方法。

在locationManager声明代码中加入这行代码。 IOS 8.0 [locationManager requestAlwaysAuthorization];

【讨论】:

【参考方案2】:

在 iOS 8 中,此代码会静默失败,即您不会收到任何错误或警告。

你需要做两件额外的事情才能让定位工作:

    向您的 Info.plist 添加密钥 请求授权,要求位置管理器开始。

以下任何一个或两个键都需要添加到 Info.plist 文件中。

    NSLocationWhenInUseUsageDescription NSLocationAlwaysUsageDescription

这些是字符串类型,值可以是任何消息描述或空。

现在您需要为相应的定位方法请求授权。使用以下任一调用:

    [self.locationManager requestWhenInUseAuthorization] [self.locationManager requestAlwaysAuthorization]

【讨论】:

【参考方案3】:

是的,模拟器提供了过于简化的定位服务。物理设备是真正测试CLLocationManager 行为的唯一方法。

问题是当您调用startUpdatingLocation 时,并不意味着您可以立即检索到location。 (我想你会发现它要么是nil,要么是否定的horizontalAccuracy,这意味着位置尚未确定。)

你必须符合CLLocationManagerDelegate,并实现locationManager:didUpdateLocations:,这是异步调用的。因此,在尝试使用位置信息之前,您必须等待调用此方法。并且,请注意,在真实设备上,您可能会看到此方法被调用多次,因为设备会不断改进设备位置信息,并提高准确性(例如,您可能会看到horizontalAccuracy 数字从一个位置更新到另一个位置下降)。


显然,您可能也想实现locationManager:didFailWithError:,以便可以检测到问题。在调用startUpdatingLocation 之前,您可能还应该检查authorizationStatuslocationServicesEnabled 并调用requestWhenInUseAuthorization

【讨论】:

【参考方案4】:

看来我们需要做更多的工作来在 ios8 中实现定位服务。 follow this discussion

【讨论】:

添加了委托方法 didFailWithError 和 didUpdateToLocation 但这些方法根本没有触发 请在您的 .h 文件中添加 CLLocationManagerDelegate,如下所示 @interface DemoViewController : UIViewController 我添加了 CLLocationManagerDelegate,但我仍然有问题。将 sdk IOS 7 升级到 IOS 8 后出现问题。

以上是关于如何在IOS SDK 8.0中获取当前位置的经纬度的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 到 iOS 8 中当前位置纬度和经度的不同行为

iOS小技能:封装定位SDK,统一数据模型和错误处理。

Net微信网页开发之使用微信JS-SDK获取当前地理位置

iOS SDK中当前位置的方位

如何在微信小程序虚拟定位

如何获取android移动设备的当前位置经纬度?