64

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

此属性与 Capabilities 选项卡的 Background Modes 中的位置更新之间的关系是什么。它的默认值是多少,它会影响在 iOS9 中运行的应用程序吗?

4

6 回答 6

109

这个新属性在 WWDC 会议“核心位置的新特性”中进行了解释。

默认值是NO如果您链接到 iOS 9。

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

该文档对此非常清楚:

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

将 UIBackgroundModes 设置为在 Info.plist 中包含“位置”,您还必须在运行时将此属性设置为 YES,只要调用 -startUpdatingLocation 以在后台继续进行。

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

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

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

于 2015-06-13T17:20:59.813 回答
42

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

这个新属性在 WWDC 会议“核心位置的新特性”中进行了解释。 在此处输入图像描述

默认值是NO如果您链接到 iOS 9。

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

该文档对此非常清楚:

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

将 UIBackgroundModes 设置为在 Info.plist 中包含“位置”时,您还必须在运行时将此属性设置为 YES,只要调用 -startUpdatingLocation 以在后台继续进行。

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

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

有关可能的授权值的更多详细信息,请参阅 -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>

或者拉起您的应用目标的功能选项卡。

在此处输入图像描述
(来源:raywenderlich.com

像这样使用:

_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];

我在这里写一个Demo (Demo2)

于 2015-06-24T10:18:02.813 回答
6
{
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];
         }
     }
}
于 2016-05-03T10:29:25.437 回答
5

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

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

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

于 2015-11-04T15:18:10.823 回答
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];
        }

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

于 2015-09-08T16:23:48.843 回答
0

这里总结了从iOS 8更新到iOS 9的很多方法

应该为您使用的每个框架搜索许多 API 和代码。所以在一般框架中搜索,然后找到这些方法来更新折旧的方法。

于 2015-10-01T14:19:48.700 回答