我的应用程序在后台跟踪位置。启用了位置后台模式,并且我使用
[self.locationManager startUpdatingLocation];这在iOS7-8上很好,但是它停止了对iOS9的工作。
在模拟器里它能工作,但是在真实的设备上,我在后台没有回调.当在iOS8设备上运行相同的代码时,我会像以前一样得到正常的回调
,这是有记录的吗?为什么它在模拟器中工作而不是在设备上工作?是错误吗?
当使用startSignificantChangeUpdates时,它在iOS9上工作,我想知道这是否是某种节省电池的功能,他们可能禁止startUpdatingLocation。
发布于 2015-11-09 22:07:23
使用:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}若要避免使用评估系统版本的宏,请执行以下操作。这将调用setAllowsBackgroundLocationUpdates:在iOS 9上,而不是在iOS 8上。
发布于 2015-09-24 09:52:01
请使用以下参考资料,以了解ios 9中的位置
allowsBackgroundLocationUpdates in CLLocationManager in iOS9
这个新属性将在WWDC会话“核心位置中的新内容”中解释。
如果链接到iOS 9,则默认值为NO。
如果应用程序在后台使用位置(没有显示蓝色状态栏),那么除了在allowsBackgroundLocationUpdates中设置背景模式功能之外,还必须将Info.plist设置为YES。否则,位置更新仅在前台传递。其优点是,您现在可以使用后台位置更新的位置管理器,以及在同一应用程序中只有前台位置更新的其他位置管理器。还可以将值重置为“否”以更改行为。
文档对此相当清楚:
默认情况下,对于链接到iOS 9.0或更高版本的应用程序,不管最低部署目标是什么,这都不是。
将UIBackgroundModes设置为在Info.plist中包含"location“,您还必须在运行时将此属性设置为YES,以便在后台继续调用-startUpdatingLocation。
当UIBackgroundModes不包括"location“时,将此属性设置为YES是一个致命错误。
将此属性重置为NO等同于从UIBackgroundModes值中省略“位置”。在应用程序运行(即不挂起)并具有足够的授权(即具有WhenInUse授权和正在使用中,或者始终具有授权)时,仍然允许访问位置。然而,该应用程序仍将受制于通常的任务暂停规则。
有关可能的授权值的详细信息,请参阅-requestWhenInUseAuthorization和-requestAlwaysAuthorization。
谢谢
发布于 2015-10-12 17:59:29
我也有同样的问题,你需要添加这样的东西:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}我用于检查系统版本的宏如下所示:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)以下论坛帖子帮助了我:
https://stackoverflow.com/questions/32758125
复制相似问题