iOS9中的CLLocationManager中的allowsBackgroundLocationUpdates

时间:2015-06-12 16:41:21

标签: ios ios9 core-location cllocationmanager

我在我的应用程序中使用CoreLocation框架在Xcode7(预发布)中,我注意到在allowsBackgroundLocationUpdates类中有一个名为CLLocationManager的新添加属性。

此属性与“功能”选项卡的“背景模式”中的位置更新之间的关系是什么。它的默认值是什么?它会影响在iOS9中运行的应用程序吗?

6 个答案:

答案 0 :(得分:102)

WWDC会话"What's New in Core Location"中解释了这个新属性。

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

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

文档很清楚:

  

默认情况下,对于链接到iOS 9.0或iOS的应用程序,这是NO   以后,无论最低部署目标如何。

     

将UIBackgroundModes设置为在Info.plist中包含“location”   每次调用时,还必须在运行时将此属性设置为YES   -startUpdatingLocation,目的是在后台继续。

     

当UIBackgroundModes不包含时,将此属性设置为YES   “位置”是一个致命的错误。

     

将此属性重置为NO等同于省略“location”   来自UIBackgroundModes值。访问位置仍然是   在应用程序运行时(即未暂停)允许,以及   有足够的授权(即它具有WhenInUse授权并且是   在使用中,或它具有始终授权)。但是,该应用程序仍然会   遵守通常的任务暂停规则。

     

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

答案 1 :(得分:39)

如果您在Xcode7(预发布版)的应用程序中使用CoreLocation框架,您可能会注意到在CLLocationManager类中有一个名为allowsBackgroundLocationUpdates的新添加属性。

WWDC会话"What's New in Core Location"中解释了这个新属性。  enter image description here

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

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

文档很清楚:

  

默认情况下,对于链接到iOS 9.0或iOS的应用程序,这是NO   以后,无论最低部署目标如何。

     

将UIBackgroundModes设置为在Info.plist中包含“location”   每次调用时,还必须在运行时将此属性设置为YES   -startUpdatingLocation,目的是在后台继续。

     

当UIBackgroundModes不包含时,将此属性设置为YES   “位置”是一个致命的错误。

     

将此属性重置为NO等同于省略“location”   来自UIBackgroundModes值。访问位置仍然是   在应用程序运行时(即未暂停)允许,以及   有足够的授权(即它具有WhenInUse授权并且是   在使用中,或它具有始终授权)。但是,该应用程序仍然会   遵守通常的任务暂停规则。

     

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

设置Info.plist,如:  enter image description here

Info.plist配置的语法如下所示:

<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

或者拉出应用目标的“功能”标签。

enter image description here

使用类似:

_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
    [_locationManager requestAlwaysAuthorization];
}
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];

我写了一个演示Here (Demo2)

答案 2 :(得分:5)

好吧,我还在使用xCode 6,因为7 beta总是和模拟器崩溃,我有这个问题,虽然我甚至没有链接到iOS9!我无法设置此属性,因为它在iOS8中不存在!哦,Apple,这个折磨什么时候会结束?!

通过执行此后期绑定调用,我将其更改为此xCode6兼容版本:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {

            BOOL yes = YES;

            NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )];
            NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
            [invocation setTarget: locationManager];
            [invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ];
            [invocation setArgument: &yes atIndex: 2];
            [invocation invoke];
        }

确认在iOS8上工作(没有做任何事情)和在iOS9 beta 6上工作(正确调用方法)。

答案 3 :(得分:5)

我在iOS 9.0.x的后台模式上遇到了相同的位置服务,我通过添加以下代码按照本文中的建议进行了修复

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}

然而,它在iOS 9.1中不起作用有没有人有同样的问题? 如果是这样,请帮助。感谢

答案 4 :(得分:5)

{
NSArray* backgroundModes  = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"];

     if(backgroundModes && [backgroundModes containsObject:@"location"]) {
         if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
             // We now have iOS9 and the right capabilities to set this:
             [manager setAllowsBackgroundLocationUpdates:YES];
         }
     }
}

答案 5 :(得分:0)

Here是从iOS 8更新到iOS 9的许多方法的摘要

应针对您使用的每个框架搜索许多API和代码。因此,在General中搜索框架,然后找到这些方法来更新折旧方法。