Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者:MuMu,iOS 开发者,目前就职于抖音
Session:https://developer.apple.com/videos/play/wwdc2020/10641/
在数字信息时代,用户隐私已经不断被资产化,并且通过商业运作全然成为了一种牟利的手段。苹果在用户隐私保护方面一直走在前列,通过本篇文章,你将了解到 WWDC 2020 苹果在用户相册隐私保护上所做的改进以及作为开发者应该如何去适配。
苹果经过大量调研,发现多数用户有成百上千的图片资源,大部分情况下用户是不希望 APP 能访问到相册内全部的资源的。为了能够让用户更加精细的控制相册资源的访问,所以 iOS 14 相册权限增加了 Limited Photo 模式
。
在 iOS 13 以及以前,APP 可以通过 PhotoKit API 访问到用户所有的资源,可以随意的读取或者写入用户的资源数据库,这种模式称为 Full Photo Library Access。
在 Limited Photo 模式
下,APP 只能访问到用户允许的相册资源,可以理解为这种模式是在 PhotoKit 中添加了一个过滤层,通过这个过滤层,我们只能访问到用户允许的相册资源。一旦用户修改了允许访问的资源,APP 需要监听到修改并且更新资源列表。Limited Photo 模式自动在 iOS 14 上生效,也就是说已经发布的 APP 也会受影响。
iOS 14 权限弹窗分为三个选项:
Select Photo: 限制访问,点击之后会弹出系统的图片选择界面选择资源,APP 只能访问用户选择的资源。
Allow Access to All Photos: 可以访问所有的资源。
Don't Allow: 不允许访问资源。
Select Photo 即为 iOS 14 新增加的 Limit Photo 模式
,选择了此模式之后,APP 只能访问用户允许的资源。
用户在第一次选择了 Limited Photo 模式
后,会弹出系统图片选择界面允许用户选择允许访问的资源,后续有两种方式来修改用户选择的资源:
第一种方式是在冷启 APP 首次使用 PhotoKit 访问资源的时候会默认弹出选择图片弹窗:
第二种方式是在应用设置->Photos->Edit Selected Photos
中修改:
权限部分 API 的修改主要分为三个部分:
第一部分是支持 Limited Photo 模式
状态,PHAuthorizationStatus
增加新的枚举 limited
代表用户选择的是 Limited Photo 模式
。
第二部分是细分了相册访问方式,分为 addOnly
方式和 readWrite
方式,对应枚举类型为 PHAccessLevel
。
第三部分是新增了资源申请和获取的 API,并且将老的资源申请 API 标为废弃,老的方法没有适配 Limited Photo
模式,如果选择的是 Limited Photo 模式
老的 API 返回的仍然是 authorized
。
苹果强推此次权限改动同时希望开发者们能够反思他们的 APP 是否真的需要那么多的相册权限,遵循使用最少的权限来实现功能,保护用户的隐私不被侵害应该是每个开发者应该承担的责任。
iOS 14 的相册资源访问方式细分为了
writeOnly
以及readWrite
方式,作为开发者需要重新审查项目需要的权限。
细心的同学可能会发现苹果并未提供 readOnly
权限,对于只需要读取图片资源类的 APP,苹果建议是使用 iOS 14 提供的图片选择器 PHPicker 来选择图片资源(iOS 14 以下对应 UIImagePickerController)。PHPicker 有很多优点:
PHPicker 是独立进程,不影响 APP 的性能表现
PHPicker 不需要用户授予权限就可以选择用户所有的资源
PHPicker 支持多选
以下是一个简单的 Demo:
调起选择图片控件后显示如下:
PHPicker UI 是固定的,如果需要定制 UI,建议还是自行调用 PhotoKit 实现图片选择器。
只写权限是指 APP 只允许写入相册。只写权限的弹窗比读取权限简洁,只有允许和不允许的选项,使用一个 Demo 来验证一下:
首先需要在 Info.plist 下配置权限信息:
NSPhotoLibraryAddUsageDescription
: 用户存入相册时的提示信息。
NSPhotoLibraryUsageDescription
: 相册访问权限信息,必须有此项,不然访问相册的时候 APP 会 Crash。
分别使用 AssetsLibrary
、PhotoKit
以及 UIKit 层 UIImageWriteToSavedPhotosAlbum(:::)
写入相册:
很容易发现使用 AssetsLibrary
弹出来的是 Access 的权限,并不是苹果声称的独立弹窗,并且点击 选择照片
后没有弹出系统弹窗选择图片,但是能够正常写入相册。PhotoKit 与 UIKit 的实现符合预期。
读写权限相对于只写权限只是增加了读权限,权限配置与只写权限一致,这里就不赘述了。同样分别使用 AssetsLibrary
和 PhotoKit
来读取相册资源,两者权限弹窗表现一致:
选择 Limited Photo
模式,PhotoKit
访问正常,AssetsLibrary
访问相册出错,猜测苹果并未适配 AssetsLibrary
:
报错信息如下:
选择 Full Photo
模式,两者表现一致。
从上一节来看,AssetsLibrary
在读写权限上面都存在问题,苹果似乎已经放弃维护 AssetsLibrary
了,所以建议还在使用 AssetsLibrary
管理资源的尽快迁移到 PhotoKit
。
在用户选择了 Limited Photo
模式时,绝大多数的 API 的表现都与 Full Photo
模式一致,但是有少数的几个 API 需要注意一下:
使用 PHAssetCreationRequests 来创建的资源默认是会添加在用户允许的集合当中
不能获取以及创建相册
不能访问用户 iCloud 共享的相册
当用户选择 Limited Photo
模式时,APP 在每次冷启第一次访问 PhotoKit 的时候,系统会自动弹出一个选择资源的弹窗:
这种交互模式对于用户来说相当不友好,官方建议关闭自动弹窗。比较理想的交互方式在用户选择了 Limited Photo
模式时,在特定界面(例如设置页)显示修改资源的入口,当用户主动点击该入口时弹出系统弹窗。
首先我们需要关闭系统自动弹窗:在 Info.plist 文件中添加新键 PHPhotoLibraryPreventAutomaticLimitedAccessAlert
,设置其值为 YES:
在用户点击修改资源入口时调用 PhotoKit API 弹出选择资源界面:
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
刚刚用鸿蒙跑了个“hello world”!
裸辞1天 vs 裸辞10天 vs 裸辞一个月
分布式id生成策略,我和面试官扯了一个半小时
Python中浅拷贝与深拷贝的骚操作
在看点这里好文分享给更多人↓↓