我希望获取位置信息,但我不需要不断更新;有特定的和偶然的用户操作意味着需要获取最新值,因此我想“刷新”位置数据并获得当前值。
我希望在功耗等方面成为设备上最好的公民。我也只需要尽可能低的粒度(3km +)变化。
欢迎您在此澄清。文档在最佳实践中并不是特别清楚。感谢。
答案 0 :(得分:3)
有很多方法可以使用这个类。一个基本的方法是在你的app委托中初始化它,如下所示:
在app delegate中设置一个名为locmgr -
的属性 @property (nonatomic,strong) CLLocationManager *locmgr;
也符合 应用程序委托的接口部分中的CLLocationManagerDelegate
然后在applicationDidFinish中初始化它....
self.locmgr = [[CLLocationManager alloc] init];
self.locmgr.delegate = self;
self.locmgr.distanceFilter = 1500.0f; //only update when location changes this much
self.locmgr.desiredAccuracy = kCLLocationAccuracyThreeKilometers; //change for better accuracy
[self.locmgr setPurpose:@"this app needs location services"];
[self.locmgr startUpdatingLocation];
然后添加委托回调
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"location updated to new location:%@",newLocation);
//put your logic - maybe save it to a property and reference it when needed
}
然后在背景时将其关闭
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[self.locmgr stopUpdatingLocation];
}
我喜欢在app delegate foreground / background中打开和关闭服务。听起来您可能不太经常需要位置服务。也许应用程序委托中的一个方法来启动和停止它。请记住,虽然在开始更新位置服务之后可能需要一两秒钟,但在它具有准确值之前,这就是为什么有时候,最好将它打开并在需要时抓住它。如果正确设置过滤器,则不会产生额外的功耗。
我希望这有助于您在项目中使用它。
答案 1 :(得分:1)
如果您只想在“特定和偶然的用户操作”之后获取信息,则在这些操作发生时开始更新,并在使用startUpdatingLocation和stopUpdatingLocation获得所需数据时停止它们。在关闭监视之前,您应该检查数据的时间戳以确保它是最新的,您还可以查看数据的准确性,以确定是否要在停止之前等待更准确的数据。