iOS9中的CLLocationManager中的allowsBackgroundLocationUpdates

tou*_*bun 63 core-location cllocationmanager ios ios9

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

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

Fel*_*lix 104

这个新属性在WWDC会话"核心位置有什么新内容"中进行了解释.

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

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

文档很清楚:

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

将UIBackgroundModes设置为在Info.plist中包含"location"时,您还必须在运行时将此属性设置为YES,以便在后台继续调用-startUpdatingLocation.

当UIBackgroundModes不包含"location"时将此属性设置为YES是致命错误.

将此属性重置为NO等同于从UIBackgroundModes值中省略"location".只要应用程序正在运行(即未暂停),并且具有足够的授权(即,它具有WhenInUse授权并且正在使用,或者它具有始终授权),仍然允许访问位置.但是,该应用程序仍将遵循通常的任务暂停规则.

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

  • 我认为这个属性使得混淆不仅仅是清晰.我们(并且我们仍然)"总是"和"在使用时"属性非常清楚.为什么添加这样令人困惑的财产 我不认为使用多个`CLLocationManager`对象是最佳做法. (5认同)

Elo*_*han 40

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

这个新属性在WWDC会话"核心位置有什么新内容"中进行了解释. 在此输入图像描述

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

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

文档很清楚:

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

将UIBackgroundModes设置为在Info.plist中包含"location"时,您还必须在运行时将此属性设置为YES,以便在后台继续调用-startUpdatingLocation.

当UIBackgroundModes不包含"location"时将此属性设置为YES是致命错误.

将此属性重置为NO等同于从UIBackgroundModes值中省略"location".只要应用程序正在运行(即未暂停),并且具有足够的授权(即,它具有WhenInUse授权并且正在使用,或者它具有始终授权),仍然允许访问位置.但是,该应用程序仍将遵循通常的任务暂停规则.

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

设置Info.plist如: 在此输入图像描述

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

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

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>
Run Code Online (Sandbox Code Playgroud)

或者拉出应用目标的"功能"标签.

在此输入图像描述

使用如下:

_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];
Run Code Online (Sandbox Code Playgroud)

在这里写了一个演示(Demo2)


Tal*_*alL 5

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

通过执行此后期绑定调用,我将其更改为此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];
        }
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}
Run Code Online (Sandbox Code Playgroud)

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


Man*_*har 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];
         }
     }
}
Run Code Online (Sandbox Code Playgroud)