iOS9 在后台时不跟踪位置
iOS9 not tracking location while in background
我的应用程序在后台跟踪位置...位置后台模式已启用,我使用
[self.locationManager startUpdatingLocation];
这在 iOS7-8
上运行良好,但在 iOS9
上停止运行
在模拟器中它可以工作,但在真实设备上,我在后台时没有收到回调...当 运行 在 iOS8 设备上使用相同的代码时,我会像以前一样收到正常的回调
这有记录吗?为什么它在模拟器中而不是在设备中工作?这是一个错误吗?
当使用 startSignificantChangeUpdates
时,它在 iOS9 上有效,我想知道这是否是某种省电功能,他们可能禁止了 startUpdatingLocation
新方法是 locationManager -> requestLocation() 参见 https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ 还添加了 allowsBackgroundLocationUpdates(仅适用于 iOS9)。
ios9
中的位置请使用以下参考
allowsBackgroundLocationUpdates in CLLocationManager in iOS9
这个新的 属性 在 WWDC session "What's New in Core Location" 中有解释。
如果您 link 反对 iOS 9.
,则默认值为 NO
如果您的应用程序在后台使用位置信息(不显示蓝色状态栏),除了在 Info.plist 中设置后台模式功能之外,您还必须将 allowsBackgroundLocationUpdates 设置为 YES。否则位置更新仅在前台传送。优点是您现在可以在同一应用程序中拥有具有后台位置更新的位置管理器和仅具有前台位置更新的其他位置管理器。您也可以将值重置为 NO 以更改行为。
文档对此非常清楚:
默认情况下,对于针对 iOS 9.0 或更高版本 link 的应用程序,这是否,无论最低部署目标如何。
将 UIBackgroundModes 设置为在 Info.plist 中包含 "location",您还必须在运行时将此 属性 设置为 YES,每当调用 -startUpdatingLocation 以在后台继续时。
当 UIBackgroundModes 不包含 "location" 时将此 属性 设置为 YES 是一个致命错误。
将此 属性 重置为 NO 等同于从 UIBackgroundModes 值中省略 "location"。只要应用程序 运行(即未暂停)并具有足够的授权(即它具有 WhenInUse 授权并且正在使用,或者它具有 Always 授权),仍然允许访问位置。但是,该应用程序仍将受制于通常的任务暂停规则。
有关可能的授权值的更多详细信息,请参阅 -requestWhenInUseAuthorization 和 -requestAlwaysAuthorization。
谢谢
我遇到了同样的问题,您需要添加如下内容:
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)
以下论坛post帮助了我:
使用:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
避免使用评估系统版本的宏。这将调用 setAllowsBackgroundLocationUpdates: 在 iOS 9 但不会在 iOS 8.
我的应用程序在后台跟踪位置...位置后台模式已启用,我使用
[self.locationManager startUpdatingLocation];
这在 iOS7-8
上运行良好,但在 iOS9
在模拟器中它可以工作,但在真实设备上,我在后台时没有收到回调...当 运行 在 iOS8 设备上使用相同的代码时,我会像以前一样收到正常的回调
这有记录吗?为什么它在模拟器中而不是在设备中工作?这是一个错误吗?
当使用 startSignificantChangeUpdates
时,它在 iOS9 上有效,我想知道这是否是某种省电功能,他们可能禁止了 startUpdatingLocation
新方法是 locationManager -> requestLocation() 参见 https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ 还添加了 allowsBackgroundLocationUpdates(仅适用于 iOS9)。
ios9
中的位置请使用以下参考allowsBackgroundLocationUpdates in CLLocationManager in iOS9
这个新的 属性 在 WWDC session "What's New in Core Location" 中有解释。
如果您 link 反对 iOS 9.
,则默认值为 NO如果您的应用程序在后台使用位置信息(不显示蓝色状态栏),除了在 Info.plist 中设置后台模式功能之外,您还必须将 allowsBackgroundLocationUpdates 设置为 YES。否则位置更新仅在前台传送。优点是您现在可以在同一应用程序中拥有具有后台位置更新的位置管理器和仅具有前台位置更新的其他位置管理器。您也可以将值重置为 NO 以更改行为。
文档对此非常清楚:
默认情况下,对于针对 iOS 9.0 或更高版本 link 的应用程序,这是否,无论最低部署目标如何。
将 UIBackgroundModes 设置为在 Info.plist 中包含 "location",您还必须在运行时将此 属性 设置为 YES,每当调用 -startUpdatingLocation 以在后台继续时。
当 UIBackgroundModes 不包含 "location" 时将此 属性 设置为 YES 是一个致命错误。
将此 属性 重置为 NO 等同于从 UIBackgroundModes 值中省略 "location"。只要应用程序 运行(即未暂停)并具有足够的授权(即它具有 WhenInUse 授权并且正在使用,或者它具有 Always 授权),仍然允许访问位置。但是,该应用程序仍将受制于通常的任务暂停规则。
有关可能的授权值的更多详细信息,请参阅 -requestWhenInUseAuthorization 和 -requestAlwaysAuthorization。
谢谢
我遇到了同样的问题,您需要添加如下内容:
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)
以下论坛post帮助了我:
使用:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
避免使用评估系统版本的宏。这将调用 setAllowsBackgroundLocationUpdates: 在 iOS 9 但不会在 iOS 8.