如何在 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 扩展中计算当前位置的主要内容,如果未能解决你的问题,请参考以下文章
如何在 WatchKit 扩展目标中获取核心数据持久存储路径
如何在 WatchKit 扩展目标(XCode7 beta 6)中重置 watchOS 部署目标