0

我正在寻找位置信息,但我不需要持续更新;有特定且偶尔的用户操作意味着需要获取最新值,因此我想“刷新”位置数据并获取当前值。

在电力使用等方面,我想成为设备上最好的公民。我也只需要尽可能低的粒度(3km+)更改。

  • 根据我的理解,即使我只想要位置的“点样本”,我仍然需要开始一个长期运行的更改监控过程(对于“重大位置更改”或非单元设备的正常情况)。这个对吗?
  • 当我想要当前位置时,假设这个进程正在运行,我可以直接询问位置管理器,对吗?(而不是将最新的传递给委托方法。)
  • 如果是这样,大概,在应用程序后台关闭时关闭它并在前台运行时重新启动是合理的?(我不需要/不想在更改的背景下被唤醒。)
  • 有没有比保持位置管理器运行更不打扰的方式来获取数据?
  • 还有什么我错过的我应该做的吗?

欢迎您在这里澄清。该文档对最佳实践并不是特别清楚。谢谢。

4

2 回答 2

3

有很多方法可以使用这个类。一个基本的方法是在你的应用程序委托中初始化它,如下所示:

设置一个名为 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];
 }

我喜欢在应用程序委托前台/后台打开和关闭服务。听起来您可能不太经常需要位置服务。也许应用程序委托中的一个方法来启动和停止它。请记住,虽然在您开始更新位置服务之后可能需要一两秒钟,但它才能获得准确的值,所以这就是为什么有时最好在需要时打开它并抓住它。如果您正确设置过滤器,则不会导致过多的额外功耗。

我希望这会有所帮助,并且是您可以在项目中使用的东西。

于 2013-03-13T03:13:34.640 回答
1

如果您只对在“特定和偶尔的用户操作”后获取信息感兴趣,那么在这些操作发生时开始更新,并在获得所需数据时使用 startUpdatingLocation 和 stopUpdatingLocation 停止它们。您应该在关闭监控之前检查数据的时间戳以确保它是最新的,您还可以查看数据的准确性,看看您是否想在停止之前等待更准确的数据。

于 2013-03-13T02:57:08.223 回答