ios使用PhAsset

本篇只讨论PhAsset,关于ALAsset,网上很多资料。这里就不再讨论。
曾几何时,项目中访问IPhone的系统相册,选中需要上传的照片或视频,使用webdav上传到自己的私有云中的需求。

从ios8开始,苹果推出了PhAsset,ios9以后ALAsset就不能在使用。我相信大家都用惯了ALAsset,里面的方法特别的好用,尤其是获取相册中没有照片的路径的时候,更是怀恋。
PhAsset获取照片、视频在相册中的路径的时候,就没有那么的方便。


访问相册一般就是以下几个步骤:
无非就是申请访问相册的权限,获取相册分组
获取相册中的相册组
点击进入到具体的相册中组中,选中需要上传的图片进行上传

马上想到去找度娘、简书。但是,不知道是我搜索的姿势不对,还是什么原因,并没有找到获取该对象在相册中的路径、要不然就是不能用的方法。

好了废话少说,进入正题,具体分以下几个步骤:
1)申请访问相册的权限(每次进入去访问系统相册的时候,都是需要去查看权限)
2)获取相册中的所有的照片、视频
3)获取具体某一个对象的路径

一:申请权限

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {        
        //没有授权
        if(status== PHAuthorizationStatusRestricted) {
            complate(nil);
        }
        else if (status==PHAuthorizationStatusDenied) {
            complate(nil);
        }
        else {//已经授权
            
        }
}];

1)如果没有授权,需要提示用户去授权,否则访问不了相册

  NSDictionary *info = [[NSBundle mainBundle] infoDictionary];
  NSString *appName  = [info objectForKey:@"CFBundleDisplayName"];
  appName            = appName ? appName : [info objectForKey:@"CFBundleName"];                        
  NSString *message  = [NSString stringWithFormat:@"请在系统设置中允许“%@”访问照片!", appName];
  [[[UIAlertView alloc]initWithTitle:@"无法访问照片" message:message delegate:self   cancelButtonTitle:@"我知道了!" otherButtonTitles:nil] show];

二)允许访问后,获取相册中的资源

NSMutableArray<PHAsset *> *assets = [NSMutableArray array];
          
PHFetchOptions *option = [[PHFetchOptions alloc] init];
//ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
PHAssetMediaType type = self.type==5 ? PHAssetMediaTypeImage:PHAssetMediaTypeVideo;
         
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:type options:option];
__weak typeof(self) weakSelf= self;
__strong typeof(weakSelf) strongSelf=weakSelf;
          
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                
          [result enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                   
         PHAsset *asset = (PHAsset *)obj;
         NSInteger type = asset.mediaType;                    
          //照片
         if(strongSelf.type==5&&type==1){
                        
                        [assets addObject:asset];
         }
         else if (strongSelf.type==2&&type==2){
                        
                    [assets addObject:asset];
                }
         }];
         dispatch_async(dispatch_get_main_queue(), ^{
                    complate(assets);
       });
  });

获取到相册中的资源,接下来就是获取到具体某一个对象,显示到界面上
三)获取具体某一个asset的对象,如果是视频,那么直接获取首帧的图像

  PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
    /**
     resizeMode:对请求的图像怎样缩放。有三种选择:None,默认加载方式;Fast,尽快地提供接近或稍微大于要求的尺寸;Exact,精准提供要求的尺寸。
     deliveryMode:图像质量。有三种值:Opportunistic,在速度与质量中均衡;HighQualityFormat,不管花费多长时间,提供高质量图像;FastFormat,以最快速度提供好的质量。
     这个属性只有在 synchronous 为 true 时有效。
     */
    option.resizeMode = resizeMode;//控制照片尺寸
    //option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;//控制照片质量
    //option.synchronous = YES;
    option.networkAccessAllowed = YES;
    //param:targetSize 即你想要的图片尺寸,若想要原尺寸则可输入PHImageManagerMaximumSize
    [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
        completion(image);
    }];

获取到需要上传的文件后,那就是需要上传文件
那么上传文件就有两种方法:
1)把需要上传的文件读成data去上传
2)获取在相册中的路径,根据路径去上传

读成data,是比较方便。我们知道,data是需要占我们的运行内存。如果文件比较大的时候,有可能app就因为收到内存警告,占用内存再大,就会导致app奔溃。还要就是,data比较大的时候,上传也是一个比较繁琐的事情。
利用路径去上传文件的话,就不会出现上面说的那种情况,只需要跑一个线程去进行这个任务,我并不用太关心内存的开销。但是,比较麻烦的是,怎么去获取在相册中的路径。网上一直没有找到具体的方法。

解决思路:
1)首先想到了alasset的获取照片思路:

ALAssetRepresentation * representation = [(ALAsset *)asset defaultRepresentation];
                
model.URLInPotoes = [representation url];
model.imageName=[representation filename];
[photos addObject:model];

在phasset中,并没有找到这样的方法。

2)反向获取url
1.获取照片的url

      [[PHImageManager defaultManager] requestImageForAsset:phAsset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
            
            NSURL * url = [info objectForKey:@"PHImageFileURLKey"];
            complate(url);
        }];

2.获取视频的地址

[[PHImageManager defaultManager] requestAVAssetForVideo:phAsset options:nil resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
            
       NSString * url = [[[info objectForKey:@"PHImageFileSandboxExtensionTokenKey"]componentsSeparatedByString:@";"] lastObject];            
       complate(url);
  }];

注意:相册中Icloud类型的照片、视频只是相当于是一个链接,所以并不能获取该类型文件的链接

如果,有好的方法,请联系我。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • 在微博上出现了越来越多的被标记为 Live 的图片,这种图片是一种动图 LivePhoto,长按之后会进行播放。那...
    wvqusrtg阅读 4,777评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 所谓“法身之见不忘”,这仍然是在作功夫,时时处处警觉,不要忘记法身。这是“见、定、行”之行,还在修行的位置上。顿证...
    洞见妙山阅读 1,013评论 0 1
  • 2011年12月25日,领秀开业,也是老朱第一次正式带我去约会。可惜因为没入场券没进去。今天带宝贝和公公婆婆一起去...
    蜗牛慢吞吞简爱阅读 125评论 0 0
  • 小时候,我们都学过寒号鸟的故事,寒号鸟每当下雪的时候总是想着明天天晴时一定垒窝,可到了那个时候,有贪恋暖暖的阳光不...
    1625f17a5577阅读 187评论 0 1