我在Xcode7(预发布版)的应用程序中使用了Xcode7框架,我注意到CLLocationManager
类中有一个新添加的属性称为allowsBackgroundLocationUpdates
。
此属性与功能选项卡的后台模式中的位置更新之间的关系是什么?它的默认值是多少,它是否会影响在iOS9中运行的应用程序?
发布于 2015-06-13 17:20:59
此新属性将在WWDC会话“核心位置有什么新意”中解释。
如果链接到NO
9,则默认值为iOS。
如果应用程序在后台使用位置(没有显示蓝色状态栏),那么除了在allowsBackgroundLocationUpdates
中设置背景模式功能之外,还必须将YES
设置为Info.plist。否则,位置更新仅在前台传递。其优点是,您现在可以拥有具有后台位置更新的位置管理器,以及其他仅在同一应用程序中具有前台位置更新的位置管理器。还可以将值重置为NO
以更改行为。
文档对此相当清楚:
默认情况下,对于链接到iOS 9.0或更高版本的应用程序,不管最低部署目标是什么,这都不是。 将UIBackgroundModes设置为在Info.plist中包含"location“,您还必须在运行时将此属性设置为YES,以便在后台继续调用-startUpdatingLocation。 当UIBackgroundModes不包括"location“时,将此属性设置为YES是一个致命错误。 将此属性重置为NO等同于从UIBackgroundModes值中省略“位置”。在应用程序运行(即不挂起)并具有足够的授权(即具有WhenInUse授权和正在使用中,或者始终具有授权)时,仍然允许访问位置。然而,该应用程序仍将受制于通常的任务暂停规则。 有关可能的授权值的详细信息,请参阅-requestWhenInUseAuthorization和-requestAlwaysAuthorization。
发布于 2016-05-03 10:29:25
{
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];
}
}
}
发布于 2015-09-08 16:23:48
嗯,我仍然在使用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(正确调用该方法)上工作。
https://stackoverflow.com/questions/30808192
复制相似问题