我的应用在后台跟踪位置...已启用位置背景模式,我使用
[self.locationManager startUpdatingLocation];
这在iOS7-8
上效果很好,但它已停止在iOS9
在模拟器中它可以工作,但在真实设备上我在后台没有回调...当在iOS8设备上运行相同的代码时,我得到正常的回调,如前所述
这是否有记录?为什么它在模拟器中工作而不在设备中?这是一个错误吗?
当使用startSignificantChangeUpdates
时,它适用于iOS9,我想知道这是否是某种节电功能,他们可能禁止startUpdatingLocation
答案 0 :(得分:34)
使用:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
避免使用评估系统版本的宏。这将在iOS 9上调用setAllowsBackgroundLocationUpdates:但在iOS 8上不调用。
答案 1 :(得分:15)
请在ios 9中使用以下参考位置
allowsBackgroundLocationUpdates in CLLocationManager in iOS9
这个新属性在WWDC会议中解释了#34;核心位置的新内容"。
如果您链接iOS 9,则默认值为NO。
如果您的应用在后台使用位置(不显示蓝色状态栏),除了在Info.plist中设置背景模式功能外,您还必须将allowsBackgroundLocationUpdates设置为YES。否则,位置更新仅在前台传递。优点是您现在可以让位置管理器具有后台位置更新,而其他位置管理器只能在同一个应用程序中进行前景位置更新。您也可以将值重置为NO以更改行为。
文档很清楚:
默认情况下,对于针对iOS 9.0或更高版本链接的应用程序,这是NO,无论最低部署目标如何。
将UIBackgroundModes设置为包含" location"在Info.plist中,每次调用-startUpdatingLocation并且意图在后台继续时,还必须在运行时将此属性设置为YES。
当UIBackgroundModes不包含" location"时,将此属性设置为YES。是一个致命的错误。
将此属性重置为NO等同于省略" location"来自UIBackgroundModes值。只要应用程序正在运行(即未暂停),并且具有足够的授权(即,它具有WhenInUse授权并且正在使用,或者它具有始终授权),仍然允许访问位置。但是,该应用程序仍将遵循通常的任务暂停规则。
有关可能的授权值的更多详细信息,请参阅-requestWhenInUseAuthorization和-requestAlwaysAuthorization。
由于
答案 2 :(得分:7)
我有同样的问题,你需要添加这样的东西:
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)
以下论坛帖子帮助了我:
答案 3 :(得分:2)
新方法是locationManager - > requestLocation()请参阅https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/还添加了allowsBackgroundLocationUpdates(仅适用于iOS9)。