美文网首页
iOS14适配:

iOS14适配:

作者: 时光啊混蛋_97boy | 来源:发表于2022-07-15 09:40 被阅读0次

原创:知识点总结性文章
创作不易,请珍惜,之后会持续更新,不断完善
个人比较喜欢做笔记和写总结,毕竟好记性不如烂笔头哈哈,这些文章记录了我的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,支持多选,支持搜索,支持按 imagevideolivePhotos 等进行选择。

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的会自动显示PHPickerPHPicker有很多优点:

  • PHPicker 是独立进程,不影响 APP 的性能表现
  • PHPicker 不需要用户授予权限就可以选择用户所有的资源
  • PHPicker 支持多选

第一步:#import <PhotosUI/PhotosUI.h>
第二步:通过PHPickerConfiguration来配置PHPicker,可以设置多选和可以选择的视频、动态图、普通图片。
第三步:添加delegate

只写权限

只写权限的弹窗比读取的简洁,只有允许和不允许需要在Info.plist里配置信息

  • NSPhotoLibraryAddUsageDescription:用户存入相册时的提示信息。
  • NSPhotoLibraryUsageDescription:相册访问权限信息,必须有此项,不然访问相册的时候 APP 会 Crash。

分别使用 AssetsLibraryPhotoKit 以及UIKitUIImageWriteToSavedPhotosAlbum(:::) 写入相册。很容易发现使用 AssetsLibrary 弹出来的是Access的权限,并不是苹果声称的独立弹窗,并且点击 选择照片 后没有弹出系统弹窗选择图片,但是能够正常写入相册。PhotoKitUIKit 的实现符合预期。

读写权限

权限配置与(2)中一致。同样分别使用 AssetsLibraryPhotoKit 来读取相册资源,两者权限弹窗表现一致:选择 Limited Photo 模式,PhotoKit 访问正常,AssetsLibrary 访问相册出错,猜测苹果并未适配 AssetsLibrary,会出现报错信息。AssetsLibrary需要尽快迁移到新的API。模拟器上PhotoKit仍然会返回未开放权限的图片的PHAsset,但是PHAsset的image缺返回为空,真机上没有该问题。

Limited Photo模式下,有几个API需要注意:
使用PHAssetCreationRequests来创建的资源默认是会添加在用户允许的集合当中

  • 不能获取以及创建相册
  • 不能访问用户 iCloud 共享的相册
  • 不能访问用户iCloud共享的相册

如果App中不需要很复杂的相册读写功能,只想浏览、选择图片,不需要定制页面,iOS14后可以直接使用PHPicker

相关文章

网友评论

      本文标题:iOS14适配:

      本文链接:https://www.haomeiwen.com/subject/jnrfirtx.html