Iphone 最小开销的核心位置设计最佳实践?
我希望抓取位置信息,但我不需要不断更新;有一些特定的、偶尔的用户操作意味着需要获取最新的值,因此我希望“刷新”位置数据并获取当前值 我希望在电源使用等方面成为设备上最好的公民。我也只需要尽可能低的粒度(3km+)更改Iphone 最小开销的核心位置设计最佳实践?,iphone,ios,core-location,cllocationmanager,Iphone,Ios,Core Location,Cllocationmanager,我希望抓取位置信息,但我不需要不断更新;有一些特定的、偶尔的用户操作意味着需要获取最新的值,因此我希望“刷新”位置数据并获取当前值 我希望在电源使用等方面成为设备上最好的公民。我也只需要尽可能低的粒度(3km+)更改 按照我的理解,即使我只想要位置的“点样本”,我仍然需要启动一个长期运行的更改监控过程(对于“重大位置更改”或非单元设备正常)。这是正确的吗 当我需要当前位置时,假设此进程正在运行,我可以直接询问位置经理,对吗?(而不是将最新传递到委托方法中的数据隐藏起来。) 如果是这样的话,那么
- 按照我的理解,即使我只想要位置的“点样本”,我仍然需要启动一个长期运行的更改监控过程(对于“重大位置更改”或非单元设备正常)。这是正确的吗
- 当我需要当前位置时,假设此进程正在运行,我可以直接询问位置经理,对吗?(而不是将最新传递到委托方法中的数据隐藏起来。)
- 如果是这样的话,那么,当应用程序处于后台时关闭它,并在应用程序处于前台时重新启动它是合理的吗?(我不需要/不想被改变的背景吵醒。)
- 有没有比保持location manager运行更容易偶尔获取数据的方法
- 我还缺少什么我应该做的事情吗
欢迎您在此澄清。文档中没有特别明确的最佳实践。谢谢。如果您只想在“特定和偶尔的用户操作”之后获取信息,那么请在这些操作发生时开始更新,并在获得所需数据时使用startUpdatingLocation和StopUpdateLocation停止更新。在关闭监控之前,您应该检查数据的时间戳,以确保它是最新的,并且您还可以查看数据的准确性,以查看是否希望在停止之前等待更准确的数据。如果您只想在“特定和偶尔的用户操作”之后获取信息,然后,在这些操作发生时开始更新,并在使用startUpdatingLocation和StopUpdateingLocation获得所需数据时停止更新。在关闭监控之前,您应该检查数据的时间戳,以确保它是最新的,并且您还可以查看数据的准确性,以查看是否希望在停止之前等待更准确的数据。使用此类的方法有很多。一种基本方法是在应用程序代理中初始化它,如下所示: 设置名为locmgr的应用程序内委托的属性-
@property (nonatomic,strong) CLLocationManager *locmgr;
也符合
应用程序委派的接口部分中的CLLocationManagerDelegate
然后在ApplicationIDFinish中初始化它
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];
}
我喜欢在应用程序代理前台/后台打开和关闭服务。听起来您可能不太需要定位服务。可能是应用程序委托中的一个方法来启动和停止它。请记住,在您开始更新位置服务之后,可能需要一到两秒钟的时间,才能获得准确的值,这就是为什么有时候,最好戴上它,并在需要时抓住它。如果过滤器设置正确,将不会造成太多额外的功耗
我希望这会对你有所帮助,你可以在你的项目中使用它。使用这个类有很多方法。一种基本方法是在应用程序代理中初始化它,如下所示: 设置名为locmgr的应用程序内委托的属性-
@property (nonatomic,strong) CLLocationManager *locmgr;
也符合
应用程序委派的接口部分中的CLLocationManagerDelegate
然后在ApplicationIDFinish中初始化它
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];
}
我喜欢在应用程序代理前台/后台打开和关闭服务。听起来您可能不太需要定位服务。可能是应用程序委托中的一个方法来启动和停止它。请记住,在您开始更新位置服务之后,可能需要一到两秒钟的时间,才能获得准确的值,这就是为什么有时候,最好戴上它,并在需要时抓住它。如果过滤器设置正确,将不会造成太多额外的功耗
我希望这对你有所帮助,你可以在你的项目中使用