作者:MuMu,iOS 开发者,目前就职于抖音

Session:https://developer.apple.com/videos/play/wwdc2020/10641/


iOS开发 设置项目最低适配_docker

在数字信息时代,用户隐私已经不断被资产化,并且通过商业运作全然成为了一种牟利的手段。苹果在用户隐私保护方面一直走在前列,通过本篇文章,你将了解到 WWDC 2020 苹果在用户相册隐私保护上所做的改进以及作为开发者应该如何去适配。

Limited Photo Access

苹果经过大量调研,发现多数用户有成百上千的图片资源,大部分情况下用户是不希望 APP 能访问到相册内全部的资源的。为了能够让用户更加精细的控制相册资源的访问,所以 iOS 14 相册权限增加了 Limited Photo 模式



iOS开发 设置项目最低适配_docker_02

在 iOS 13 以及以前,APP 可以通过 PhotoKit API 访问到用户所有的资源,可以随意的读取或者写入用户的资源数据库,这种模式称为 Full Photo Library Access。



iOS开发 设置项目最低适配_java_03

Limited Photo 模式下,APP 只能访问到用户允许的相册资源,可以理解为这种模式是在 PhotoKit 中添加了一个过滤层,通过这个过滤层,我们只能访问到用户允许的相册资源。一旦用户修改了允许访问的资源,APP 需要监听到修改并且更新资源列表。Limited Photo 模式自动在 iOS 14 上生效,也就是说已经发布的 APP 也会受影响

权限弹窗变化



iOS开发 设置项目最低适配_docker_04

iOS 14 权限弹窗分为三个选项:

  • Select Photo: 限制访问,点击之后会弹出系统的图片选择界面选择资源,APP 只能访问用户选择的资源。
  • Allow Access to All Photos: 可以访问所有的资源。
  • Don't Allow: 不允许访问资源。

Select Photo 即为 iOS 14 新增加的 Limit Photo 模式,选择了此模式之后,APP 只能访问用户允许的资源。

修改选中的资源

用户在第一次选择了 Limited Photo 模式 后,会弹出系统图片选择界面允许用户选择允许访问的资源,后续有两种方式来修改用户选择的资源:

第一种方式是在冷启 APP 首次使用 PhotoKit 访问资源的时候会默认弹出选择图片弹窗:



iOS开发 设置项目最低适配_java_05

第二种方式是在应用设置->Photos->Edit Selected Photos中修改:



iOS开发 设置项目最低适配_docker_06

PhotoKit API 变化

权限申请



iOS开发 设置项目最低适配_java_07

权限部分 API 的修改主要分为三个部分:

  • 第一部分是支持 Limited Photo 模式状态,PHAuthorizationStatus 增加新的枚举 limited 代表用户选择的是 Limited Photo 模式
  • 第二部分是细分了相册访问方式,分为 addOnly 方式和 readWrite 方式,对应枚举类型为 PHAccessLevel

iOS开发 设置项目最低适配_java_08

  • 第三部分是新增了资源申请和获取的 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:



iOS开发 设置项目最低适配_docker_09

调起选择图片控件后显示如下:



iOS开发 设置项目最低适配_java_10

PHPicker UI 是固定的,如果需要定制 UI,建议还是自行调用 PhotoKit 实现图片选择器。

只写权限

只写权限是指 APP 只允许写入相册。只写权限的弹窗比读取权限简洁,只有允许和不允许的选项,使用一个 Demo 来验证一下:

首先需要在 Info.plist 下配置权限信息:



iOS开发 设置项目最低适配_iOS开发 设置项目最低适配_11

  • NSPhotoLibraryAddUsageDescription: 用户存入相册时的提示信息。
  • NSPhotoLibraryUsageDescription: 相册访问权限信息,必须有此项,不然访问相册的时候 APP 会 Crash。

分别使用 AssetsLibraryPhotoKit 以及 UIKit 层 UIImageWriteToSavedPhotosAlbum(:::) 写入相册:



iOS开发 设置项目最低适配_iOS开发 设置项目最低适配_12

很容易发现使用 AssetsLibrary 弹出来的是 Access 的权限,并不是苹果声称的独立弹窗,并且点击 选择照片 后没有弹出系统弹窗选择图片,但是能够正常写入相册。PhotoKit 与 UIKit 的实现符合预期。

读写权限

读写权限相对于只写权限只是增加了读权限,权限配置与只写权限一致,这里就不赘述了。同样分别使用 AssetsLibraryPhotoKit 来读取相册资源,两者权限弹窗表现一致:



iOS开发 设置项目最低适配_java_13

选择 Limited Photo 模式,PhotoKit 访问正常,AssetsLibrary 访问相册出错,猜测苹果并未适配 AssetsLibrary



iOS开发 设置项目最低适配_iOS开发 设置项目最低适配_14

报错信息如下:



iOS开发 设置项目最低适配_编程语言_15

选择 Full Photo 模式,两者表现一致。

AssetsLibrary 适配

从上一节来看,AssetsLibrary 在读写权限上面都存在问题,苹果似乎已经放弃维护 AssetsLibrary 了,所以建议还在使用 AssetsLibrary 管理资源的尽快迁移到 PhotoKit

一些不可忽略的细节

在用户选择了 Limited Photo 模式时,绝大多数的 API 的表现都与 Full Photo 模式一致,但是有少数的几个 API 需要注意一下:



iOS开发 设置项目最低适配_iOS开发 设置项目最低适配_16

  1. 使用 PHAssetCreationRequests 来创建的资源默认是会添加在用户允许的集合当中
  2. 不能获取以及创建相册
  3. 不能访问用户 iCloud 共享的相册

隐藏系统自动弹出的选择图片弹窗

当用户选择 Limited Photo 模式时,APP 在每次冷启第一次访问 PhotoKit 的时候,系统会自动弹出一个选择资源的弹窗:



iOS开发 设置项目最低适配_编程语言_17

这种交互模式对于用户来说相当不友好,官方建议关闭自动弹窗。比较理想的交互方式在用户选择了 Limited Photo 模式时,在特定界面(例如设置页)显示修改资源的入口,当用户主动点击该入口时弹出系统弹窗。

首先我们需要关闭系统自动弹窗:在 Info.plist 文件中添加新键 PHPhotoLibraryPreventAutomaticLimitedAccessAlert,设置其值为 YES:



iOS开发 设置项目最低适配_java_18

在用户点击修改资源入口时调用 PhotoKit API 弹出选择资源界面:



iOS开发 设置项目最低适配_iOS开发 设置项目最低适配_19


程序员专栏 扫码关注填加客服 长按识别下方二维码进群