在iOS9的CLLocationManager中allowBackgroundLocationUpdate

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

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

WWDC会议“核心位置新增function”解释了这一新的属性。

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

如果您的应用程序在后台使用位置(不显示蓝色状态栏),则除了在Info.plist中设置背景模式function之外,还必须将allowsBackgroundLocationUpdates设置为YES 。 否则位置更新只能在前台传送。 好处是您现在可以让位置pipe理员在后台位置更新和其他位置pipe理器在同一个应用程序只有前景位置更新。 您也可以将该值重置为NO以更改行为。

文档很清楚:

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

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

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

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

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

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

WWDC会议“核心位置新增function”解释了这一新的属性。 在这里输入图像描述

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

如果您的应用程序在后台使用位置(不显示蓝色状态栏),则除了在Info.plist中设置背景模式function之外,还必须将allowsBackgroundLocationUpdates设置为YES 。 否则位置更新只能在前台传送。 好处是您现在可以让位置pipe理员在后台位置更新和其他位置pipe理器在同一个应用程序只有前景位置更新。 您也可以将该值重置为NO以更改行为。

文档很清楚:

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

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

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

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

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

设置Info.plist如下: 在这里输入图像描述

Info.plistconfiguration的语法如下所示:

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

或者拉起你的应用程序目标的能力选项卡。

在这里输入图像描述

使用像:

 _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)

那么,我仍然使用xCode 6,因为7testing版总是与模拟器崩溃,我有这个问题,虽然我甚至没有链接到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 9.0.x的背景模式下遇到了相同的位置服务,我通过添加下面的代码来修正它在本文中的build议

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

然而,它不适用于iOS 9.1有没有人有同样的问题? 如果是这样,请帮助。 谢谢

 { 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]; } } } 

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

应该为您正在使用的每个框架search许多API和代码。 因此,search一般的框架,然后find这些方法来更新折旧方法。