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

Posted

技术标签:

【中文标题】如何在 WatchKit 扩展中计算当前位置【英文标题】:How to calculate current location in WatchKit extension 【发布时间】:2015-01-15 09:18:22 【问题描述】:

如何在 Watch Kit 扩展中计算当前用户位置,因为我们不能在 watch kit 中使用CoreLocation

提前致谢

【问题讨论】:

检查这个答案:***.com/a/27420560/3202193 您可以从这里获取示例以获取当前用户位置:dev.iachieved.it/iachievedit/… 根据您的问题,我敢说您误解了扩展程序在 iphone 中运行 【参考方案1】:

您可以在手表应用扩展程序中使用 CoreLocation,与在 iPhone 应用程序中使用它的方式非常相似。主要区别在于用户无法授权您的扩展程序访问核心位置。他们需要从您的 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];

   ... 


【讨论】:

我们如何测试?如果此代码正确与否。因为Apple Watch都不可用,我们也不能为Apple Watch模拟器设置位置 在模拟器中可以使用Debug->Location来模拟位置。请参阅***.com/questions/28079454/… 了解更多信息。 AFAIK 仅适用于手机模拟器。它也适用于手表模拟器吗? 是的,它也适用于手表扩展。手表上没有GPS,只是在手机上。您的手表扩展程序设置为获取 GPS 事件,因此实际上是手机接收事件,而不是手表。 @StephenJohnson 我已经使用了你的代码,但我仍然没有在 iWatch 中获得位置【参考方案2】:

Stephan 的答案应该有效(尚未测试),只有一个例外。 WatchKit 需要位置管理的“始终”权限。这是因为您的手机确实在后台模式下运行手表扩展程序。因此,如果您只要求“使用时”权限,您将永远不会将位置返回到您的手表扩展程序。

换行试试:

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

与:

if (status == kCLAuthorizationStatusAuthorizedAlways)

【讨论】:

【参考方案3】:

您应该在 iPhone 应用程序上获取用户位置,而不是在扩展程序中。请查看苹果documentation。

【讨论】:

以上是关于如何在 WatchKit 扩展中计算当前位置的主要内容,如果未能解决你的问题,请参考以下文章

在 Apple WatchKit 中使用核心位置

如何在 WatchKit 扩展目标中获取核心数据持久存储路径

如何在 WatchKit 扩展目标(XCode7 beta 6)中重置 watchOS 部署目标

在主要目标中包含 pod,而不是在 WatchKit 扩展中

无法理解 watchkit 扩展崩溃

如何使 watchkit 扩展应用程序和我的 iphone 应用程序共享相同的 icloud 数据库