iOS9在后台无法跟踪位置

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.

谢谢

  • 请注意,如果在低于9.0的系统版本中包含此属性,则程序将崩溃.您将看到:[CLLocationManager setAllowsBackgroundLocationUpdates:]:发送到实例的无法识别的选择器.请参阅我的答案来管理这个. (2认同)

mka*_*tek 7

我有同样的问题,你需要添加这样的东西:

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