写点什么

贝壳 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:134342

评论

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

week1--作业一

hero_genlot

极客大学架构师训练营

第二周课后练习

jizhi7

架构师训练营第二周课程笔记及心得

Airs

看动画学算法之:排序-基数排序

程序那些事

算法 数据结构和算法 看动画学算法 算法和数据结构

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

发酵的死神

极客大学架构师训练营

Serverless 简介

木易杨

云计算 Serverless AWS

架构师训练营第二周学习总结

成长者

极客大学架构师训练营

依赖倒置原则和接口隔离原则练习

知行合一

第二周 框架设计作业

钟杰

极客大学架构师训练营

TensorFlow 篇 | TensorFlow 2.x 基于 Keras 的多节点分布式训练

Alex

tensorflow keras 分布式训练 AllReduce

架构师训练营 - 第二周总结

一个节点

极客大学架构师训练营

第二周 框架学习-作业

刘希文

架构师01期,第二周课后作业

子文

架构一期第二周作业

Airs

架构师训练营,第二周总结

子文

举办线下活动现场管理需要注意哪些事项?

boshi

管理 探索与实践 活动专区

Spring 5 中文解析数据存储篇-JDBC数据存储(上)

青年IT男

Spring5

训练营第二周作业1

Yangjing

极客大学架构师训练营

架构师训练营第二周作业

吴传禹

极客大学架构师训练营

架构师训练营第 1 期 - 第二周学习总结

Anyou Liu

极客大学架构师训练营

回首挑灯看剑谱 - Week2 - 学习总结

小粽

第二周总结

Geek_ac4080

开源推荐:国内3大主流前端UI表单设计器,千万不要让领导知道

互联网应用架构

Vue Element antd

Mac mini 2020上手体验

Lin

Mac

架构师训练营学习总结——第二周

文智

极客大学架构师训练营

SOLID原则

架构师训练营-第二周作业

一个节点

极客大学架构师训练营

荷之美 | 中国荷苑

xcbeyond

生活 摄影 摄影征文 荷花

架构师训练营第二周学习感悟

吴传禹

极客大学架构师训练营

架构师训练营第 1 期 -- 第二周学习总结

发酵的死神

极客大学架构师训练营

极客大学架构师训练营第二周课后总结

jizhi7

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