我想获得用户的经纬度并将其显示在Apple Watch上。
我已经在我的Watchkit扩展中包含了核心位置框架。
当我运行程序时,我得到的是lat,long是0.0和0.0
我在iPhone上的一个类中测试了相同的方法并且它工作了,并给了我适当的坐标。我究竟做错了什么?
.h文件:
#import <WatchKit/WatchKit.h>
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@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
答案 0 :(得分:3)
在您的手表应用扩展程序获得任何位置更新之前,您需要在iPhone应用程序中授权位置更新。如果您的iPhone应用尚未获得授权位置更新,那么您的手表扩展程序将不会获得任何位置更新。此外,我非常确定您需要将权限设置为始终允许位置更新[CLLocationManager requestAlwaysAuthorization]
。如果您使用[CLLocationManager requestWhenInUseAuthorization]
,我认为它不会起作用,但我对这些权限并不是100%肯定。
答案 1 :(得分:1)
在Xcode中,您需要使用调试菜单来模拟预先设置的位置或使用GPX文件作为位置源。
答案 2 :(得分:1)
在CLLocationMananager
文档中,location
属性状态
如果从未检索到任何位置数据,则此属性的值为
nil
。
这意味着您需要致电[self.locationManager startUpdatingLocation]
才能获得有效的位置信息。但是,在此之前你需要做的事情可以发挥作用。
首先,您需要致电[self.locationManager requestAlwaysAuthorization]
来请求授权。
授权被批准或拒绝后,将调用委托方法locationManager:didChangeAuthorizationStatus:
。
如果授权状态为kCLAuthorizationStatusAuthorizedAlways
,则可以拨打[self.locationManager startUpdatingLocation]
。
然后在任何时候更新位置,委托方法
将调用locationManager:didUpdateLocations:
,以便您可以使用新位置更新UI。
答案 3 :(得分:1)
您不应在WatchKit扩展程序中请求位置数据。
来自 Apple Watch人机界面指南:
“避免使用请求用户权限的技术,例如Core 地点。使用WatchKit扩展程序中的技术可以 首先在用户的iPhone上显示意外提示 你提出要求的时间。更糟糕的是,它可能发生在 iPhone位于用户的口袋中,不可见。“
答案 4 :(得分:0)
我正在使用此代码
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))];