CLLocationManager
类中新增了一个名为allowsBackgroundLocationUpdates
的属性。
这个属性与“能力”标签下的“后台模式”中的位置更新有什么关系?它的默认值是什么?它是否会影响在iOS9上运行的应用程序?
CLLocationManager
类中新增了一个名为allowsBackgroundLocationUpdates
的属性。
这个属性与“能力”标签下的“后台模式”中的位置更新有什么关系?它的默认值是什么?它是否会影响在iOS9上运行的应用程序?
这个新属性在WWDC会议的 "Core Location的新功能"中有介绍。
如果你链接的是iOS 9,则默认值为NO
。
如果您的应用在后台使用位置服务(不显示蓝色状态栏),则必须将allowsBackgroundLocationUpdates
设置为YES
,并在Info.plist中设置背景模式能力,否则位置更新仅在前台提供。优点是您现在可以在同一应用程序中拥有具有后台位置更新和< strong>其他仅具有前台位置更新的位置管理器。您还可以将该值重置为NO
以更改行为。
文档对此非常清楚:
默认情况下,无论最小部署目标如何,针对iOS 9.0或更高版本链接的应用程序都不会启用此选项。
当UIBackgroundModes在Info.plist中包括“location”时,每次调用-startUpdatingLocation并打算在后台继续时,您必须在运行时将此属性设置为YES。
当UIBackgroundModes不包括“location”时,将此属性设置为YES是致命错误。
将此属性重置为NO等效于省略UIBackgroundModes值中的“location”。仍然允许访问位置,只要应用程序正在运行(即未挂起),并且具有足够的授权(即具有在使用中的WhenInUse授权或始终授权)。但是,该应用程序仍将受到常规任务暂停规则的限制。
有关可能的授权值的更多详细信息,请参见-requestWhenInUseAuthorization和-requestAlwaysAuthorization。
NO
,如果您链接到iOS 9。allowsBackgroundLocationUpdates
设置为YES
。否则,位置更新仅在前景中交付。优点是您现在可以在同一应用程序中拥有具有后台位置更新和仅前景位置更新的位置管理器。您也可以将该值重置为NO
以更改行为。<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];
我写了一个演示 这里 (Demo2)
{
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];
}
}
}
mainBundle = [NSBundle mainBundle];
- mauron85我在iOS 9.0.x的后台模式中遇到了相同的位置服务问题,按照这篇文章的建议添加以下代码进行修复:
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
但是在iOS 9.1上无法使用。有没有人遇到相同的问题?如果是,请帮忙解决。谢谢。
我仍在使用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上可以正确调用方法。
这里是从iOS 8到iOS 9更新的许多方法的摘要。
许多API和代码应该针对您正在使用的每个框架进行搜索。因此,先在通用框架中搜索,然后找到这些方法以更新过时的方法。
CLLocationManager
对象不是最佳实践。 - androniennnrequestAlwaysAuthorization
足够好? - Awesome-o