贝壳APP iOS14权限管理适配总结

2020 年 10 月 26 日

贝壳APP iOS14权限管理适配总结

WWDC 2020 发布会上苹果向我们展示了新的 iOS14 系统。iOS14 的适配,很重要的一环就集中在用户隐私和安全方面。


本文将详细介绍 iOS14 上对于隐私授权的变更和部分适配方案。


1 相册


1.1 相册读取范围控制


相册是用户最私密的信息之一,可读取 & 不可读取这种简单粗暴的方式已经不能满足日常的使用需求。例如,我的相册里存了一张可爱的卡通图,当我使用某个新的 APP 想要设置头像时,但我只想要 APP 只能读取这一张图,而无法读取其他的图片,当前可不大好解决。于是苹果为相册读取提供了更细致的管控,可以允许 APP 仅读取选中的照片,这样能够很好的控制私密照片不被陌生应用读取,进一步保护隐私。


1.2 iOS14 相册适配点


iOS14 新增了“Limited Photo Library Access”模式,在授权弹窗中增加了 Select Photo 选项。用户可以在 App 请求调用相册时选择部分照片让 App 读取。


iOS14 中当用户选择 PHAuthorizationStatusLimited 时,如果未进行适配,有可能会在每次触发相册功能时都进行弹窗询问用户是否需要修改照片权限。对于这种情况可通过在 Info.plist 中设置“PHPhotoLibraryPreventAutomaticLimitedAccessAlert” 的值为 YES 来阻止该弹窗反复弹出,并且可通过下面这个 API 来主动控制何时弹出 PHPickerViewController 进行照片选择。


[[PHPhotoLibrary sharedPhotoLibrary] presentLimitedLibraryPickerFromViewController:self];
复制代码


1.3 PHPicker


在 iOS14 中官方推荐使用 PHPicker 来替代原 API 进行图片选择。PHPicker 为独立进程,会在视图最顶层进行展示,应用内无法对其进行截图也无法直接访问到其内的数据。


(1)UIImagePickerController 转移到 PHPickerViewController, UIImagePickerViewController 功能受限,每次只能选择一张图片,将逐渐被废弃。



(2)功能:PHPicker 支持多选,支持搜索,支持按 image, video, livePhotos 等进行选择。



(3)PHPicker API 指导



(4)PHPicker 用法示例


 - (IBAction)button:(id)sender {      PHPickerConfiguration *configuration = [[PHPickerConfiguration alloc] init];      configuration.filter = [PHPickerFilter videosFilter]; // 可配置查询用户相册中文件的类型,支持三种    configuration.selectionLimit = 0; // 默认为1,为0时表示可多选。      PHPickerViewController *pickerVc = [[PHPickerViewController alloc] initWithConfiguration:configuration];      pickerVc.delegate = self;      // pickerVc,在选完图片后需要在回调中手动 dismiss    [self presentViewController:picker animated:YES completion:^{
}]; }
复制代码


  #pragma mark - Delegate
- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results { [picker dismissViewControllerAnimated:YES completion:nil]; if (!results || !results.count) { return; } NSItemProvider *itemProvider = results.firstObject.itemProvider; if ([itemProvider canLoadObjectOfClass:UIImage.class]) { __weak typeof(self) weakSelf = self; [itemProvider loadObjectOfClass:UIImage.class completionHandler:^(__kindof id<NSItemProviderReading> _Nullable object, NSError * _Nullable error) { if ([object isKindOfClass:UIImage.class]) { __strong typeof(self) strongSelf = weakSelf; dispatch_async(dispatch_get_main_queue(), ^{ strongSelf.imageView.image = (UIImage *)object; }); } }]; } }
复制代码


在 limit Photo 模式下,AssetsLibrary 访问相册会失败;在 writeOnly 模式下,AssetLibrary 也会有显示问题。建议还在使用 AssetsLibrary 的同学尽快迁移到新 API。


授权相关:旧 API 废弃,增加 PHAccessLevel 参数。如果再使用以前的 API 来获取权限状态, PHAuthorizationStatusLimited 状态下也会返回 PHAuthorizationStatusAuthorized。


2 相机和麦克风


2.1 相机和麦克风调用监控


当应用使用摄像头和麦克风的时,一个小点会出现在状态栏中 WIFI 和蜂窝信号条上方。当应用使用摄像头时,这个点是绿色的,当使用麦克风时,这个点是橙色的.



如果用户使用摄像头或麦克风关闭应用,打开控制中心,会看到一个摄像头或麦克风图标,以及最近哪个应用在使用这项功能。录像指示灯可以防止后台的应用在用户不知情的情况下访问摄像头或麦克风,确保应用没有偷偷录下用户的对话或视频。



2.2 触发相机和麦克风监控的代码实现


// 会触发录音小黄点的代码示例:
AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:recorderPath settings:nil error:nil];
[recorder record];

// 触发相机小绿点的代码示例:
AVCaptureDeviceInput *videoInput = [[AVCaptureDeviceInput alloc] initWithDevice:videoCaptureDevice error:nil];
AVCaptureSession *session = [[AVCaptureSession alloc] init];if ([session canAddInput:videoInput]) {
[session addInput:videoInput];
}
[session startRunning];
复制代码


3 定位


3.1 模糊定位


目前的终端系统可以控制是否授予 APP 获取定位权限,而在新版的 iOS 14/iPadOS 14 中,位置信息进行了更细致的管控。在设置中关闭 APP 的「精确位置」,可以只允许 APP 仅仅获取用户大致的地理位置。



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



3.2 获取精确定位


对于对用户位置敏感度不高的 App 来说,这个似乎无影响,但是对于强依赖精确位置的 App 适配工作就显得非常重要了。可以通过用户在 “隐私设置” 中设置来开启精确定位,但是可能用户宁可放弃使用这个应用也不愿意开启。iOS14 在 CLLocationManager 新增两个方法可用于向用户申请临时开启一次精确位置权限。



使用方法需要首先在 Info.plist 中配置“NSLocationTemporaryUsageDescriptionDictionary”字典中需要配置 key 和 value 表明使用位置的原因,以及具体的描述。



3.3 新增权限 API


废弃旧的权限状态回调函数,在 CLLocationManagerDelegate 新增回调方法, 新方法在精度和频率权限发生变化时,都会回调。



废弃旧的权限状态类方法,新增实例属性去获取当前的权限状态:



4 Local Network



4.1 什么是 Local Network


苹果所谓的“本地网络”其实就是我们常说的局域网,不同的电脑、iPhone、iPad、Apple Watch 等电子产品通过同一个网络连接在一起时,就组成了一个本地网络。“本地网络”虽然带有“网络”两个字,但是关闭并不等于禁用互联网,因此很多应用都不会受到影响。


4.2 Local Network iOS14 前后对比


在 iOS14 发布之前,应用可以通过本地网络扫描到其他设备,以此来获取你的定位、设备使用情况等个人信息,可以说这是很多应用厂商获取用户数据的一个重要渠道。而 iOS 14 上的“本地网络”权限,就等于在局域网上加了一把锁,当我们关闭该权限时,应用就无法偷偷扫描用户所在局域网的其他电子设备了。不过,也有一些应用需要借助本地网络才能够实现相应的功能,如 iPhone 连接电视投屏、智能家居、监控摄像头,网络打印机等,因此当这些应用申请权限时,我们可以选择使用时开启“本地网络”权限,以免影响日常生活体验。


4.3 Local Network iOS14 新特性


iOS14 当 App 要使用 Bonjour 服务时或者访问本地局域网,使用 mDNS 服务等,都需要授权,开发者需要在 Info.plist 中详细描述使用的为哪种服务以及用途。下图为需要无需申请权限与需要授权的服务:



如果应用中需要使用 LocalNetwork 需要在 Info.plist 中配置两个选项,详细描述为什么需要使用该权限,以及需要列出具体使用 LocalNetwork 的服务列表。



5 Wi-Fi Address


iOS8 - iOS13 ,用户在不同的网络间切换和接入时,mac 地址都不会改变,这也就使得网络运营商还是可以通过 mac 地址对用户进行匹配和用户信息收集,生成完整的用户信息。iOS14 提供 Wifi 加密服务,每次接入不同的 WiFi 使用的 mac 地址都不同。



并且可以手动设置私有 Wi-Fi 地址,且连接的每个 Wi-Fi 网络都有不同的地址、不和设备绑定、每天生成不同的地址。



6 IDFA


IDFA 全称为 Identity for Advertisers ,即广告标识符。用来标记用户,目前最广泛的用途是用于投放广告、个性化推荐等。在 iOS13 及以前,系统会默认为用户开启允许追踪设置,我们可以简单的通过代码来获取到用户的 IDFA 标识符。


if ([[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]) {
NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
NSLog(@"%@", idfaString);
}
复制代码


在 iOS14 中,这个判断用户是否允许被追踪的方法已经废弃。



并且广告追踪权限已经默认关闭,这就意味着 App 将无法在用户不知情的情况下获取到 IDFA,而需要进行申请。同其他常见权限类似,需要在 Info.plist 中配置" NSUserTrackingUsageDescription " 及描述文案,接着使用 AppTrackingTransparency 框架中的 ATTrackingManager 中的 requestTrackingAuthorizationWithCompletionHandler 请求用户权限,在用户授权后再去访问 IDFA 才能够获取到正确信息。


#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)testIDFA {
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
NSString *idfaString = [[ASIdentifierManager sharedManager] advertisingIdentifier].UUIDString;
}
}];
} else {
// iOS 13 现有方法
}
}
复制代码


7 剪贴板


在 iOS14 中,当应用访问剪贴板时,苹果会用一个小横幅通知用户剪贴板被复制了。这是为了防止应用滥用它们对于剪贴板的访问权限。



弹出提示的原因是使用 UIPasteboard 访问用户数据,访问以下数据都会弹出 toast 提示。



应用访问剪切板仅仅用于判断是否为 URL 格式,iOS14 新增了两个 API 可以用于规避该提示。如果应用想直接访问剪切板的数据,暂时可能无法做到规避该提示。iOS14 新增两种 UIPasteboardDetectionPattern 如下图:



上图的两个 API 可用于规避提示,但只能用于判断剪切板中是否有 URL,并不是真正的访问剪贴板数据,也拿不到剪切板的真实数据。下面两个 API 可以获得具体的 URL 信息,但是会触发剪切板提示。并且实测当用户剪切板中包含多个 URL 时只会返回第一个。



8 总结


这次 iOS14 的隐私权限大升级和新尝试,体现了苹果对于用户隐私的尊重。


  • 数据最小化:苹果自己或者其他人获得的私人数据最小化

  • 设备端智能技术:尽可能本地处理用户信息

  • 安全保护:技术手段对数据安全的保护

  • 透明度和管控:帮助用户理解被收集的数据,让用户自己选择该如何使用该数据。


这四条核心隐私原则,是苹果一直在强调的,而且也看到真正付诸了实践。


参考文献:



本文转载自公众号贝壳产品技术(ID:beikeTC)。


原文链接


贝壳APP iOS14权限管理适配总结


2020 年 10 月 26 日 10:132563

评论

发布
暂无评论
发现更多内容

一个数据中台如何算成功了?

薄荷点点

数据中台

重大活动网络攻击面前,京东智联云的攻防之道

京东智联云开发者

云计算 网络安全 云安全

虽然世界给我们变化,但让我们的人生更向幸福靠近一点点,而入门票就是自学这回事

叶小鍵

面试重灾区——Synchronized深度解析

花火

并发编程 synchronized 内存布局 CAS 锁升级

《Java程序员修炼之道》.pdf

田维常

详解快速开发平台与工作流通用组件的设计规范

Philips

敏捷开发 快速开发 企业应用

数字信封加密

踉踉跄跄走江湖

【架构师训练营 1 期】第八周学习总结

诺乐

浅谈软件研发管理体系建设

大黄蜂

将减少阻力的香蕉法则,运用在软件开发上会产生什么效果?

Philips

敏捷开发 快速开发 企业应用

分布式集群如何实现高效的数据分布

vivo互联网技术

分布式 DHT hash 数据存储

面对大促DevOps怎么做?这里有一份京东11.11 DevOps备战指南

京东智联云开发者

云计算 DevOps 运维自动化

不可思议,竟然还有人不会查看GC垃圾回收日志?

田维常

垃圾回收 GC

BATJTMD,大厂招聘,都招什么样Java程序员?

小傅哥

Java 互联网 面试 小傅哥 简历

关于mysqldump,这个参数你可能还不知道

Simon

MySQL mysqldump timestamp

熔断原理与实现Golang版

Kevin Wan

go microservice

charles的使用方法

Yolanda_trying

HTTP 前世今生

大导演

HTTP 前端进阶训练营

找出两个链表中合并的元素

架构师训练营第 1 期第 8 周作业

du tiezheng

架构师训练营第 1 期

互联网应用架构目标及技术方案

第八周作业

springboot+java+redis 简单实用的搜索栏热搜,个人历史记录,文字过滤

灰尘子

SpringBoot中的响应式web应用

程序那些事

spring WebFlux 程序那些事 响应式系统 spring 5

【架构师训练营 1 期】第八周作业

诺乐

极客大学 - 架构师训练营 第九周

9527

线程池 ThreadPoolExecutor 原理及源码笔记

程序员小航

Java 源码 jdk 线程池 并发

极客大学 - 架构师训练营 第九周作业

9527

直播预告 | 云原生在CloudQuery中的应用与实践

CloudQuery社区

数据库 sql 容器 云原生 工具软件

第八周总结

京东11.11完美收官!京东智联云以技术服务助力实体经济

京东智联云开发者

云计算 大数据 云安全

贝壳APP iOS14权限管理适配总结-InfoQ