如何在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
之前,您可能还应该检查authorizationStatus
、locationServicesEnabled
并调用requestWhenInUseAuthorization
。
【讨论】:
【参考方案4】:看来我们需要做更多的工作来在 ios8 中实现定位服务。 follow this discussion
【讨论】:
添加了委托方法 didFailWithError 和 didUpdateToLocation 但这些方法根本没有触发 请在您的 .h 文件中添加 CLLocationManagerDelegate,如下所示 @interface DemoViewController : UIViewController以上是关于如何在IOS SDK 8.0中获取当前位置的经纬度的主要内容,如果未能解决你的问题,请参考以下文章