iOS9后台不跟踪位置

22

我的应用程序可以在后台跟踪位置...启用了位置后台模式并且我使用了

[self.locationManager startUpdatingLocation];

这在上运作良好,但在上停止工作

在模拟器上可以运行,但在真实设备中在后台没有回调...当在iOS8设备上运行相同的代码时,像以前一样正常回调

这个有文档记录吗?为什么在模拟器中可以工作而在设备上不行?这是一个错误吗?

使用startSignificantChangeUpdates时,它在iOS9上可以工作,我想知道这是否是某种节省电池功能,他们可能禁止了startUpdatingLocation


1
请查看以下链接:https://dev59.com/f10a5IYBdhLWcg3wAEo3 - Dipen
4个回答

34

使用:

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
    [self.locationManager setAllowsBackgroundLocationUpdates:YES];
}

为了避免使用评估系统版本的宏,这将在iOS 9上调用setAllowsBackgroundLocationUpdates:,但不会在iOS 8上调用。


这个救了我的周末 :) 奇怪的是,在模拟器中它可以正常工作,没有任何问题。 - Bhumit Mehta

15

请使用以下参考资料来了解iOS 9中的位置设置:

allowsBackgroundLocationUpdates in CLLocationManager in iOS9

这个新属性在“Core Location 中的新功能”WWDC会话中进行了解释。

如果您链接到iOS 9,则默认值为NO。

如果您的应用程序在后台使用位置(没有显示蓝色状态栏),除了在Info.plist中设置背景模式之外,还必须将allowsBackgroundLocationUpdates设置为YES。否则,位置更新仅在前景中传递。优点是,您现在可以在同一个应用程序中具有具有后台位置更新和仅前台位置更新的位置管理器。您也可以将该值重置为NO以更改行为。

文档对此非常明确:

默认情况下,无论最小部署目标如何,对于链接到iOS 9.0或更高版本的应用程序,此值均为NO。

在Info.plist中包括“位置”的UIBackgroundModes时,每次调用-startUpdatingLocation时,并且希望在后台继续运行,您还必须在运行时将此属性设置为YES。

当UIBackgroundModes不包括“location”时,将此属性设置为YES是致命错误。

将此属性重置为NO相当于从UIBackgroundModes值中省略“location”。只要应用程序正在运行(即未暂停)并具有足够的授权(即具有WhenInUse授权且正在使用,或具有Always授权),仍然允许访问位置。但是,该应用程序仍将受到常规任务暂停规则的限制。

有关可能的授权值的更多详细信息,请参见-requestWhenInUseAuthorization和-requestAlwaysAuthorization。

谢谢


2
请注意,在系统版本低于9.0的情况下,如果在程序中包含此属性,程序将会崩溃。您将看到以下错误信息:[CLLocationManager setAllowsBackgroundLocationUpdates:]:未识别的选择器发送给实例。请参考我的答案来解决这个问题。 - mkabatek
Xcode 7将此建议更改为: if#available(iOS 9.0,*){ self.locationManager.allowsBackgroundLocationUpdates = true } else { //回退到早期版本 } - Ben Carroll

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

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接