iOS封装相册API的tips

本文分享了iOS自定义相册时封装系统API遇到的问题及解决方案,包括相册权限判断、资源类型识别(特别是GIF)、获取缩略图、预览资源、资源本地状态检查、LIVE Photo导出以及资源筛选等关键步骤,帮助开发者规避常见陷阱。
摘要由CSDN通过智能技术生成

首先几乎每个App都用到了自定义相册的展示,系统在iOS8以后提供了photos.framework来供我们与相册交互。既然要自定义相册,最先要做的就是封装获取相册相关的API。现在已经有很多开源的相册项目,为什么我们还要自己造轮子呢,其实大部分的开源项目都可以实现大部分的功能,但确实无法满足所有的需求,所以该踩的坑还是要踩,以下就结合我们项目中遇到的一些问题,分享一些tips。

1.相册权限的判断

  当用户点击相册时,其实有三种情况。情况1,已经授权过了;情况2.之前拒绝授权;情况3,之前没有决定过。针对于情况1,我们直接打开就可以了。针对于情况2,我们可以弹框提示,然后跳转到系统设置里面,引导用户打开。针对于情况3,我们需要弹框,然后再用户做出选择之后,在根据是情况1、还是情况2来进行不同的操作。

+ (void)requestAlbumAuthorization:(void (^)(BOOL isAuthorized))block ifAlert:(BOOL)ifAlert
{
    PHAuthorizationStatus photoAuthorStatus = [PHPhotoLibrary authorizationStatus];
    if (photoAuthorStatus == PHAuthorizationStatusAuthorized)
        block ? block(YES) : nil;
    else if (photoAuthorStatus == PHAuthorizationStatusDenied)
    {
        if (ifAlert)
            [AlertManager showAlertControllerWithType:AlertManagerTypeOpenAlbumFail];
        block ? block(NO) : nil;
    }
    else
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                if (status == PHAuthorizationStatusAuthorized)
                    block ? block(YES) : nil;
                else
                {
                    if (ifAlert)
                        [AlertManager showAlertControllerWithType:AlertManagerTypeOpenAlbumFail];
                    block ? block(NO) : nil;
                }
            });
        }];
}

2.如何判断相册资源的类型

  首先我们知道每一个相册资源都是PHAsset对象,而系统提供了mediaType这个属性来告诉我们判断该资源是图片、视频还是音频。但是针对于图片来说,又可能是静态图、GIF或者LIVE Photo。虽然又可以通过mediaSubtypes是否等于 PHAssetMediaSubtypePhotoLive 来判断图片是否是LIVE Photo。但如何判断图片是否是GIF通过系统的API就无能为力了。

那么如何判断PHAsset对象是不是GIF呢??

其实我们可以通过PHAsset得到对应的资源对象PHAssetSource,该对象的uniformTypeIdentifier属性(即UTI)来判断是否是GIF(com.compuserve.gif)

- (BOOL)isImageAssetGIF:(PHAsset *)asset
{
    PHAssetResource * resource = [[PHAssetResource assetResourcesForAsset:asset] firstObject];
    return [resource.uniformTypeIdentifier isEqualToString:@"com.compuserve.gif"];
}

原理如此,但是获取PHAssetResource太慢,如果放在主线程同步获取类型的话,会造成卡顿。这里可以通过KVC来获取uniformTypeIdentifier。完整的获取类型代码如下:

+ (AssetMediaType)getTypeForAsset:(PHAsset *)asset
{
    switch (asset.mediaType)
    {
        case PHAssetMediaTypeVideo:
            return AssetMediaTypeVideo;
        case PHAssetMediaTypeImage:
        {
            if (asset.mediaSubtypes == PHAssetMediaSubtypePhotoLive)
                return AssetMediaTypeLivePhoto;
            if ([[asset valueForKey:@"uniformTypeIdentifier"] isEqualToString:@"com.compuserve.gif"])
                return AssetMediaTypeGIF;
            return AssetMediaTypeStaticGraph;
        }
        default:
            return AssetMediaTypeUnknown;
    }
}

3.获取资源的缩略图

  一般情况下,在某个相册的列表页,会展示大量的图片,而相册中的照片的分辨率几乎都是几千*几千的,而我们在列表页只需要展示宽度为100~200像素的图片即可,那么就需要我们去获取缩略图。获取缩略图的方法如下,具体注意事项可参考代码中的注释。

+ (PHImageRequestID)requestImageForAsset:(PHAsset *)asset size:(CGSize)size resizeMode:(PHImageRequestOptionsResizeMode)resizeMode needsDegrade:(BOOL)needsDegrade completion:(void (^)(UIImage * image, NSDictionary * info))completion
{
    PHImageRequestOptions * option = [[PHImageRequestOptions alloc] init];
    option.resizeMode = resizeMode; //  resizeMod
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值