Pet*_*isu 22 gps cocoa-touch cllocationmanager ios
我的应用程序跟踪位置在后台...位置背景模式已启用,我使用
[self.locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)
这很好用,iOS7-8但它停止了工作iOS9
在模拟器中它可以工作,但在真实设备上我在后台没有回调...当在iOS8设备上运行相同的代码时,我得到正常的回调
这记录了吗?为什么它在模拟器中工作而不在设备中?这是一个错误吗?
当使用startSignificantChangeUpdates它在iOS9上工作时,我想知道这是否是某种节电功能,他们可能禁止startUpdatingLocation
sig*_*alt 34
使用:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
Run Code Online (Sandbox Code Playgroud)
避免使用评估系统版本的宏.这将在iOS 9上调用setAllowsBackgroundLocationUpdates:但在iOS 8上不调用.
小智 15
请使用以下参考ios 9中的位置
iOS9中的CLLocationManager中的allowsBackgroundLocationUpdates
这个新属性在WWDC会话"核心位置有什么新内容"中进行了解释.
如果您链接到iOS 9,则默认值为NO.
如果您的应用在后台使用位置(不显示蓝色状态栏),则除了在Info.plist中设置背景模式功能外,还必须将allowsBackgroundLocationUpdates设置为YES.否则,位置更新仅在前台传递.优点是您现在可以让位置管理器具有后台位置更新,而其他位置管理器只能在同一个应用程序中进行前景位置更新.您还可以将值重置为NO以更改行为.
文档很清楚:
默认情况下,对于链接到iOS 9.0或更高版本的应用程序,这是NO,无论最低部署目标如何.
将UIBackgroundModes设置为在Info.plist中包含"location"时,您还必须在运行时将此属性设置为YES,以便在后台继续调用-startUpdatingLocation.
当UIBackgroundModes不包含"location"时将此属性设置为YES是致命错误.
将此属性重置为NO等同于从UIBackgroundModes值中省略"location".只要应用程序正在运行(即未暂停),并且具有足够的授权(即,它具有WhenInUse授权并且正在使用,或者它具有始终授权),仍然允许访问位置.但是,该应用程序仍将遵循通常的任务暂停规则.
有关可能的授权值的更多详细信息,请参阅-requestWhenInUseAuthorization和-requestAlwaysAuthorization.
谢谢
我有同样的问题,你需要添加这样的东西:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
Run Code Online (Sandbox Code Playgroud)
我检查系统版本的宏看起来像这样:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Run Code Online (Sandbox Code Playgroud)
以下论坛帖子帮助了我:
https://forums.developer.apple.com/thread/6895
| 归档时间: |
|
| 查看次数: |
14818 次 |
| 最近记录: |