iOS9在后台无法跟踪位置

时间:2015-09-24 09:39:48

标签: ios cocoa-touch gps cllocationmanager

我的应用在后台跟踪位置...已启用位置背景模式,我使用

[self.locationManager startUpdatingLocation];

这在iOS7-8上效果很好,但它已停止在iOS9

上工作

在模拟器中它可以工作,但在真实设备上我在后台没有回调...当在iOS8设备上运行相同的代码时,我得到正常的回调,如前所述

这是否有记录?为什么它在模拟器中工作而不在设备中?这是一个错误吗?

当使用startSignificantChangeUpdates时,它适用于iOS9,我想知道这是否是某种节电功能,他们可能禁止startUpdatingLocation

4 个答案:

答案 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)

以下论坛帖子帮助了我:

https://forums.developer.apple.com/thread/6895

答案 3 :(得分:2)

新方法是locationManager - > requestLocation()请参阅https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/还添加了allowsBackgroundLocationUpdates(仅适用于iOS9)。