首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >allowsBackgroundLocationUpdates in CLLocationManager in iOS9

allowsBackgroundLocationUpdates in CLLocationManager in iOS9
EN

Stack Overflow用户
提问于 2015-06-12 16:41:20
回答 5查看 39.4K关注 0票数 64

我在Xcode7(预发布版)的应用程序中使用了Xcode7框架,我注意到CLLocationManager类中有一个新添加的属性称为allowsBackgroundLocationUpdates

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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。

票数 109
EN

Stack Overflow用户

发布于 2016-05-03 10:29:25

代码语言:javascript
运行
复制
{
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];
         }
     }
}
票数 6
EN

Stack Overflow用户

发布于 2015-09-08 16:23:48

嗯,我仍然在使用xCode 6,因为7 beta总是与模拟器崩溃,而且我有这个问题,尽管我甚至没有链接到iOS9!而且我不能设置这个属性,因为它在iOS8中不存在!哦,苹果,折磨什么时候结束?!

通过执行这个后期绑定调用,我将其更改为与xCode6兼容的版本:

代码语言:javascript
运行
复制
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(正确调用该方法)上工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30808192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档