iOS14适配:
原创:知识点总结性文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的IOS成长历程,希望能与大家一起进步
温馨提示:由于简书不支持目录跳转,大家可通过command + F 输入目录标题后迅速寻找到你所需要的内容
目录
- 一、Limited Photo Library Access模式
- 1、相册权限变化
- 2、PhotoKit API变化
- 3、适配时需要考虑的问题
1、相册权限变化
苹果在WWDC2020上,提到了很多在用户隐私和安全方面的升级和策略。其中之一是相册权限中,加入了LimitedPhotos Library
的概念,在用户升级系统后,获取相册权限时就会弹下面的弹框让用户选择,也就是你的app新老版本都会受到影响。
Limited Photo
模式实际就是增加了一层过滤,我们只能访问用户已经允许访问的资源。相册访问资源的修改,有两种方式。第一种方式是在冷启 APP 首次使用 PhotoKit
访问资源的时候会默认弹出选择图片弹窗。第二种方式是在应用设置->Photos
->Edit Selected Photos
中修改。
2、PhotoKit API变化
1)权限状态新增了PHAuthorizationStatusLimited
,代表用户选择的是Limited Photo
模式
typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
PHAuthorizationStatusNotDetermined = 0,
PHAuthorizationStatusRestricted,
PHAuthorizationStatusDenied,
PHAuthorizationStatusAuthorized,
PHAuthorizationStatusLimited API_AVAILABLE(ios(14)),
};
2)相册的访问方式分为仅写和读写方式,只读的话,系统建议采用新的API——PHPicker
,支持多选,支持搜索,支持按 image
,video
,livePhotos
等进行选择。
typedef NS_ENUM(NSInteger, PHAccessLevel) {
PHAccessLevelAddOnly = 1,
PHAccessLevelReadWrite = 2,
} API_AVAILABLE(macos(11.0), ios(14), tvos(14));
3)新增了获取权限状态的API,老的接口没有适配,如果选择的是Limited Photo
,老接口返回的权限是PHAuthorizationStatusAuthorized
。
if (@available(iOS 14, *)) {
[PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelReadWrite handler:authHandler];
} else {
[PHPhotoLibrary requestAuthorization:authHandler];
}
+ (void)askForAlbumPermissionWithCompletionBlock:(void (^)(BOOL granted, BOOL firstAsk))completionBlock {
PHAuthorizationStatus authorizationStatus;
if (@available(iOS 14, *)) {
authorizationStatus = [PHPhotoLibrary authorizationStatusForAccessLevel:PHAccessLevelReadWrite];
} else {
authorizationStatus = [PHPhotoLibrary authorizationStatus];
}
switch (authorizationStatus) {
case PHAuthorizationStatusNotDetermined: {
void (^authHandler)(PHAuthorizationStatus) = ^(PHAuthorizationStatus status){
BOOL granted;
if (@available(iOS 14, *)) {
granted = (status == PHAuthorizationStatusAuthorized || status == PHAuthorizationStatusLimited);
} else {
granted = (status == PHAuthorizationStatusAuthorized);
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completionBlock) {
completionBlock(granted, YES);
}
});
};
if (@available(iOS 14, *)) {
[PHPhotoLibrary requestAuthorizationForAccessLevel:PHAccessLevelReadWrite handler:authHandler];
} else {
[PHPhotoLibrary requestAuthorization:authHandler];
}
break;
}
case PHAuthorizationStatusAuthorized:
case PHAuthorizationStatusLimited: {
if (completionBlock) {
completionBlock(YES, NO);
}
break;
}
default: {
if (completionBlock) {
completionBlock(NO, NO);
}
break;
}
}
}
+ (void)registerPhotoLibrary:(PHPhotoLibrary *)photoLibrary observer:(id<PHPhotoLibraryChangeObserver>)observer {
if (@available(iOS 14, *)) {
PHAuthorizationStatus authorizationStatus = [PHPhotoLibrary authorizationStatusForAccessLevel:PHAccessLevelReadWrite];
if (authorizationStatus == PHAuthorizationStatusAuthorized || authorizationStatus == PHAuthorizationStatusLimited) {
[photoLibrary registerChangeObserver:observer];
}
} else {
PHAuthorizationStatus authorizationStatus = [PHPhotoLibrary authorizationStatus];
if (authorizationStatus == PHAuthorizationStatusAuthorized) {
[photoLibrary registerChangeObserver:observer];
}
}
}
3、重新审视相册的权限
苹果希望开发者们能够反思他们的APP是否真的需要那么多的相册权限,遵循使用最少的权限来实现功能,保护用户的隐私不被侵害。
只读权限
如果只需要读取图片资源类的APP,苹果建议使用iOS14提供的图片选择器PHPicker
,对应iOS14以下的UIImagePickerController
。升级完以后,之前使用UIImagePickerController
的会自动显示PHPicker
。PHPicker
有很多优点:
-
PHPicker
是独立进程,不影响 APP 的性能表现 -
PHPicker
不需要用户授予权限就可以选择用户所有的资源 -
PHPicker
支持多选
第一步:#import <PhotosUI/PhotosUI.h>
第二步:通过PHPickerConfiguration
来配置PHPicker
,可以设置多选和可以选择的视频、动态图、普通图片。
第三步:添加delegate
只写权限
只写权限的弹窗比读取的简洁,只有允许和不允许需要在Info.plist
里配置信息
- NSPhotoLibraryAddUsageDescription:用户存入相册时的提示信息。
- NSPhotoLibraryUsageDescription:相册访问权限信息,必须有此项,不然访问相册的时候 APP 会 Crash。
分别使用 AssetsLibrary
、PhotoKit
以及UIKit
层 UIImageWriteToSavedPhotosAlbum(:::)
写入相册。很容易发现使用 AssetsLibrary
弹出来的是Access
的权限,并不是苹果声称的独立弹窗,并且点击 选择照片 后没有弹出系统弹窗选择图片,但是能够正常写入相册。PhotoKit
与 UIKit
的实现符合预期。
读写权限
权限配置与(2)中一致。同样分别使用 AssetsLibrary
和 PhotoKit
来读取相册资源,两者权限弹窗表现一致:选择 Limited Photo
模式,PhotoKit
访问正常,AssetsLibrary
访问相册出错,猜测苹果并未适配 AssetsLibrary
,会出现报错信息。AssetsLibrary
需要尽快迁移到新的API。模拟器上PhotoKit仍然会返回未开放权限的图片的PHAsset,但是PHAsset的image缺返回为空,真机上没有该问题。
在Limited Photo
模式下,有几个API需要注意:
使用PHAssetCreationRequests
来创建的资源默认是会添加在用户允许的集合当中
- 不能获取以及创建相册
- 不能访问用户 iCloud 共享的相册
- 不能访问用户iCloud共享的相册
如果App中不需要很复杂的相册读写功能,只想浏览、选择图片,不需要定制页面,iOS14后可以直接使用PHPicker
。