「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
前言
关于iOS相册及相机的功能探索。在笔者的开发生涯中,对此了解确实不足,有调用相册功能就立马用TZImagePickerController去实现功能,趁此空闲时间,来调研一下系统API及TZImagePickerController的功能对比,仅关注一下实现方式。
系统API实现相机及相册调用
1. 相机功能调研
1. 首先需要Info.plist添加隐私授权声明
如果是允许可以拍摄视频,需要添加麦克风权限
2. 查看一下iOS相机的四种权限
用户尚未选择关于客户端是否可以访问硬件
AVAuthorizationStatusNotDetermined = 0,
客户端未被授权访问硬件的媒体类型。用户不能改变客户机的状态,可能由于活跃的限制,如家长控制
AVAuthorizationStatusRestricted,
明确拒绝用户访问硬件支持的媒体类型的客户
AVAuthorizationStatusDenied,
客户端授权访问硬件支持的媒体类型
AVAuthorizationStatusAuthorized
对于用户尚未选择客户端是否可以访问的权限,需要再次判断
此处我们需要在调用相机前判断相机权限,同意权限下调用相机,不同意需要来个弹窗提示用户去设置里面允许相机访问。
3.UIImagePickerController实现相机
2. 相册功能调研
有个概念之前弄混了,一直以为读取相册必须在Info.plist添加隐私授权,但是其实没进行权限判断的话,是不会弹隐私弹窗的,只使用UIImagePickerController调起相册,是不会崩溃的,可以正常使用。当然,只是说说,Info.plist不添加权限审核是必拒的,机审ipa那一步都过不去。
1. Info.plsit添加相册权限
权限判断时候,添加访问图片及保存照片权限。
2. 相册的权限判断
可以看到,在iOS14新增了选择照片权限,具体适配看具体场景应用了。
默认还没做出选择
PHAuthorizationStatusNotDetermined = 0,
客户端未被授权访问硬件的媒体类型
PHAuthorizationStatusRestricted,
用户已经明确否认了这一照片数据的应用程序访问
PHAuthorizationStatusDenied,
用户已经授权应用访问照片数据
PHAuthorizationStatusAuthorized,
ios14部分照片权限
PHAuthorizationStatusLimited API_AVAILABLE(ios(14)),
iOS14权限可以单独判断,也可以不判断
3. UIImagePickerController及PHPickerViewController
3.1 UIImagePickerController实现相册
相册和相机的区别,在于类型的不同,相机的sourceType是UIImagePickerControllerSourceTypeCamera,相册的sourceType是UIImagePickerControllerSourceTypePhotoLibrary。
需要注意的是,在iOS15中,UIImageWriteToSavedPhotosAlbum存储图片之后的回调不再返回图片了,会返回nil。
UIImageWriteToSavedPhotosAlbum(image,self,@selector(image:didFinishSavingWithError:contextInfo:), NULL);
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{ }
3.2 PHPickerViewController实现相册
iOS 14 中新的 PHPicker 类不是在 UIKit 框架中的,而是位于 PhotosUI 框架中,因此需要导入头文件
PHPickerViewController有很多的优点,也有些缺点,自己体会吧。。。不管这个API好用与否,iOS14以上才支持就让大部分开发望而止步了。
#import <PhotosUI/PhotosUI.h>
初始化配置参数及实例对象
实现代理方法
ps: 模拟器转圈圈半天也没见图片出来,真机倒是很快可以添加图片显示出来。
4. iOS14 limited部分照片适配
因为笔者最近没有去做相册选取功能,因此之前就有个误区,以为limited权限选择部分照片后,UIImagePickerController 和 PHPickerViewController调取相册时候自动获取的是用户选择的那些图片,然而,调取的还是相册全部照片。
如果适配iOS14选择照片功能,这时候就需要对iOS14的权限进行适配判断了
首次弹出权限时候以及iOS14部分照片权限时候,都需要跳转到我们自己来显示照片的控制器。
这时候就需要适配iOS14选择照片功能了,需要自己写一个控制器来显示用户选择的照片,系统提供了监听的方法。
/// PHPhotoLibraryChangeObserver代理实现
/// 监听
[[PHPhotoLibrary sharedPhotoLibrary]
registerChangeObserver:self];
/// 移除
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
代理实现
可以获取到用户选择了哪些照片,我们把那些照片取出来显示到我们自己的控制器上,没有截图完整,有兴趣可以去demo看看代码实现
总结
笔者在简单的demo实现中写了此篇文章,内容很简单,只是一个知识整理的过程,当然,简单的场景我们自己调用系统API实现也可以。复杂的功能还是首选TZImagePickerController三方,实现的功能很多,毕竟大家都在用,大家都说好用。