二.PhotoKit - 相册权限(彻底读懂权限管理)
引言
用户的照片和视频算是用户最私密的数据之一,由于内置的隐私保护功能,APP只有在用户明确授权的前提下才能访问用户的照片库。从iOS14 开始,PhotoKit进一步增强了用户的隐私控制,用户可以选择指定的照片或者视频资源的访问权限提供给APP。
下面我们就来详细的探讨一下使用用户照片或视频资源时该如何进行权限的申请和管理。
相册权限
首先我们需要确定自己应用需要使用的功能,如果只是选择图片或者视频那么可能并不需要我们明确的来请求相册权限,系统会帮助我们完成这一点。
而如果需要更高级别的功能,那么我们则不得不明确授权APP来访问这些功能。
PHPickerViewController权限
PHPickerViewController我们已经使用过了,它是代替UIImagePickerController新的用户媒体资源选择器,支持搜索,多选照片和视频,并提供路程的内容缩放功能。
最主要的一点是由于它是系统在单独的进程中管理其生命周期,因此默认情况下它是私有的。用户在使用它选择照片或者视频时无需明确授权,这无疑改善了用户与应用交互是的整体体验,几乎所有的用户都会对授权的弹窗持谨慎和怀疑的态度。
@objc func showPhotoPicker() {var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())configuration.selectionLimit = 9let photoPicker = PHPickerViewController(configuration: configuration)photoPicker.delegate = selfself.present(photoPicker, animated: true, completion: nil)}func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {picker.dismiss(animated: true, completion: nil)}
无需任何权限相关的申请即可调起照片和视频的选择列表:

高级功能的权限
权限描述
如果我们的应用需要使用PhotoKit提供的其它高级功能,比如检索资源,更新图库,创建相册等等,那么应用必须需要得到用户的明确授权才可以访问这些功能。
我们需要提供一句文案用来描述我们的APP需要访问这些权限来做什么。当开始申请权限时系统的权限申请弹窗中会将这条文案展示给用户。
如果APP访问了这些权限而没有添加任何说明那么在请求权限时将会崩溃。
针对不同的功能我们需要在info.plist的文件中添加相应的key来说明你的应用程序为什么需要使用这些权限。
NSPhotoLibraryAddUsageDescription:如果我们的APP只需要添加内容到照片库,比如保存照片或者视频,而不需要读取,那么我们只需要添加这个键,并解释原因。
NSPhotoLibraryUsageDescription:如果我们的APP需要读取和写入照片库。比如查看照片, 选择照片,选择照片,删除照片,那么我们就需要在Info.plist文件中添加这个键,并且向用户解释为什么我们的应用程序需要这些权限。
如果我们有需要读取,又需要添加俺么info.pist文件看起来可能是这样:
<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的照片库以便选择和分享图片。</string><key>NSPhotoLibraryAddUsageDescription</key>
<string>我们需要将图片保存到您的照片库。</string>

请求授权
使用PHPhotoLibrary来检查APP的当前授权状态,可以根据权限类型来获取指定权限的状态。
let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)
上述代码会返回一个PHAuthorizationStatus的值,它表示应用针对指定授权的状态。
PHAuthorizationStatus.notDetermined标识用户从没有进行过授权页面的选项选择。
当我们的APP首次进行权限访问时,系统会自动弹出一个提示弹窗来提示用户授权,弹窗内的文案就是我们在对应的key中设置的描述文案。
请求用户权限最合理的时机就是当用户将要使用相册相关功能时再进行请求,这样可以让用户更好地了解我们为什么需要请求访问这个权限。
我们还可以通过编写代码的方式来请求授权,这样,我们就可以控制提示的时间并且确定用户的响应结果。
/// 查看并获取相册权限/// - Parameter completion: 回调func requestPhotoLibraryAuthorization(completion: @escaping (Bool) -> Void) {PHPhotoLibrary.requestAuthorization(for: .readWrite) { status inswitch status {case .notDetermined:// 用户尚未确定此应用程序的访问权限。completion(false)case .restricted:// 系统限制了此应用程序的访问权限。completion(false)case .denied:// 用户明确拒绝了此应用程序的访问权限。completion(false)case .authorized:// 用户授权此应用程序访问照片数据。completion(true)case .limited:// 用户授权此应用程序访问有限的照片数据。completion(true)@unknown default:fatalError()}}}
用户选择了授权或者拒绝授权之后,系统会记录下用户的选择,无论用户选择了什么,以后系统都不会再次出现弹窗让用户重新选择授权。
不过用户可以到设置中进行更改,这时候就需要我们提供交互友好的提示弹窗来提醒用户如何修改权限。
Limited Library
在之前的版本中,对于相册权限的申请用户只能选择允许或者是拒绝。在iOS14开始,用户可以指定授权照片或者视频,允许应用访问部分资源,系统弹窗样式如下:

除了拒绝和允许之外添加了一个限制访问的选项,用户点击该选项之后会打开一个受限库管理页面。此页面允许用户选择要与的应用共享的资源,我们的APP也就只能与这些用户选择出来的资源进行交互。
我们的APP无论是与整个照片库交互还是与受限的照片库交互,PhotoKit的使用方法基本都是相同的,但是需要注意以下两点:
- 如果是受限的访问权限,那么当我们使用PHAssetCreationRequest创建照片或者视频时,系统会自动将这些新创建的内容添加到用户允许访问的列表中。
- 如果是受限的访问放权,那么在APP中将不允许创建新的用户相册,也不允许获取用户的现有相册。
Limited Library 选择页面
在默认情况下,系统会在应用声明周期内自动提示用户更新其有限库一次。
但是这通常满足不了用户交互,用户可能需要不断的向可选择的受限库中添加新的照片或者视频提供给APP进行交互。
这样我们就需要在适当的时机使用代码的方式来吊起用户用户受限资源的选择页面,让用户添加新的资源。
想要实现这个功能,需要修改一下Info.plist文件:

并添加下面的代码:
func showLimitedLibrarySelectPicker(viewController:UIViewController) {PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: viewController)}
调用该方法就可以再次吊起受限资源的选择页面,将新的照片和视频的访问权限授予APP。
iOS15之后该方法添加了一个回调,返回了用户选择资源的本地表示字符列表。
func showLimitedLibrarySelectPicker(viewController:UIViewController) {PHPhotoLibrary.shared().presentLimitedLibraryPicker(from: viewController) { (results) in}}
结语
通过这篇博客,我们深入探讨了 PhotoKit 在 iOS 中的权限管理。从基础的权限请求到高级功能的使用,以及如何应对受限权限,我们都做了详细介绍。在开发应用时,理解并合理处理这些权限,不仅能够保障用户的隐私和数据安全,还能提升用户的使用体验。希望这篇文章能够帮助你更好地掌握 PhotoKit 的权限设置,让你的应用在处理照片和视频时更加得心应手。如果你有任何问题或建议,欢迎留言讨论。
相关文章:
二.PhotoKit - 相册权限(彻底读懂权限管理)
引言 用户的照片和视频算是用户最私密的数据之一,由于内置的隐私保护功能,APP只有在用户明确授权的前提下才能访问用户的照片库。从iOS14 开始,PhotoKit进一步增强了用户的隐私控制,用户可以选择指定的照片或者视频资源的访问权限…...
二叉树------最小堆,最大堆。
什么是最小堆: 堆是一种二叉树,最小堆中所有父亲节点的值都要比自己的子节点的值要小。而根节点称为堆顶。根据定义我们可以得到堆中最小元素就在堆顶。(节点左上角是编号,内部是元素值) 假设该图中的堆顶元素是24呢&a…...
预约功能的知识整理
前置知识 如果项目为小程序的开发项目中: 我们确定数据库中有的字段有: 预约人姓名、手机号、家人名称、预约时间 根据我们的经定一表必须要有的6个字段: 主键、创建时间、修改时间、创建人、修改人、备注 使用我们现在有的字段为: 主键…...
Linux的常用操作-02
一:Linux的系统目录结构 /bin bin是ary的缩写,这个目录存放着最经常用的命令 /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev:dev是Device(设备)的缩写,该目录下存放的是Lin…...
Android Studio 连接手机进行调试
总所周知,Android Studio里的虚拟手机下载后又大又难用。不如直接连手机用。本篇文章主要内容为Android Studio怎么连接手机进行程序调试。 1. 在AndroidSDK中下载google USB Driver: 2. 连接手机: 进入电脑设备管理器界面。并点开便携设备,…...
Vue3项目创建及相关配置
Vue是一种用于构建用户界面的JavaScript框架。它采用了一种称为MVVM(Model-View-ViewModel)的架构模式。 MVVM是一种将用户界面与业务逻辑和数据分离的设计模式。它包括三个部分: Model(模型):表示应用程序…...
【Python】Python中一些有趣的用法
Python是一种非常灵活和强大的编程语言,它有很多有趣的用法,以下是一些例子: 一行代码实现FizzBuzz: print(\n.join([FizzBuzz[i%3*4:i%5*8:-1] or str(i) for i in range(1, 101)]))使用列表推导式生成斐波那契数列: …...
RCE复现问题和研究
目录 先了解一些常见的知识点 PHP常见命令执行函数 call_user_func eval() call_user_func_array array_filter 实战演练(RCE)PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell? 1、长度…...
MySQL中的索引——适合创建索引的情况
1.适合创建索引的情况 1、字段的数值有唯一性的限制 2、频繁作为 WHERE 查询条件的字段 某个字段在 SELECT 语句的 WHERE 条件中经常被使用到,那么就需要给这个字段创建索引了。尤其是在数据量大的情况下,创建普通索引就可以大幅提升数据查询的效率。 …...
5款在线伪原创改写软件,智能改写文章效果好
在这个信息爆炸的时代,内容创作变得愈发重要,而对于创作者来说,有时需要一些得力的伪原创改写工具来辅助我们更好地改写出高质量的内容。今天我要和大家分享5款令人惊喜的在线伪原创改写软件,它们以出色的智能改写效果,…...
opencv-python图像增强四:多曝光融合(方法一)
文章目录 一、简介:二、多曝光融合方案:三、算法实现步骤3.1 读取图像与曝光时间:3.2 计算响应曲线并合并3.3 色调映射 四:整体代码实现五:效果 一、简介: 在摄影和计算机视觉领域,高动态范围&…...
Qt 实战(9)窗体 | 9.2、QDialog
文章目录 一、QDialog1、基本概念2、常用特性2.1、模态与非模态2.2、数据交互 3、总结 前言: Qt框架中的QDialog类是一个功能强大且灵活的对话框控件,广泛应用于各种GUI(图形用户界面)应用程序中,用于处理用户输入、消…...
Spring 事务机制
1. 引言 1.1 什么是事务 事务是由用户定义的一系列操作序列所组成的最小工作单元;这些操作要么全部完成,要么全部不完成,是一个不可分割的工作单元。常见于数据库中的并发控制和数据一致性处理场景。 1.2 事务的特性 事务具有以下特性&am…...
Android 13 GMS 内置壁纸
如图,原生系统上,设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸,就显示默认的壁纸。点击进去就是预览页面 扩展下,默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…...
【LeetCode】234. 回文链表
回文链表 题目描述: 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2&#…...
零基础学会机器学习,到底要多久?
这两天啊,有不少朋友和我说,想学机器学习,但是之前没有基础,不知道能不能学得会。 首先说结论,只要坚持,就能学会,但是一定不能三天打鱼两天晒网,要持之以恒,至少每隔两…...
视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?
安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台,支持多种视频格式和编码方式(H.264/H.265),能够轻松对接各类前端监控设备,实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…...
Qt解析XML
背景 本来想解析VS的项目配置文件(*.vcxproj),配合cppclean来发现多余的#incldue。 结果发现低估了难度,VS会间接引入许多目录。 略有不甘,暂且作为一个解析XML文件的示例。 代码 VSProjectParser.h #include <QVector> #include…...
PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解
Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码,我们试试暴力破解 image-20240807122743025 开始爆破了,全部失败,哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…...
OpenCV—二值化Threshold()、adaptiveThreshold()
cv2.threshold() c:double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注:源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src:源图片…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
