速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

  • 2020-10-26
  • 本文字数:4634 字

    阅读完需:约 15 分钟

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

评论

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

学习笔记4

Qx

Java中CAS原理分析(volatile和synchronized浅析)

叫练

volatile 多线程 synchronized CAS JUC

Eclipse Vert.x 4发布

dinstone

Java Reactive Vert.x

以太公约系统开发详情丨以太公约源码案例

系统开发咨询1357O98O718

以太公约系统开发介绍

阿里P8大佬带你全面了解—MySQL锁:03.InnoDB行锁

比伯

Java MySQL 编程 架构 程序人生

第八周课后练习

jizhi7

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

李循律

极客大学架构师训练营

架构之书:传道与《设计模式》

lidaobing

架构 设计模式

Java并发编程:任务执行器Executor接口

码农架构

Java并发

第八周-总结

jizhi7

话题讨论 | 作为程序员你的业余爱好是什么呢?

小天同学

话题讨论 业余爱好

双十二好物推荐:「mPaaS 安全加固」带你看看别人家的应用

蚂蚁集团移动开发平台 mPaaS

安全 mPaaS 应用

学习笔记-week12

张荣召

GaussDB(DWS)磁盘维护:vacuum full执行慢怎么办?

华为云开发者联盟

数据库 数据 DWS

API研发效能提升实战

Geek_40a463

研发效能 API研发

区块链技术在旅游业中的应用探索

CECBC

旅游

Python最会变魔术的魔术方法,我觉得是它!

Python猫

shell脚本的使用该熟练起来了,你说呢?(篇四)

良知犹存

shell脚本编写

你心目中高级程序员的印象是什么样子的?

Java架构师迁哥

无可限量的数字经济

CECBC

数字经济

mongodb 源码实现系列 - mongodb详细表级操作及详细时延统计实现原理(快速定位表级时延抖动)

杨亚洲(专注MongoDB及高性能中间件)

数据库 mongodb 性能调优 源码刨析 分布式数据库mongodb

DolphinDB与Aliyun HybridDB for PostgreSQL在金融数据集上的比较

DolphinDB

postgresql 阿里云 时序数据库 DolphinDB 数据库开发

英特尔唐炯:36.4% PC同比增长,预示了2021是个好年

E科讯

年轻程序员不讲武德,做表竟然拖拉拽

雯雯写代码

程序员

排查指南 | 关于 mPaaS-iOS 小程序打不开问题的解决方案

蚂蚁集团移动开发平台 mPaaS

小程序 mPaaS

架构探索:事务处理三

而立斋

12.2分布式文件系统

张荣召

12.1大数据技术发展史

张荣召

第五周作业第1题

走走,停停……

架构探索:事务处理二

而立斋

架构探索:事务处理总结

而立斋

贝壳APP iOS14权限管理适配总结_安全_李星谣_InfoQ精选文章