gpt4 book ai didi

ios - StartUpdateLocations在后台运行,didUpdatingToLocation仅调用10-20次

转载 作者:可可西里 更新时间:2023-11-01 03:04:10 25 4
gpt4 key购买 nike

测试设备:iPhone 5(iOS 7)

我有一个使用RegionMonitoringupdateLocation的应用程序。如果输入区域,则按预期方式调用didEnterRegion。然后我叫startUpdatingLocation。但是didUpdateToLocation方法仅被调用10-20次,而它应该更新位置直到计时器触发。

相关代码:

CLLocationManager *_locationManager;
NSTimer *_timer;

-(void)initLocationManager
{
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setActivityType:CLActivityTypeOther];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[_locationManager setPausesLocationUpdatesAutomatically:NO];
[_locationManager setDistanceFilter:kCLDistanceFilterNone];
}


//Did Enter Region, called as expected:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
[_locationManager startUpdatingLocation];
_timer = [NSTimer scheduledTimerWithTimeInterval:300.0f target:self selector:@selector(scheduleMethod:) userInfo:nil repeats:NO];
}


//Timer Fire Method:
- (void) scheduleMethod:(NSTimer*)timer
{
[Utils writeToLog:@"Timer-Stop"];
[_locationManager stopUpdatingLocation];
}


//This Method only called 10-20 Times (in the first 10-20 Seconds) and not the complete 5 Minutes:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[Utils writeToLog:@"LocationUpdate!"];
}

到目前为止,我尝试了:
locationManagerDidPauseLocationUpdates方法中重新启动更新,但似乎从未调用过此方法:
-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager
{
[WRUtils writeToLog:@"LocationUpdate paused, restarted"];
[_locationManager startUpdatingLocation];
}

检查 didFailWithError方法中的错误,但这两种方法均未调用。
并使用了一些属性:
[_locationManager setActivityType:CLActivityTypeOther];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[_locationManager setPausesLocationUpdatesAutomatically:NO];

我认为Plist设置正确:
所需的背景模式是
所需的背景模式
项目0应用程序注册以更新位置

我该如何解决?

最佳答案

Apple在iOS 7中引入了一项新策略。如果在应用程序处于后台时调用“startUpdatingLocation”,iOS 7将不再在后台提供位置更新。在这种情况下,只有将应用程序置于前台时,您才能获得更新。

使用地理围栏功能时,每次收到RegionEntered/Exited通知来处理此通知时,您的应用程序都将仅获得几秒钟的时间。在这几秒钟内,您可能还会获得位置更新。在这几秒钟之后,iOS 7再次挂起您的App。

您可以使用后台任务获得不止几秒钟的时间,但是在iOS 7中,Apple还将应用程序可以在后台运行的时间从10分钟(iOS 6和更早版本)减少到了iOS 7下的3分钟。这3分钟是该应用程序在后台整个时间内的总时间。这意味着您不能要求iOS 7十次获得1分钟的背景时间,您总共只能得到3分钟,因此,在第三次要求一分钟之后,您的应用程序将不再获得任何背景时间。完全没有。

在后台获取位置更新的唯一机会是在应用程序处于前台时调用“startUpdatingLocation”。尤其当您仅需要响应Region(Enter/Exit消息)进行位置更新时,这很可悲,因为您需要让位置更新始终保持运行。但是,在以下情况下,可以通过将精度值设置为kCLLocationAccuracyThreeKilometers来至少减少电池使用量:
您不需要位置更新,仅在确实需要地理坐标时才将精度设置为kCLLocationAccuracyBest。对于kCLLocationAccuracyThreeKilometers值,iOS无法为GPS供电,因此在这种情况下,电池使用量会适中。

同样,在IOS 7下,精度的值kCLLocationAccuracyBestForNavigation似乎也会引起问题。如果设备未连接到外部电源,则该值不会获得任何位置更新。

总而言之,新的iOS 7位置更新政策使开发某些类型的Apps变得更加困难。与其仅在需要时注册位置更新,不如在应用程序的生命周期内强制您注册这些位置更新。尽管苹果公司对这项新政策的意图可能恰好相反,但这当然会更快地消耗电池电量。

更新:

经过更多测试后,我找到了解决该问题的方法。
苹果公司的文档提到,当使用“有意义的位置更改API”时,即使在后台启动“startUpdatingLocation”,应用程序也可以在后台接收位置更新。

我的第一个测试效果不佳。我刚刚在调用startUpdatingLocation之前就在区域监视委托(delegate)方法中注册了我的App,以进行重要的位置更新(因此,仅在需要时才启用此位置服务),但是仍然无法如文档所建议的那样在后台提供位置更新。

但是,如果您在应用启动后立即开始监听重大的位置更改(并且永远不要关闭此功能),则可以在应用处于后台时调用start“startUpdatingLocation”,并在后台接收位置更新。一直具有“重要位置更改”功能的电池使用量似乎很低,因此这可能是大多数应用程序的解决方案。

您必须检查设备上是否具有“重要位置更改”功能,但似乎所有当前设备都支持此功能。甚至第5代iPod Touch都支持它(iPod Touch不能使用手机信号塔进行位置更新,根据Apple的文档,这是此功能的基本方法,因此我想我们可以假定当前所有运行iOS的设备7可以使用“重要位置更新” API。虽然检查此功能是否确实可用可能是一个好主意,但在某些情况下,该功能不可用。

使用“重大位置更改” API可能有一个缺点:只要设备移动“显着”,该应用程序便可以在后台重复启动(如果该应用程序被iOS终止在后台以将其内存重用于其他应用程序),则无需重复进行此操作。 “(根据文档:当手机发射塔发生变化时,但每5分钟不超过一次)。因此,仅在退出或进入某个区域时才需要激活的应用程序将启动并通知位置更改一直以来,不仅在那些地区,而且我认为这应该比始终激活标准位置更新要好得多。

我的iPhone 5s在显着的位置更改处于事件状态的情况下,夜间只消耗1%的电量,而在标准位置更新处于事件状态且精确度设置为3km的情况下,则消耗了12%的电量。

希望这对所有正在努力应对新iOS 7行为的开发人员有所帮助。

关于ios - StartUpdateLocations在后台运行,didUpdatingToLocation仅调用10-20次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com