检索Apple Watch上的位置

我想获得用户的经度和经度,并将其显示在Apple Watch上。

我已经在我的Watchkit扩展中包含了核心位置框架。

当我运行程序时,所有我得到的lat和long都是0.0和0.0

我在iPhone上的一个类中测试了相同的方法并且它工作,并给了我适当的坐标。 我究竟做错了什么?

.h文件:

#import  #import  #import  @interface InterfaceController : WKInterfaceController @end 

.m文件:

 #import "InterfaceController.h" @interface InterfaceController() @end @implementation InterfaceController - (void)awakeWithContext:(id)context { [super awakeWithContext:context]; // Configure interface objects here. } - (void)willActivate { // This method is called when watch view controller is about to be visible to user [super willActivate]; self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { [self.locationManager requestWhenInUseAuthorization]; } [self.locationManager startUpdatingLocation]; } - (void)didDeactivate { // This method is called when watch view controller is no longer visible [super didDeactivate]; } - (IBAction)showLocation { NSString * geoLoc = [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude]; NSLog(geoLoc); } @end 

在Xcode中,您需要使用“ 调试”菜单来模拟预设的位置或使用GPX文件作为位置源。

在您的手表应用扩展程序获得任何位置更新之前,您需要在iPhone应用程序中授权位置更新。 如果您未在iPhone应用程序中授权位置更新,则您的手表扩展程序将不会获得任何位置更新。 此外,我很确定您需要设置权限以始终允许位置更新[CLLocationManager requestAlwaysAuthorization] 。 我不认为如果你使用[CLLocationManager requestWhenInUseAuthorization]它会工作,虽然我不是100%肯定权限。

CLLocationMananager文档中, location属性指出

如果从未检索到位置数据,则此属性的值为nil

这意味着您需要调用[self.locationManager startUpdatingLocation]才能获得有效位置。 但在此之前你需要做的事情才能奏效。


首先,您需要通过调用[self.locationManager requestAlwaysAuthorization]来请求授权。

授权被批准或拒绝时,将调用委托方法locationManager:didChangeAuthorizationStatus:

如果授权状态为kCLAuthorizationStatusAuthorizedAlways ,则可以调用[self.locationManager startUpdatingLocation]

然后,只要更新locationManager:didUpdateLocations:就会调用委托方法locationManager:didUpdateLocations:这样您就可以使用新位置更新UI。

您不应该在WatchKit扩展中请求位置数据。

Apple Watch人机界面指南

“避免使用请求用户权限的技术,例如Core Location。 使用WatchKit扩展程序中的技术可能会在您第一次发出请求时在用户的iPhone上显示意外提示。 更糟糕的是,它可能发生在iPhone在用户口袋中并且不可见的时候。“

我正在使用此代码

  locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) { [locationManager requestAlwaysAuthorization]; [locationManager requestWhenInUseAuthorization]; } [locationManager startUpdatingLocation]; 

并在wkinterfaceMap中显示我使用此代码

  CLLocationCoordinate2D mapLocation = CLLocationCoordinate2DMake([latitude floatValue],[longitude floatValue]); // MKCoordinateSpan coordinateSpan = MKCoordinateSpanMake(1, 1); [self.mapkit addAnnotation:mapLocation withPinColor: WKInterfaceMapPinColorPurple]; [self.mapkit setRegion:(MKCoordinateRegionMake(mapLocation, coordinateSpan))];