二.PhotoKit - 相册权限(彻底读懂权限管理)

news2024/11/26 22:29:53

引言

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

下面我们就来详细的探讨一下使用用户照片或视频资源时该如何进行权限的申请和管理。

相册权限

首先我们需要确定自己应用需要使用的功能,如果只是选择图片或者视频那么可能并不需要我们明确的来请求相册权限,系统会帮助我们完成这一点。

而如果需要更高级别的功能,那么我们则不得不明确授权APP来访问这些功能。

PHPickerViewController权限

PHPickerViewController我们已经使用过了,它是代替UIImagePickerController新的用户媒体资源选择器,支持搜索,多选照片和视频,并提供路程的内容缩放功能。

最主要的一点是由于它是系统在单独的进程中管理其生命周期,因此默认情况下它是私有的。用户在使用它选择照片或者视频时无需明确授权,这无疑改善了用户与应用交互是的整体体验,几乎所有的用户都会对授权的弹窗持谨慎和怀疑的态度。

    @objc func showPhotoPicker() {
        var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
        configuration.selectionLimit = 9
        let photoPicker = PHPickerViewController(configuration: configuration)
        photoPicker.delegate = self
        self.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 in
            switch 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.coloradmin.cn/o/2035333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里淘天landing,是结束也是新的开始(附校/社招内推码)

阿里3个多月landing成功&#xff0c;是结束也是新开始&#xff0c;望我们往后一切顺利~ 因为个人发展规划&#xff0c;今年开始找工作&#xff0c;但负责的业务实在繁忙&#xff0c;所以一边面试一边整理资料&#xff0c;每天都在挤海绵。 今年的就业形势着实不乐观&#xff0c…

NPN传感器与汉姆485总线驱动器限位功能使用

传感器输出的引脚电平是由传感器是常闭还是常开决定的&#xff1b;light on和 dark on决定的是触发信号&#xff1b; PNP-NO常开&#xff1a;在没有信号触发时&#xff0c;输出线是悬空的&#xff08;即VCC电源线和OUT线断开&#xff09;&#xff0c;输出为低电平或不确定状态…

【推荐】免费一年期的SSL证书现在哪里可以申请到

免费一年期的SSL证书虽然不像以前那样普遍易得&#xff0c;但仍有部分途径可以申请到。以下是一些可能的申请渠道&#xff1a; JoySSL 特点&#xff1a;JoySSL是自主品牌SSL证书&#xff0c;安全性和兼容性都有保障。它提供教育版和政务版域名的一年期免费DV单证书。申请流程&…

java中RSA分段加解密及Data must not be longer than异常处理

谈到RSA非对称加密&#xff0c;作为开发的我们第一想到的是安全&#xff0c;几乎不会被破解&#xff0c;以及公钥加密&#xff0c;私钥解密这些。在Java代码中&#xff0c;我们常使用一些现成的工具类如hutool中提供的工具类、网上在线的或者博客上的RSAUtils工具类来实现公钥私…

解决BkwinProject无法编译运行问题

#ifdef _UNICODE // 如果定义了 _UNICODE&#xff0c;这意味着程序正在使用 Unicode 字符集进行编译。 // Unicode 字符集是现代 Windows 应用程序普遍使用的字符编码方式&#xff0c;支持多语言字符。#if defined _M_IX86 // 如果定义了 _M_IX86&#xff0c;这意味着程序正…

【源码交付】数字化产科管理平台:一个集孕期产检、健康宣教、随访、住院、产后42天管理的专科管理系统

项目介绍&#xff1a; 数字化产科管理平台是一个集孕期产检、健康宣教、随访、住院、产后42天管理的专科管理系统&#xff0c;由门诊、住院、数据统计三大功能模块组成&#xff0c;与院内系统HIS/LIS/PACS数据对接&#xff0c;实现以孕妇为中心的全面、高效、多元的全周期服务…

用的到linux-系统性能监控(内存、CPU、硬盘、IO)-Day6

前言&#xff1a; 在Linux系统中&#xff0c;实时监控系统的资源使用情况&#xff08;如内存、硬盘、CPU、网络和IO等&#xff09;是非常重要的&#xff0c;它可以帮助你了解系统的健康状况&#xff0c;及时发现潜在的性能瓶颈或问题。下面将介绍一些常用的命令和工具&#xff…

私服(Nexus)相关笔记

目录 Nexus服务器安装与启动 仓库分类与手动上传组件 私服资源获取 仓库分类 IDEA环境中资源上传与下载 Nexus服务器安装与启动 私服 Nexus是Sonatype公司的一款maven私服产品下载地址: https://help.sonatype.com/repomanager3/download 解压到自己放置资源的地方 输入…

YOLOV8多类别训练时遇到的大坑

本篇文章帮大家避坑。。。 如果要训练六个类别的数据集&#xff0c;按照我以下做数据集文件夹 有test、train、valid、还有一个data.yaml的配置文件。 每个下面都有images和labels 我们拿train的imges来说&#xff0c;它里面存放着你六个类别的图片 labels也要跟上面的图片名…

AH8681锂电升压3.7升5V升12V 2A可支持QC2.0 3.0

135.3806.7573在探讨AH8681这款专为3.7V升压5V至12V&#xff0c;并具备2A输出能力&#xff0c;同时兼容QC2.0与QC3.0快充协议的升压芯片时&#xff0c;我们不得不深入其技术细节、应用场景、设计优势以及市场定位等多个维度&#xff0c;以全面理解其在现代电子设备中的重要作用…

色板游戏 (珂朵莉树+优化)

色板游戏 - 洛谷 核心思路 用珂朵莉树处理区间赋值、计算颜色。 加一个记录答案&#xff0c;就可以过掉全部数据。 AC代码 #include<bits/stdc.h> #define ll long long using namespace std; struct ran{int l, r;mutable int v;bool operator <(const ran &…

CDP问卷填报流程-百胜企业管理咨询

填写CDP问卷需要以下几个步骤&#xff1a; 了解问卷内容&#xff1a;首先&#xff0c;仔细阅读问卷的说明和背景信息&#xff0c;了解问卷的目的和问题。这样可以更好地理解问题&#xff0c;并提供准确的答案。 分析问题&#xff1a;在填写问卷之前&#xff0c;花时间仔细阅读…

C语言 ——— 在杨氏矩阵中查找具体的某个数

目录 何为杨氏矩阵 题目要求 代码实现 何为杨氏矩阵 可以把杨氏矩阵理解为一个二维数组&#xff0c;这个二维数组中的每一行从左到右是递增的&#xff0c;每一列从上到下是递增的 题目要求 在杨氏矩阵中查找具体的某个数 要求&#xff1a;时间复杂度小于O(N) 代码实现…

机器学习--混淆矩阵(Confusion Matrix)

一、混淆矩阵 True Negative (TN)&#xff1a; 真负类&#xff0c;样本的真实类别是负类&#xff0c;并且模型将其识别为负类&#xff0c;cm[0][0]。False Positive (FP)&#xff1a; 假正类&#xff0c;样本的真实类别是负类&#xff0c;但是模型将其识别为正类&#xff0c;cm…

Mutual_Voting_for_Ranking_3D_Correspondences

因为目前主要在看表示学习&#xff0c;所以配准了解较少&#xff0c;这篇文章就主要记录了一下相关工作和作者提出的非dl的模型&#xff0c;实验部分很简略&#xff0c;大家可以做参考。 Abstract 在摘要部分&#xff0c;作者介绍了一种新颖的相互投票方法&#xff0c;用于对…

孙宇晨所到之处,投资人闻风丧胆?WBTC被坑惨了?MakerDAO带头抗议!BitGo退场!

为实现WBTC跨多个司法管辖区的托管业务和冷储存业务多元化&#xff0c;加密货币托管公司BitGo于8月10日宣布&#xff0c;将与BiT Global创建合资企业对Wrapped Bitcoin&#xff08;WBTC&#xff09;业务进行多司法管辖区托管&#xff0c;且BitGo将成为新合资企业的少数股东。此…

满天飞的浮毛怎么去掉?最最高效解决浮毛的办法宠物空气净化器

作为一名呼吸科医生&#xff0c;我们的工作有着明显的“淡旺季”之分。旺季&#xff1a;一是秋冬季节雾霾加剧&#xff0c;引发呼吸道不适&#xff1b;二是宠物换毛期&#xff0c;导致家庭环境中浮毛增多&#xff0c;进而引发呼吸道过敏、炎症等问题。秋冬的雾霾是自然界的不可…

java基础进阶——log日志、类加载器、XML、单元测试、注解、枚举类

前言 这篇内容主要掌握的就是logback使用、理解类加载器、XML文件的编写&#xff0c;XML文档约束schema&#xff0c;用Dom4j解析XML文档&#xff0c;Xpath检索XML文档&#xff0c;完整使用Junit单元测试框架常用部分&#xff0c;注解的定义和使用&#xff0c;枚举类的定义和开发…

IDEA:Dangling Javadoc comment

JetBrains对JavaDocs的描述&#xff1a; Javadoc comments are usually placed above classes, methods, or fields in your source code. A Javadoc provides a description of the code element located under it and contains block tags marked with with specific metada…

0x6 风险评估

风险评估介绍 一、风险评估解决的问题 二、什么是风险评估 三、风险评估的目的 加强信息安全保障&#xff1a;信息安全风险评估是信息安全体系建设和管理的关键环节。通过评估&#xff0c;能够发现系统的主要问题和矛盾&#xff0c;并找到解决关键问题的办法。 认清安全环境与…