Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 最小开销的核心位置设计最佳实践?_Iphone_Ios_Core Location_Cllocationmanager - Fatal编程技术网

Iphone 最小开销的核心位置设计最佳实践?

Iphone 最小开销的核心位置设计最佳实践?,iphone,ios,core-location,cllocationmanager,Iphone,Ios,Core Location,Cllocationmanager,我希望抓取位置信息,但我不需要不断更新;有一些特定的、偶尔的用户操作意味着需要获取最新的值,因此我希望“刷新”位置数据并获取当前值 我希望在电源使用等方面成为设备上最好的公民。我也只需要尽可能低的粒度(3km+)更改 按照我的理解,即使我只想要位置的“点样本”,我仍然需要启动一个长期运行的更改监控过程(对于“重大位置更改”或非单元设备正常)。这是正确的吗 当我需要当前位置时,假设此进程正在运行,我可以直接询问位置经理,对吗?(而不是将最新传递到委托方法中的数据隐藏起来。) 如果是这样的话,那么

我希望抓取位置信息,但我不需要不断更新;有一些特定的、偶尔的用户操作意味着需要获取最新的值,因此我希望“刷新”位置数据并获取当前值

我希望在电源使用等方面成为设备上最好的公民。我也只需要尽可能低的粒度(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];
 }
我喜欢在应用程序代理前台/后台打开和关闭服务。听起来您可能不太需要定位服务。可能是应用程序委托中的一个方法来启动和停止它。请记住,在您开始更新位置服务之后,可能需要一到两秒钟的时间,才能获得准确的值,这就是为什么有时候,最好戴上它,并在需要时抓住它。如果过滤器设置正确,将不会造成太多额外的功耗

我希望这对你有所帮助,你可以在你的项目中使用