二.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 的权限设置,让你的应用在处理照片和视频时更加得心应手。如果你有任何问题或建议,欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/402496.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 面试 PDF 资料整理

“尊贵的求知者&#xff0c;作者特此献上精心编纂的Java面试宝典PDF&#xff0c;这份资料凝聚了无数面试精华与实战经验&#xff0c;是通往Java技术殿堂的钥匙。若您渴望在Java编程的求职之路上稳健前行&#xff0c;只需轻轻一点&#xff0c;完成这象征支持与认可的一键三联&am…

解决麒麟 V10 SP1 升级 Python 后 Yum 不可用问题

目录 一、前提概要 二、解决办法 1、卸载原有的 python 2、安装 Python 3.7.9 rpm 3、安装一系列 yum 相关 rpm 4、rpm 包下载 一、前提概要 在部署 gaussDB 的时候&#xff0c;安装代理时要求 python 版本满足 3.7.9&#xff0c;但已安装的麒麟 V10 内集成的 python 版…

docker安装es8和kibana

es8、kibana安装、ik分词器使用 1 拉取镜像2 创建网络3 安装ES3.1 启动临时的ES3.2 运行es3.3 修改用户密码 4 安装kibana4.1 启动临时的kibana4.2 修改配置文件4.3 重启创建并启动kibana容器4.4 调用5601端口&#xff08;我映射的是8082&#xff09; 5 安装ik分词器&#xff0…

Linux学习——文本处理工具与正则表达式

目录 一&#xff0c;grep 1&#xff0c;grep介绍 2&#xff0c;grep的常用选项 3&#xff0c;grep使用演示 1&#xff0c;基本使用 直接查找字符串&#xff1a; 使用选项 2&#xff0c;使用正则表达式进行匹配 1&#xff0c;正则表达式介绍 2&#xff0c;使用范例 二&…

servlet的执行顺序

执行的时候Tomcat先初始化 然后调用 server 根据server来回调请求方式下面会追入源码解释 package com.haogu.servlet;import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.…

Zookeeper的在Ubuntu20.04上的集群部署

安装资源 官方安装包下载地址&#xff1a;https://zookeeper.apache.org/releases.html 懒得找版本的可以移步下载zookeeper3.84稳定版本&#xff1a; https://download.csdn.net/download/qq_43439214/89646735 安装方法 创建安装路径&&解压安装包 # 创建路径 m…

STM32总线和时钟树(速记版)

一、存储器结构 1.1 STM32内存结构 型号说明 以STM32F103RBT6这个型号的芯片为例&#xff0c;该型号的组成为7个部分&#xff0c;其命名规则如下&#xff1a; ST 是公司名&#xff0c;意法半导体。M 代表Cortex-M内核。32 代表32位微控制器。 F103 是芯片系列。 R 代表引脚数…

Excel求和方法之

一 SUM&#xff08;&#xff09;&#xff0c;选择要相加的数,回车即可 二 上面的方法还不够快。用下面这个 就成功了 三 还有一种一样快的 选中之后&#xff0c;按下Alt键和键&#xff08;即Alt&#xff09;

直流屏监控模块ACT-J04触摸屏ACT-J05控制器的应用

直流屏监控模块ACT-J04触摸屏ACT-J05控制器的应用&#xff0c;电力智能监控系统ACT-J03&#xff0c;ACT-J02&#xff0c;ACT-J06&#xff0c;高频开关电源模块M1B10&#xff0c;M1A10&#xff0c;M1B10L&#xff0c;M1B20&#xff0c;M1B10L-2&#xff0c;MK1B10L&#xff0c;M…

Hive:大数据时代的SQL魔法师

时间&#xff1a;2024年08月17日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;https://xima.tv/1_ZRh54d?_sonic0 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋内推一下&#x…

Rust学习笔记1--下载安装和使用

一、下载和安装&#xff1a; 官网&#xff1a;https://www.rust-lang.org/ 直接下载即可&#xff0c;windows&#xff1a;按照教程执行步骤。 二、使用&#xff1a; 2.1 在vscode中安装rust 2.2 编译与运行rust文件&#xff1a; 后缀名rs&#xff1a; 编译&#xff1a; …

Eureka原理与实践:深入探索微服务架构的核心组件

在微服务架构日益盛行的今天&#xff0c;服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka&#xff0c;作为Netflix开源的服务注册与发现框架&#xff0c;凭借其简单、健壮的特性&#xff0c;在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理&…

当前人形机器人公司及产品介绍

产品型号属地公司名字Optimus美国特斯拉Figure02美国FigureAIAtlas美国波士顿动力通用人形Apollo美国ApptronikPhoenix加拿大Sanctuary AIRoBee意大利OversonicASIMO日本本田NAO日本软银GR-1上海傅利叶远征A1上海智元XR4上海达闼先行者K1上海开普勒青龙上海国创AstribotS1深圳星…

网络安全实训第一天(dami靶场搭建,XSS、CSRF、模板、任意文件删除添加、框架、密码爆破漏洞)

1.环境准备&#xff1a;搭建漏洞测试的基础环境 安装完phpstudy之后&#xff0c;开启MySQL和Nginx&#xff0c;将dami文件夹复制到网站的根目录下&#xff0c;最后访问安装phptudy机器的IP地址 第一次登录删除dami根目录下install.lck文件 如果检测环境不正确可以下载php5.3.2…

Windows Server 域控制服务器安装及相关使用

目录 1.将客户机加入域 2.安装域控制器 3.新建域用户 4.设置用户登录时间&#xff0c;账户过期时间 5.软件分发 ​编辑 6.换壁纸 7.OU与GPO的概念 域为集中控制&#xff0c;拿下域控是拿下目标的关键 以Windows Server 2022为例 1.将客户机加入域 前提&#xff1a;客…

代理模式Proxy

一、代理模式&#xff08;Proxy&#xff09; 1.代理模式的定义 代理模式给某一个对象提供一个代理对象&#xff0c;并由代理对象控制对真实对象的访问&#xff0c;起到对代理对象已有功能的增强 通俗的来讲代理模式就是我们生活中常见的中介。 2.作用 中介隔离作用&#x…

前端读取response.headers异常:Cannot read properties of undefined (reading ‘split‘)

[TOC](前端读取response.headers异常:Cannot read properties of undefined (reading ‘split’) ) 前端读取response.headers异常 Cannot read properties of undefined (reading ‘split’) TypeError: Cannot read properties of undefined (reading ‘split’) 报错解释&a…

【JavaSE】解读Java中的toString方法

前言&#xff1a; 在Java中&#xff0c;toString方法来自java.lang.Object 类&#xff0c;然后所有对象都继承该Object 类。默认情况下&#xff0c;它的作用是返回对象的字符串表示形式。在实际开发中&#xff0c;重写 toString() 方法可以帮助我们以更易读的形式输出对象信息&…

Airflow学习笔记

1 概述 Airflow是一个以编程方式编写&#xff08;要用python脚本&#xff09;&#xff0c;安排和监视工作流的平台。使用Airflow将工作流编写任务的有向无环图&#xff08;DAG&#xff09;。Airflow计划程序在遵循指定的依赖项&#xff0c;同时在一组工作线程上执行任务。丰富…

kaggle中访问本地上传的图片(找到图片地址)

由于代码中需要使用自己上传一个图片&#xff0c;对图片进行操作&#xff0c;尝试了很多种办法终于摸索出来了,希望可以帮助到大家 首先&#xff0c;在kaggle中左侧导航栏中找到datasets->New Dataset->Browse Files 创建成功后就可以看到数据集的详细信息 返回到代码中…