iOS 14系统,为了进一步控制定位隐私数据的安全性,也针对各APP实际上对于定位精度的需求不一致的问题(如天气、新闻类APP实际上只需要城市级别定位精度即可),定位权限在用户授予时增加了『精确位置』的开关,如下图所示:
用户可以点击上图红色区域,以控制是否授予APP高精度等级定位权限。在授予低精度等级定位权限的情况下,开发者仍然可以从定位sdk的位置回调中获取到位置数据,但定位精度会受很大影响,一般定位精度在5km范围内,更新频率也会变慢,几分钟内会更新几次。
用户也可以直接从APP定位隐私设置中控制『精确位置』开关,如下图所示:
1、新增属性:
///返回定位精度等级,IOS14之后用户可以直接控制返回定位的精度等级,开发者可以通过这个值适配不同定位等级下的产品逻辑@property (nonatomic, readonly) BMKLAccuracyAuthorization accuracyAuthorization;
开发者通过这一属性直接判断当前用户是否授予精确定位权限。枚举值如下:
/** BMKLAccuracyAuthorization 枚举返回定位精度等级**/typedef NS_ENUM(NSInteger, BMKLAccuracyAuthorization) {BMKLAccuracyAuthorizationFullAccuracy, ///<全量定位精度等级,该等级下定位返回结果会尽可能精准BMKLAccuracyAuthorizationReducedAccuracy, ///<降级定位精度等级,该等级下定位会返回大概5km精度范围的点,定位频率、实时性上也会变慢,比如可能是20分钟之前的点,适用于那些只要求城市级别精度的app使用;ios14之后,该等级受用户控制,需要高等级权限的app需要对应做好适配工作};
2、新增方法:
/*** @brief 如果你没有全量定位等级精度权限,利用该接口可以临时请求一次全量定位精度等级,系统会抛出弹框让用户确认是否授权app授予相应权限* @param purposeKey info.plist中NSLocationTemporaryUsageDescriptionDictionary定义的key,对应相应的value可以详细描述申请全量定位精度等级的原因* @param completion 回调是否* @return*/- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(NSString * _Nonnull)purposeKey completion:(void(^ _Nullable)(NSError * _Nullable))completion API_AVAILABLE(ios(14.0));/*** @brief 请求一次全量定位精度等级* @param purposeKey info.plist中NSLocationTemporaryUsageDescriptionDictionary定义的key* @return*/- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(NSString * _Nonnull)purposeKey API_AVAILABLE(ios(14.0));
上述方法只在iOS 14及以后版本系统才可用。适用于在用户未授予精确定位权限的情况下,产品功能必须依赖精确定位的位置,开发者可以通过调用该方法临时触发系统弹框,让用户确认,其中参数:purposeKey,需要在info.plist中的NSLocationTemporaryUsageDescriptionDictionary中定义,不同产品场景可以定义不同的purposeKey。
3、新增回调
在BMKLocationMnagerDelegate中新增加回调:
/*** @brief authorizationStatus或者accuracyAuthorization有变化时回调函数* @param manager 定位 BMKLocationManager 类。*/- (void)BMKLocationManagerDidChangeAuthorization:(BMKLocationManager * _Nonnull)manager;
通过该回调,在用户定位权限或者精确定位权限改变的时候,通知开发者,示例代码如下:
/*** @brief authorizationStatus或者accuracyAuthorization有变化时回调函数* @param manager 定位 BMKLocationManager 类。*/- (void)BMKLocationManagerDidChangeAuthorization:(BMKLocationManager * _Nonnull)manager {NSLog(@"Loc CLAuthorizationStatus = %ld", (long)manager.authorizationStatus);NSLog(@"Loc accuracyAuthorization = %ld", (long)manager.accuracyAuthorization);if (manager.accuracyAuthorization == BMKLAccuracyAuthorizationReducedAccuracy) {if (@available(iOS 14.0, *)) {[manager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"TempRequestFullLocAccuracy" completion:^(NSError * _Nullable error) {if (error) {NSLog(@"requestTemporaryFullAccuracyAuthorizationWithPurposeKey error = %@", error);}}];}} else {NSLog(@"User has choose full loc accuracy permission");}if (manager.accuracyAuthorization == kCLAuthorizationStatusAuthorizedWhenInUse) {NSLog(@"User has choose when in use loc permission");} else if (manager.accuracyAuthorization == kCLAuthorizationStatusAuthorizedAlways) {NSLog(@"User has choose always loc permission");} else if (manager.accuracyAuthorization == kCLAuthorizationStatusDenied) {NSLog(@"User has choose denied loc permission");}}
开发者在开发时,也可以配置app申请定位权限默认就是低精度的定位等级,有两种方式:
1、通过info.plist配置
2、通过代码控制:
if (@available(iOS 14.0, *)) {_locationManager.desiredAccuracy = kCLLocationAccuracyReduced;} else {// Fallback on earlier versions}
适配iOS 14 Beta版的定位SDK开发包、类参考和示例代码可在相关下载页面进行下载。
上一篇
下一篇
本篇文章对您是否有帮助?