当前位置: 首页 > 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;源图片…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...