检索Apple Watch上的位置

时间:2015-01-22 00:33:50

标签: ios objective-c watchkit apple-watch

我想获得用户的经纬度并将其显示在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

5 个答案:

答案 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))];