美文网首页
iOS14 相册更新

iOS14 相册更新

作者: whlpkk | 来源:发表于2021-10-08 11:31 被阅读0次

前言

苹果在iOS14继续加强了对用户隐私的保护,有时需求只是想选择一张相册中的图片,但是需要对App开发整个照片库的权限,一些私密照片也可以被App读取到,这样很不合理!因此iOS14中对相册权限新增了 "Limited Photo Library Access" 模式,这样用户可以控制App允许访问的照片。下面简单介绍下如何适配iOS14相册新增的功能。

PHPhotoLibrary新增API

PHPhotoLibrary用于获取查看相册权限,处理相册变化,注册监听相册变化,监听用户添加/删除了哪些照片。

  • 权限枚举
typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
    PHAuthorizationStatusNotDetermined = 0, // 用户未作出选择
    PHAuthorizationStatusRestricted,        // 此App无权限访问照片数据
    PHAuthorizationStatusDenied,            // 用户已明确拒绝此应用程序访问照片数据
    PHAuthorizationStatusAuthorized,        // 用户已授权此应用程序访问照片数据
    PHAuthorizationStatusLimited API_AVAILABLE(ios(14)), // 用户已授权此应用程序进行有限照片库访问
};  
  • 权限等级枚举
typedef NS_ENUM(NSInteger, PHAccessLevel) {
    PHAccessLevelAddOnly = 1,     // 仅允许添加
    PHAccessLevelReadWrite = 2,   // 读写
} API_AVAILABLE(macos(11.0), ios(14), tvos(14));
  • 权限获取

新权限获取:增加了权限等级

// 获取指定等级的权限
+ (PHAuthorizationStatus)authorizationStatusForAccessLevel:(PHAccessLevel)accessLevel API_AVAILABLE(macosx(11.0), ios(14), tvos(14));

// 请求指定等级的权限
+ (void)requestAuthorizationForAccessLevel:(PHAccessLevel)accessLevel handler:(void(^)(PHAuthorizationStatus status))handler API_AVAILABLE(macosx(11.0), ios(14), tvos(14)) NS_SWIFT_ASYNC(2);

旧权限获取:在iOS14中已经废弃,建议使用上面的新API

+ (PHAuthorizationStatus)authorizationStatus API_DEPRECATED_WITH_REPLACEMENT("+authorizationStatusForAccessLevel:", ios(8, API_TO_BE_DEPRECATED), macos(10.13, API_TO_BE_DEPRECATED), tvos(10, API_TO_BE_DEPRECATED));

+ (void)requestAuthorization:(void(^)(PHAuthorizationStatus status))handler API_DEPRECATED_WITH_REPLACEMENT("+requestAuthorizationForAccessLevel:handler:", ios(8, API_TO_BE_DEPRECATED), macos(10.13, API_TO_BE_DEPRECATED), tvos(10, API_TO_BE_DEPRECATED));

注意:如果仍使用旧的API未适配iOS14新特性,这时获取相册权限状态,就算在Limited 模式下也会返回Authorized

新增 PHPickerController

iOS 14 中系统新增了一个图片选择器PHPicker ( iOS14 以上使用),官方建议使用 PHPicker 来替代原有的 UIImagePickerController ( iOS14 以下使用)进行图片选择 。UIImagePickerController 只能选中一张图片已经不符合需求了,将逐渐被废弃替换。

  • 使用PHPickerController
1.png
  1. 使用 PHPickerConfiguration 配置 PHPicker,键 selectionLimit 设置为 n 表示最多可选中 n 张图片,0 为 maximum,默认值为1;使用 filter 设置想要的相册资源类型,包括 imagesFilter、videosFilter、livePhotosFilter,亦可以设置为数组@[ videoFilter , livePhotosFilter ]显示多种类型.
  2. 设置 PHPickerViewControllerDelegate 代理,接收选中照片后的回调;
  3. 在代理回调 piscker:didFinishPicking: 中处理返回结果 PHPickerResult;
  • PHPickerController的优点
  1. PHPicker 使用的独立的进程获取相册数据,所以不会影响App的性能,解决了之前自定义相册,图片吃内存的问题。

  2. 因为 PHPicker 使用的系统独立进程,当用户选中所选照片时,也只会回调相应照片的图片信息,所以不需要App申请权限,也不受新增的限制模式的影响。换句话说,如果只使用了 PHPicker ,则完成不需要在代码里面申请权限,info.plist 文件里面也不需要申请权限,直接使用即可。

  3. 支持多选。

  4. 支持按照 image,video,livePhotos 类型进行选择。

  5. 支持搜索,页面上有搜索框。

  • PHPickerController的缺点
  1. 不支持选中图片的编辑,例如选中后裁剪成正方形,需要自定义实现了;
  2. 不能直接获取到 PHAsset ,如果想要获取,则需要获取用户权限,使用户授权。
  • PHPickerController 代码 Demo 演示
- (void)showPhotoLibrary {
    UIViewController *topVC = [UIViewController lg_currentViewController];
    if (@available(iOS 14, *)) {
        PHPickerConfiguration *config = [[PHPickerConfiguration alloc] init];
        config.selectionLimit = 1;
        config.filter = [PHPickerFilter imagesFilter];
        PHPickerViewController *pickVC = [[PHPickerViewController alloc] initWithConfiguration:config];
        pickVC.delegate = self;
        [topVC presentViewController:pickVC animated:YES completion:nil];
    }
}


- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results API_AVAILABLE(ios(14)) {
    if (results == nil || results.count <= 0) {
        [LGToastView showCenterWithTitle:@"选择照片失败" hideDelay:1.5];
    } else {
        PHPickerResult *result = [results firstObject];
        if ([result.itemProvider canLoadObjectOfClass:[UIImage class]]) {
            __weak __typeof(self)weakSelf = self;
            [result.itemProvider loadObjectOfClass:[UIImage class] completionHandler:^(__kindof id<NSItemProviderReading>  _Nullable object, NSError * _Nullable error) {
                if (!error) {
                    UIImage *tmpImage = (UIImage *)object;
                    !weakSelf.chooseImageComplete ?: weakSelf.chooseImageComplete(tmpImage);
                } else {
                    [LGToastView showCenterWithTitle:@"选择照片失败" hideDelay:1.5];
                }
            }];
        } else {
            [LGToastView showCenterWithTitle:@"选择照片失败" hideDelay:1.5];
        }
    }
    [picker dismissViewControllerAnimated:YES completion:nil];
}

参考资料

WWDC视频: Meet the new Photos picker

相关文章

  • iOS14 相册更新

    前言 苹果在iOS14继续加强了对用户隐私的保护,有时需求只是想选择一张相册中的图片,但是需要对App开发整个照片...

  • iOS14 limited 相册权限和PHPickerConfi

    获取相册权限 iOS14相册整理包含 plist设置,iOS相册权限查询和调取处理(兼容iOS14使用PHPick...

  • 关于iOS14 访问相册权限问题

    iOS14选择相册适配问题。 在iOS14之后新增了Limited Photo Library Access 模式...

  • iOS笔记-相册权限(选中的照片)

    一、iOS14更新了相册权限的获取,在原来基础上添加了一个“选中的照片”,之前的获取相册读写权限的方法在iOS14...

  • iOS14适配 web

    关于iOS14的更新主要是隐私方面的更新,原生app方面关于隐私(定位、相册等)的文章已经很多了,本文写一个我发现...

  • 关于ios13升级到ios14企业APP出现无法安装解决方案

    声明:此方案适用于app ios13 下载OK,但是ios14 下载同样资源就提示安装失败! 在IOS14更新完了...

  • [iOS ]iPhone上画中画效果实现(iOS14)

    前言 今天更新了iOS14,iOS14可以支持画中画功能,闲着无聊,来写个代码实现。 话不多说,先上Demo Pi...

  • iOS 14适配指北

    [TOC] iOS14适配指北 1. 隐私适配 iOS14最重要的更新之一:用户隐私和安全。 1.1 广告标识符I...

  • presentLimitedLibraryPickerFromV

    iOS14相册权限进行了改变,下面是调用起系统相册的方式,弹起是正常的,但是界面有比较奇怪的变化,搜索栏是透明的,...

  • iOS14适配

    开发中遇到的问题, iOS14已经发布,记录一下开发中遇到的问题.不定时更新,欢迎大家评论补充. iOS14适配总...

网友评论

      本文标题:iOS14 相册更新

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