iOS9中CLLocationManager中的AllowsBackgroundLocationUpdate

iOS9中CLLocationManager中的AllowsBackgroundLocationUpdate,ios,ios9,core-location,cllocationmanager,Ios,Ios9,Core Location,Cllocationmanager,我在Xcode7(预发布)的应用程序中使用了CoreLocation框架,我注意到CLLocationManager类中新增了一个名为allowsBackgroundLocationUpdates的属性 此属性与“功能”选项卡后台模式中的位置更新之间的关系如何。它的默认值是多少?它是否影响在iOS9中运行的应用程序?此新属性将在WWDC会话中解释 如果链接到iOS 9,则默认值为NO 如果您的应用程序在后台使用位置(不显示蓝色状态栏),除了在Info.plist中设置后台模式功能外,还必须将al

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


此属性与“功能”选项卡后台模式中的位置更新之间的关系如何。它的默认值是多少?它是否影响在iOS9中运行的应用程序?

此新属性将在WWDC会话中解释

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

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

文档对此非常清楚:

默认情况下,对于链接到iOS 9.0或 以后,不管最小部署目标是什么

将UIBackgroundModes设置为在Info.plist中包含“位置”,您可以 每次调用时,还必须在运行时将此属性设置为“是” -startUpdatingLocation希望在后台继续

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

将此属性重置为“否”相当于省略“位置” 从UIBackgroundModes值。目前仍无法访问该位置 在应用程序运行时允许(即未挂起),以及 具有足够的授权(即具有WhenInUse授权和 正在使用中,或始终具有授权)。不过,该应用程序仍将继续运行 遵守通常的任务暂停规则

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


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


WWDC会话中将解释此新属性。

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

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

文档对此非常清楚:

默认情况下,对于链接到iOS 9.0或 以后,不管最小部署目标是什么

将UIBackgroundModes设置为在Info.plist中包含“位置”,您可以 每次调用时,还必须在运行时将此属性设置为“是” -startUpdatingLocation希望在后台继续

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

将此属性重置为“否”相当于省略“位置” 从UIBackgroundModes值。目前仍无法访问该位置 在应用程序运行时允许(即未挂起),以及 具有足够的授权(即具有WhenInUse授权和 正在使用中,或始终具有授权)。不过,该应用程序仍将继续运行 遵守通常的任务暂停规则

有关详细信息,请参阅-RequestWhenUseAuthorization和-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>

我写了一个演示

好吧,我仍然在使用xCode 6,因为7测试版总是会在模拟器上崩溃,我有这个问题,尽管我甚至没有链接到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(正确调用该方法)上工作。

是许多从iOS 8更新到iOS 9的方法的总结


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

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

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}
但是,它在iOS 9.1中不起作用。有人有同样的问题吗???
如果是,请帮忙。谢谢

我认为这个属性造成的混乱多于清晰。我们有(现在仍然有)“始终”和“使用时”的属性,这些属性非常清晰。为什么要添加如此混乱的属性。我不认为使用一个以上的
CLLocationManager
对象是最佳实践。在后台进行区域监视或重大更改位置监视是否需要此属性,或者
requestAlwaysAuthorization
是否仍然足够好?我在运行时遇到了AllowBackgroundLocationUpdate的奇怪行为启用后禁用。也许你能帮我解决我的问题谢谢我在iOS 9上也有同样的问题。1@franck,我有完全相同的问题,你解决了吗?@ASBai抱歉,没有,现在对我有效,我也没有
{
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];
         }
     }
}
{
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];
         }
     }
}