当前位置: 首页 > news >正文

二.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的使用方法基本都是相同的,但是需要注意以下两点:

  1. 如果是受限的访问权限,那么当我们使用PHAssetCreationRequest创建照片或者视频时,系统会自动将这些新创建的内容添加到用户允许访问的列表中。
  2. 如果是受限的访问放权,那么在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 - 相册权限(彻底读懂权限管理)

引言 用户的照片和视频算是用户最私密的数据之一&#xff0c;由于内置的隐私保护功能&#xff0c;APP只有在用户明确授权的前提下才能访问用户的照片库。从iOS14 开始&#xff0c;PhotoKit进一步增强了用户的隐私控制&#xff0c;用户可以选择指定的照片或者视频资源的访问权限…...

二叉树------最小堆,最大堆。

什么是最小堆&#xff1a; 堆是一种二叉树&#xff0c;最小堆中所有父亲节点的值都要比自己的子节点的值要小。而根节点称为堆顶。根据定义我们可以得到堆中最小元素就在堆顶。&#xff08;节点左上角是编号&#xff0c;内部是元素值&#xff09; 假设该图中的堆顶元素是24呢&a…...

预约功能的知识整理

前置知识 如果项目为小程序的开发项目中&#xff1a; 我们确定数据库中有的字段有: 预约人姓名、手机号、家人名称、预约时间 根据我们的经定一表必须要有的6个字段&#xff1a; 主键、创建时间、修改时间、创建人、修改人、备注 使用我们现在有的字段为&#xff1a; 主键…...

Linux的常用操作-02

一&#xff1a;Linux的系统目录结构 /bin bin是ary的缩写&#xff0c;这个目录存放着最经常用的命令 /boot&#xff1a;这里存放的是启动Linux时使用的一些核心文件&#xff0c;包括一些连接文件以及镜像文件。 /dev&#xff1a;dev是Device(设备)的缩写,该目录下存放的是Lin…...

Android Studio 连接手机进行调试

总所周知&#xff0c;Android Studio里的虚拟手机下载后又大又难用。不如直接连手机用。本篇文章主要内容为Android Studio怎么连接手机进行程序调试。 1. 在AndroidSDK中下载google USB Driver: 2. 连接手机&#xff1a; 进入电脑设备管理器界面。并点开便携设备&#xff0c…...

Vue3项目创建及相关配置

Vue是一种用于构建用户界面的JavaScript框架。它采用了一种称为MVVM&#xff08;Model-View-ViewModel&#xff09;的架构模式。 MVVM是一种将用户界面与业务逻辑和数据分离的设计模式。它包括三个部分&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;表示应用程序…...

【Python】Python中一些有趣的用法

Python是一种非常灵活和强大的编程语言&#xff0c;它有很多有趣的用法&#xff0c;以下是一些例子&#xff1a; 一行代码实现FizzBuzz&#xff1a; print(\n.join([FizzBuzz[i%3*4:i%5*8:-1] or str(i) for i in range(1, 101)]))使用列表推导式生成斐波那契数列&#xff1a; …...

RCE复现问题和研究

目录 先了解一些常见的知识点 PHP常见命令执行函数 call_user_func eval&#xff08;&#xff09; call_user_func_array array_filter 实战演练&#xff08;RCE&#xff09;PHP Eval函数参数限制在16个字符的情况下 &#xff0c;如何拿到Webshell&#xff1f; 1、长度…...

MySQL中的索引——适合创建索引的情况

1.适合创建索引的情况 1、字段的数值有唯一性的限制 2、频繁作为 WHERE 查询条件的字段 某个字段在 SELECT 语句的 WHERE 条件中经常被使用到&#xff0c;那么就需要给这个字段创建索引了。尤其是在数据量大的情况下&#xff0c;创建普通索引就可以大幅提升数据查询的效率。 …...

5款在线伪原创改写软件,智能改写文章效果好

在这个信息爆炸的时代&#xff0c;内容创作变得愈发重要&#xff0c;而对于创作者来说&#xff0c;有时需要一些得力的伪原创改写工具来辅助我们更好地改写出高质量的内容。今天我要和大家分享5款令人惊喜的在线伪原创改写软件&#xff0c;它们以出色的智能改写效果&#xff0c…...

opencv-python图像增强四:多曝光融合(方法一)

文章目录 一、简介&#xff1a;二、多曝光融合方案&#xff1a;三、算法实现步骤3.1 读取图像与曝光时间&#xff1a;3.2 计算响应曲线并合并3.3 色调映射 四&#xff1a;整体代码实现五&#xff1a;效果 一、简介&#xff1a; 在摄影和计算机视觉领域&#xff0c;高动态范围&…...

Qt 实战(9)窗体 | 9.2、QDialog

文章目录 一、QDialog1、基本概念2、常用特性2.1、模态与非模态2.2、数据交互 3、总结 前言&#xff1a; Qt框架中的QDialog类是一个功能强大且灵活的对话框控件&#xff0c;广泛应用于各种GUI&#xff08;图形用户界面&#xff09;应用程序中&#xff0c;用于处理用户输入、消…...

Spring 事务机制

1. 引言 1.1 什么是事务 事务是由用户定义的一系列操作序列所组成的最小工作单元&#xff1b;这些操作要么全部完成&#xff0c;要么全部不完成&#xff0c;是一个不可分割的工作单元。常见于数据库中的并发控制和数据一致性处理场景。 1.2 事务的特性 事务具有以下特性&am…...

Android 13 GMS 内置壁纸

如图&#xff0c;原生系统上&#xff0c;设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸&#xff0c;就显示默认的壁纸。点击进去就是预览页面 扩展下&#xff0c;默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…...

【LeetCode】234. 回文链表

回文链表 题目描述&#xff1a; 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#…...

零基础学会机器学习,到底要多久?

这两天啊&#xff0c;有不少朋友和我说&#xff0c;想学机器学习&#xff0c;但是之前没有基础&#xff0c;不知道能不能学得会。 首先说结论&#xff0c;只要坚持&#xff0c;就能学会&#xff0c;但是一定不能三天打鱼两天晒网&#xff0c;要持之以恒&#xff0c;至少每隔两…...

视频汇聚/安防监控综合平台EasyCVR接入海康私有协议EHOME显示失败是什么原因?

安防监控/视频综合管理平台/视频集中存储/磁盘阵列EasyCVR视频汇聚平台&#xff0c;支持多种视频格式和编码方式&#xff08;H.264/H.265&#xff09;&#xff0c;能够轻松对接各类前端监控设备&#xff0c;实现视频流的统一接入与集中管理。安防监控EasyCVR平台支持多种流媒体…...

Qt解析XML

背景 本来想解析VS的项目配置文件(*.vcxproj)&#xff0c;配合cppclean来发现多余的#incldue。 结果发现低估了难度&#xff0c;VS会间接引入许多目录。 略有不甘&#xff0c;暂且作为一个解析XML文件的示例。 代码 VSProjectParser.h #include <QVector> #include…...

PwnLab: init-文件包含、shell反弹、提权--靶机渗透思路讲解

Vulnhub靶机链接回【PwnLab】 首页有一个登录框 image-20240807124822770 他没有验证码&#xff0c;我们试试暴力破解 image-20240807122743025 开始爆破了&#xff0c;全部失败&#xff0c;哈哈哈 image-20240807122851001 nmap全端口扫描试试 image-20240807131408315 有…...

OpenCV—二值化Threshold()、adaptiveThreshold()

cv2.threshold() c&#xff1a;double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注&#xff1a;源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src&#xff1a;源图片…...

Chrome扩展开发实战:打造浏览器侧边栏ChatGPT助手

1. 项目概述&#xff1a;一个让ChatGPT常驻浏览器侧边栏的利器如果你和我一样&#xff0c;每天的工作和学习都离不开浏览器&#xff0c;并且频繁地与ChatGPT对话来获取灵感、润色文案或者调试代码&#xff0c;那么你肯定对在无数个标签页之间来回切换感到厌烦。每次都要打开一个…...

Fast-GitHub:打破GitHub访问壁垒的智能加速方案

Fast-GitHub&#xff1a;打破GitHub访问壁垒的智能加速方案 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否曾因GitHub仓库克…...

从零构建AOD-Net:PyTorch实战图像去雾模型开发全流程

1. 环境准备与数据理解 在开始构建AOD-Net之前&#xff0c;我们需要先搭建好开发环境。推荐使用Anaconda创建独立的Python环境&#xff0c;避免与其他项目产生依赖冲突。这里我选择Python 3.8和PyTorch 1.12的组合&#xff0c;这个版本经过实测在图像处理任务中表现稳定。 安装…...

OpenCore Legacy Patcher终极指南:让老Mac免费运行最新macOS的完整教程

OpenCore Legacy Patcher终极指南&#xff1a;让老Mac免费运行最新macOS的完整教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是…...

别再死记硬背公式了!用Python+NumPy手把手带你仿真RLC串联谐振(附代码)

用PythonNumPy动态仿真RLC串联谐振&#xff1a;告别枯燥公式&#xff0c;直观理解电路本质 当你第一次翻开电路分析教材&#xff0c;看到那些密密麻麻的公式推导和抽象的频率响应曲线时&#xff0c;是否感到一阵眩晕&#xff1f;RLC串联谐振作为电路分析的核心概念&#xff0c;…...

3步实现专业级AI换脸:roop-unleashed创新方案指南

3步实现专业级AI换脸&#xff1a;roop-unleashed创新方案指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 在数字创意飞速发展的今天&#xff0c;AI换脸…...

3个按键冲突场景,Hitboxer如何帮你重获游戏控制权?

3个按键冲突场景&#xff0c;Hitboxer如何帮你重获游戏控制权&#xff1f; 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中&#xff0c;因为同时按下W和S键而突然卡住&#xff1f;或…...

基于PIR传感器与LIFX智能灯泡的物联网运动感应照明系统实战

1. 项目概述与核心价值如果你对智能家居自动化感兴趣&#xff0c;并且想亲手打造一个既实用又有趣的照明项目&#xff0c;那么这个基于Adafruit FunHouse和LIFX智能灯泡的运动感应照明系统&#xff0c;绝对是一个绝佳的起点。它不仅仅是一个“开灯关灯”的简单触发器&#xff0…...

Kubernetes自动化更新利器Keel:实现容器镜像的持续部署

1. 项目概述&#xff1a;为什么我们需要一个“自动化的应用更新管家”&#xff1f; 如果你和我一样&#xff0c;负责维护着几个、十几个&#xff0c;甚至几十个运行在Kubernetes或Docker环境中的应用&#xff0c;那你一定对“更新”这件事又爱又恨。爱的是&#xff0c;新版本意…...

AI模型部署实战:基于FastAPI与Tauri构建OpenClaw模型GUI应用

1. 项目概述与核心价值最近在AI应用开发圈里&#xff0c;一个名为“GrahamMiranda-AI/openclaw-model-gui”的项目引起了我的注意。乍一看这个标题&#xff0c;它融合了“openclaw-model”和“gui”两个关键部分&#xff0c;这让我立刻联想到一个典型的场景&#xff1a;一个已经…...