为了账号安全,请及时绑定邮箱和手机立即绑定

iOS9中CLLocationManager中的allowBackgroundLocation

iOS9中CLLocationManager中的allowBackgroundLocation

SMILET 2019-11-28 14:03:38
我CoreLocation在Xcode7(预发行版)的应用程序中使用框架,我注意到allowsBackgroundLocationUpdates在CLLocationManager类中有一个新添加的属性。在“功能”选项卡的“后台模式”中,此属性与位置更新之间有什么关系。它的默认值是什么,它会影响在iOS9中运行的应用程序吗?
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

WWDC会话“核心位置的新增功能”中解释了此新属性。


默认值是NO如果您链接到iOS 9。


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


该文档对此非常清楚:


默认情况下,对于与iOS 9.0或更高版本链接的应用程序,此设置为否,无论最低部署目标是什么。


通过将UIBackgroundModes设置为在Info.plist中包括“位置”,每当调用-startUpdatingLocation并意图在后台继续时,还必须在运行时将此属性设置为YES。


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


将此属性重置为NO等效于从UIBackgroundModes值中省略“位置”。只要应用程序正在运行(即未挂起)并且具有足够的授权(即,它具有WhileInUse授权且正在使用中,或者具有Always授权),仍然允许访问位置。但是,该应用仍将遵守通常的任务暂停规则。


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


查看完整回答
反对 回复 2019-11-28
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

好吧,我仍在使用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(正确调用该方法)上工作。


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 1014 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信