如何计算WatchKit扩展中的当前位置

时间:2015-01-15 09:18:23

标签: ios watchkit apple-watch

如何计算Watch Kit扩展程序中的当前用户位置,因为我们无法在监视工具包中使用CoreLocation

提前致谢

3 个答案:

答案 0 :(得分:10)

您可以在手表应用扩展程序中使用CoreLocation,与在iPhone应用中使用它的方式非常相似。关键区别在于用户无法授权您的扩展程序可以访问Core Location。他们需要从你的iPhone应用程序中做到这一点。因此,您需要检查用户是否拥有针对您的应用的授权位置服务,如果他们没有,则需要指导他们如何操作。

以下是我在监视工具包扩展中使用的代码,用于跟踪当前位置。 (GPWatchAlertView是我用来显示警报消息的自定义控制器。)

#pragma mark - CLLocation Manager 

-(void)startTrackingCurrentLocation:(BOOL)forTrip
{
    if (self.locationManager == nil)
    {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
        self.locationManager.activityType = CLActivityTypeFitness;
        self.locationManager.distanceFilter = 5; //Require 15 meters of movement before we show an update
    }

    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)
    {
        NSLog(@"%@ Start tracking current location", self);

        self.trackingCurrentLocation = YES;
        self.gpsTrackingForTrip = forTrip;

        //We wait until we have a GPS point before we start showing it
        self.showCurrentLocation = NO;
        [self.locationManager startUpdatingLocation];
    }
    else
    {
        [self presentControllerWithName:@"GPWatchAlertView" context:@"Unauthorized GPS Access.  Please open Topo Maps+ on your iPhone and tap on current location."];
    }

}

-(void)stopTrackingCurrentLocation:(id)sender
{
    NSLog(@"%@ Stop tracking current location", self);

    self.trackingCurrentLocation = NO;
    [self.locationManager stopUpdatingLocation];
    self.showCurrentLocation = NO;
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation* loc = [locations lastObject];

   ... 

}

答案 1 :(得分:3)

斯蒂芬的答案应该有效(没有经过测试),只有一个例外。 WatchKit需要"始终"该位置的权限管理。这是因为您的手机在后台模式下实际上正在运行手表扩展程序。所以如果你只是要求"何时使用"许可,您永远不会获得返回到您的观看扩展程序的位置。

尝试更改行:

if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse)

使用:

if (status == kCLAuthorizationStatusAuthorizedAlways)

答案 2 :(得分:1)

你应该在iphone app上获取用户位置而不是扩展名。请检查apple documentation