iOS14 定位适配:1、向用户申请临时开启一次精确位置权限的方案2、高德定位SDK适配

简介: iOS14 定位适配:1、向用户申请临时开启一次精确位置权限的方案2、高德定位SDK适配

文章目录

  • 前言
  • I、向用户申请临时开启一次精确位置权限:不同产品场景可以定义不同的purposeKey

  • 1.2.1 通过API设置不同的定位精确度
  • 1.2.2 通过info.plist关闭精确定位权限的方法
  • 1.1 注意事项
  • 1.2 、控制授予APP的定位精度等级:根据不同的需求设置不同的定位精确度

  • II、 高德定位SDK适配:“模糊定位”权限下的兼容策略

  • 2.1、plist配置NSLocationTemporaryUsageDescriptionDictionary
  • 2.2、locationAccuracyMode设置为AMapLocationFullAndReduceAccuracy/AMapLocationFullAccuracy
  • 2. 3实现代理方法
  • 2.4 处理定位权限状态改变的回调函数


前言

image.png

iOS14新增了 精确定位 和 模糊定位 的概念,用户可以手动选择,模糊定位的误差约 500m 。可以根据实际功能判断是否可以接受用户选择模糊定位。

  • 在 iOS13 及以前,App 请求用户定位授权时为如下形态:一旦用户同意应用获取定位信息,当前应用就可以获取到用户的精确定位。

image.png

  • iOS14 新增用户大致位置选项可供用户选择(原因是大多数 App 实际上并不需要获取用户到用户最准确的定位信息。)

iOS14 授权弹窗新增的 Precise的开关默认会选中精确位置。用户通过这个开关可以进行更改,当把这个值设为 On 时,地图上会显示精确位置;切换为Off时,将显示用户的大致位置。

  • 对于对用户位置敏感度不高的 App 来说,这个似乎无影响,但是对于强依赖精确位置的 App 适配工作就显得非常重要了。

用户可以通过在 “隐私设置” 中设置来开启精确定位,但是若用户不愿意开启。这个时候,iOS14 在 CLLocationManager 新增两个方法用于向用户申请临时开启一次精确位置权限。

image.png

image.png

I、向用户申请临时开启一次精确位置权限:不同产品场景可以定义不同的purposeKey

申请的单次精准定位本次APP生命周期内有效,APP一个生命周期内可以多次申请。任何一次允许后则可正常获取精准定位。申请方式:需要在info.plist中配置NSLocationTemporaryUsageDescriptionDictionary

NSLocationTemporaryUsageDescriptionDictionary的value是字典;

其中中需要配置 key 和 value 表明使用位置的原因,以及具体的描述。

不同产品场景可以定义不同的purposeKey。

<key>NSLocationTemporaryUsageDescriptionDictionary</key>
 <dict>
 <key> purposeKey </key>
 <string>This app needs accurate location so it can verify that you're in a supported region. </string>
 <key> AnotherPurposeKey </key>
 <string>This app needs accurate location so it can show you relevant results.</string>
</dict>
  • 在需要的时候调用requestTemporaryFullAccuracyAuthorizationWithPurposeKey单独请求一次精确定位
//参数 purposeKey 是在 info.plist 中设置NSLocationTemporaryUsageDescriptionDictionary 字典时候的key `
    CLLocationManager *manager = [[CLLocationManager alloc] init];
    manager.desiredAccuracy = kCLLocationAccuracyBest;
//    通过字段判断可以明确当前用户开启的定位,如果是模糊定位
//    申请精准定位
    if (@available(iOS 14.0, *)) {
        // -1
        if(    manager.accuracyAuthorization == CLAccuracyAuthorizationReducedAccuracy){
            if (@available(iOS 14.0, *)) {
                [manager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"purposeKey4changeInfo" completion:^(NSError * _Nullable error) {
                    NSLog(@"%@", [NSString stringWithFormat:@"requestTemporaryFullAccuracyAuthorizationWithPurposeKey error%@",error]);
                }];
            } else {
                // Fallback on earlier versions
            }
        }
    } else {
        // Fallback on earlier versions
    }

这样app会获取到临时的精确位置权限直至下次冷启动。当然这个授权也可能被用户无情拒绝。

当然如果你使用第三方SDK进行定位的话,请升级版本即可

  • 效果

image.png

1.1 注意事项

  • 判断通过字段判断可以明确当前用户开启的定位,如果是模糊定位申请精准定位
  • purposeKey 注意是否包含空格,因为一旦包含了空格,你的代码没有加空格的话,是不会弹授权框的。

1.2 、控制授予APP的定位精度等级:根据不同的需求设置不同的定位精确度

1.2.1 通过API设置不同的定位精确度

kCLLocationAccuracyReduced是iOS14才支持的

*
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyBestForNavigation API_AVAILABLE(ios(4.0), macos(10.7));
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyBest;
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyKilometer;
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;
/*
 *  kCLLocationAccuracyReduced
 *
 *  Discussion:
 *    If you set your CLLocationManager's desiredAccuracy property to
 *    this value, locations delivered to your delegate in response to
 *    startUpdatingLocation or requestLocation will have their
 *    accuracy reduced.  The locations you receive will match the
 *    locations your app would have received if the user had decided
 *    not to grant your app authorization for precise location.
 */
CL_EXTERN const CLLocationAccuracy kCLLocationAccuracyReduced API_AVAILABLE(ios(14.0), macos(11.0), watchos(7.0), tvos(14.0));
locationManager = [[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyReduced;

1.2.2 通过info.plist关闭精确定位权限的方法

✎ 对于地理位置不敏感的App 来说,iOS14 也可以通过直接在 info.plist 中添加 NSLocationDefaultAccuracyReduced 为 true 默认请求大概位置。

设置之后,即使用户想要为该 App 开启精确定位权限,也无法开启。

  • 注意:当 App 在 Background 模式下,如果并未获得精确位置授权,那么 Beacon 及其他位置敏感功能都将受到限制。

II、 高德定位SDK适配:“模糊定位”权限下的兼容策略

pod 'AMapLocation', '2.6.7'

image.png

2.1、plist配置NSLocationTemporaryUsageDescriptionDictionary

<key>NSLocationTemporaryUsageDescriptionDictionary</key>
     <dict>
     <key>purposeKey4changeInfo</key>
     <string>此app需要精确的定位信息,以便于更好的为你服务. </string>
    </dict>

2.2、locationAccuracyMode设置为AMapLocationFullAndReduceAccuracy/AMapLocationFullAccuracy

if (@available(iOS 14.0, *)) {
        self.location.locationAccuracyMode = AMapLocationFullAndReduceAccuracy;
    } else {
        // Fallback on earlier versions
    }

2. 3实现代理方法

/**
 *  @brief 当plist配置NSLocationTemporaryUsageDescriptionDictionary且desiredAccuracyMode设置CLAccuracyAuthorizationFullAccuracy精确定位模式时,如果用户只授权模糊定位,会调用代理的此方法。此方法实现调用申请临时精确定位权限API即可:
 *  [manager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"PurposeKey" completion:^(NSError *error){
 *     if(completion){
 *        completion(error);
 *     }
 *  }]; (必须调用,不然无法正常获取临时精确定位权限)
 *  @param manager 定位 AMapLocationManager 类。
 *  @param locationManager 需要申请临时精确定位权限的locationManager。
 *  @param completion 临时精确定位权限API回调结果,error: 直接返回系统error即可。
 *  @since 2.6.7
 */
- (void)amapLocationManager:(AMapLocationManager *)manager doRequireTemporaryFullAccuracyAuth:(CLLocationManager*)locationManager completion:(void(^)(NSError *error))completion;
{
   if(@available(iOS 14.0,*)){
       [locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:@"purposeKey4changeInfo" completion:^(NSError * _Nullable error) {
          if(completion){
             completion(error);
          }
      }];
   }
}

2.4 处理定位权限状态改变的回调函数

  • 如果定位精度权限变更为精确的时候,再次更新定位信息
/**
 记录当前是否向用户申请临时开启一次精确位置权限,用于【如果定位精度权限变更为精确的时候,再次更新定位信息】
 */
@property (assign, nonatomic) BOOL isrequestTemporaryFullAccuracyAuthorizationWithPurposeKey;
/**
 存储获取定位信息的回调
 */
@property (nonatomic, copy) AMapLocatingCompletionBlock block;
/**
 *  @brief 定位权限状态改变时回调函数。注意:iOS14及之后版本回调
 *  @param manager 定位 AMapLocationManager 类。
 *  @param locationManager  定位CLLocationManager类,可通过locationManager.authorizationStatus获取定位权限,通过locationManager.accuracyAuthorization获取定位精度权限
 */
- (void)amapLocationManager:(AMapLocationManager *)manager locationManagerDidChangeAuthorization:(CLLocationManager*)locationManager{
    //
//    - 如果定位精度权限变更为精确的时候,再次更新定位信息
    if (@available(iOS 14.0, *)) {
        if(    locationManager.accuracyAuthorization == CLAccuracyAuthorizationFullAccuracy){
            if(       self.isrequestTemporaryFullAccuracyAuthorizationWithPurposeKey == YES){
                self.isrequestTemporaryFullAccuracyAuthorizationWithPurposeKey = NO;
                [self.location requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
                    [SVProgressHUD dismiss];
                    if(self.block){
                        self.block(location,regeocode,error);
                    }
                }];
            }
        }
    } else {
        // Fallback on earlier versions
    }
}
  • 效果

image.png

  • 定位SDK适配文档详情请见:

在iOS14之后的SDK新增的API

image.png

  • 高德
  • 百度iOS_14_beta版适配说明
-> Installing AMapLocation 2.6.7 (was 2.6.0)
 > Http download
   $ /usr/bin/curl -f -L -o /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/file.zip
   https://amappc.oss-cn-zhangjiakou.aliyuncs.com/lbs/static/zip/AMap_iOS_Loc_Lib_V2.6.7.zip --create-dirs --netrc-optional --retry 2
     % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
   100 2165k  100 2165k    0     0   553k      0  0:00:03  0:00:03 --:--:--  553k
   $ /usr/bin/unzip /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/file.zip -d /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su
   Archive:  /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/file.zip
      creating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/
     inflating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/AMapLocationKit  
      creating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/Headers/
     inflating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/Headers/AMapLocationKit.h  
     inflating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/Headers/AMapGeoFenceError.h  
     inflating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/Headers/AMapGeoFenceManager.h  
     inflating: /var/folders/6t/z1p2xgls4wz_pw36r58hhspr0000gn/T/d20200919-24852-1mkf6su/AMapLocationKit.framework/Headers/AMapLocationRegionObj.h


目录
相关文章
|
2月前
|
数据采集 监控 API
移动端性能监控探索:iOS RUM SDK 技术架构与实践
阿里云 RUM SDK 作为一款性能体验监控采集工具,可以作为辅助 App 运维的强有力助手,提升您的问题排查效率。
242 21
|
9月前
|
存储 人工智能 监控
大牛直播SDK在四足机器人和无人机巡检中的创新应用方案
在工业4.0和智能化浪潮下,传统巡检方式正经历深刻变革。四足机器人与无人机凭借灵活机动性和高效巡检能力崭露头角,而大牛直播SDK则赋予其实时直播与智能互动功能。本文介绍大牛直播SDK的核心优势、在四足机器人和无人机巡检中的应用方案,以及技术实现要点和未来展望,展示智能巡检的广阔前景。
294 6
|
开发工具 iOS开发 计算机视觉
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
382 11
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
iOS Objective-C 应用连接Azure Storage时,若不关闭账号的匿名访问,程序能正常运行。但关闭匿名访问后,上传到容器时会出现错误:“Public access is not permitted”。解决方法是将创建容器时的公共访问类型从`AZSContainerPublicAccessTypeContainer`改为`AZSContainerPublicAccessTypeOff`,以确保通过授权请求访问。
226 0
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
152 0
|
开发工具 数据安全/隐私保护 Python
【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
【Azure 环境】通过Python SDK收集所有订阅简略信息,例如订阅id 名称, 资源组及组内资源信息等,如何给Python应用赋予相应的权限才能获取到信息呢?
144 0
|
Linux 调度 开发工具
云桌面系统镜像文件快速分发方案分享SDK
为了解决云桌面环境下批量升级系统镜像的效率问题,传统的1对多FTP/HTTP方式因服务器带宽限制导致传输慢。一种基于优化的Bittorrent协议的P2P解决方案被提出,利用P2P技术将文件切块并让终端互相分享,提高下载速度,尤其适合大文件如256GB分区镜像的分发。通过自定义IO接口、跳过校验、超大分块、多分块支持及局域网自建Tracker等功能,实现更快的传输和镜像更新,适用于系统镜像、游戏更新等领域。该方案已广泛应用于各行业,可根据不同场景定制优化。
288 1
|
开发工具 图形学 iOS开发
Unity与IOS⭐Unity接入IOS SDK的流程图
Unity与IOS⭐Unity接入IOS SDK的流程图
|
存储 开发工具
通用快照方案问题之快照SDK的安装如何解决
通用快照方案问题之快照SDK的安装如何解决
127 0