flo*_*flo 8 iphone objective-c core-location cllocationmanager ios
测试设备:iPhone 5(iOS 7)
我有一个使用RegionMonitoring和的应用程序updateLocation.如果输入某个区域,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!"];
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试过:重新启动locationManagerDidPauseLocationUpdates方法中的更新,但似乎永远不会调用它:
-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager
{
[WRUtils writeToLog:@"LocationUpdate paused, restarted"];
[_locationManager startUpdatingLocation];
}
Run Code Online (Sandbox Code Playgroud)
检查didFailWithError方法中的错误,但也不会调用此方法.并且与属性玩了一下:
[_locationManager setActivityType:CLActivityTypeOther];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBestForNavigation];
[_locationManager setPausesLocationUpdatesAutomatically:NO];
Run Code Online (Sandbox Code Playgroud)
Plist设置是正确的我猜:所需的背景模式是必需的背景模式项目0应用程序寄存器用于位置更新
我怎么解决这个问题?
Ale*_*lex 25
Apple已在iOS 7中引入了新策略.如果在应用程序处于后台时调用"startUpdatingLocation",iOS 7将不再在后台提供位置更新.在这种情况下,只有将应用程序带到前台才能获得更新.
当您使用地理围栏功能时,每次获得RegionEntered/Exited通知处理此通知时,您的应用只需几秒钟.在这几秒钟内,您还可以获得位置更新.在这几秒钟结束后,iOS 7再次暂停您的应用程序.
您可以使用后台任务获得超过几秒钟的时间,但在iOS 7中,Apple还缩短了应用程序在后台运行的时间,从10分钟(iOS 6及更早版本)到iOS 7下仅3分钟.看起来像这3分钟是应用程序在后台的总时间.这意味着你不能要求iOS 7 10次获得1分钟的后台时间,你总共只能得到3分钟,所以在第3次你要求一分钟后,你的应用程序将不再获得任何后台时间一点都不
您在后台获取位置更新的唯一机会是在应用程序位于前台时调用"startUpdatingLocation".这很难过,特别是当你只需要响应Region(进入/退出消息)的位置更新时,因为你需要让位置更新一直在运行.但你可以通过将精度值设置为kCLLocationAccuracyThreeKilometers来减少电池使用量.你不需要位置更新,只有在真正需要地理坐标时才能将精度设置为kCLLocationAccuracyBest.iOS不会为GPS提供kCLLocationAccuracyThreeKilometers值,因此在这种情况下电池使用率会适中.
此外,精度值kCLLocationAccuracyBestForNavigation似乎在IOS 7下引起问题.如果设备未连接到外部电源,则不会使用此值进行任何位置更新.
总而言之,新的iOS 7位置更新政策使得开发某些类型的应用程序变得更加困难.您不必仅在需要时注册位置更新,而是在应用程序的生命周期内注册这些更新.尽管苹果公司对这项新政策的意图可能恰恰相反,但这当然会让电池的耗电速度更快一些.
更新:
经过一些测试后,我找到了解决这个问题的方法.Apple提供的文档提到,使用重要位置更改API时,即使在后台启动"startUpdatingLocation",应用也可以在后台接收位置更新.
我的第一次测试效果不佳.我在调用startUpdatingLocation之前注册了我的应用程序,用于监视委托方法的区域内的重要位置更新(因此这个位置服务仅在需要时启用),但是这仍然不会像文档建议的那样在后台提供位置更新.
但是,如果您在启动应用程序后直接开始侦听重要的位置更改(并且从不关闭它),则可以在应用程序处于后台时调用start"startUpdatingLocation",并在后台接收位置更新.一直具有"显着位置变化"功能的电池使用率似乎非常低,因此这可能是大多数应用程序的解决方案.
您必须检查设备上是否有"重要位置更改"功能,但似乎所有当前设备都支持此功能.即便是第5代iPod Touch也支持它(iPod Touch不能使用手机信号塔进行位置更新,根据Apple的文档,这是此功能的基本方法,所以我想我们可以假设所有当前运行iOS的设备7可以使用"重要位置更新"API.虽然检查此功能是否真的可能是个好主意,但也许某些情况下该功能不可用).
使用"重要位置更改"API可能有一个缺点:可以在后台启动应用程序(如果它在后台由iOS终止,以便为其他应用程序重用其内存),无论何时设备已"显着移动" "(根据文档:当蜂窝塔已经改变,但每5分钟不超过一次).因此,只有在退出或进入某个区域时才需要激活的应用程序将被启动并通知位置已更改所有的时间,不仅仅是在那些地区.但我认为这应该比标准的位置更新始终更好.
我的iPhone 5s只消耗1%的电池,显着的位置变化激活,而不是12%,标准位置更新激活,精度设置为3km.
希望这可以帮助所有正在努力应对新iOS 7行为的开发人员.
| 归档时间: |
|
| 查看次数: |
3696 次 |
| 最近记录: |