PHPhotoLibrary的簡單使用--保存圖片罩旋、視頻到相冊

不知道你們有沒有這樣的僥幸心理:Apple更新了新的框架API,舊的雖然被標為廢棄了但還是能用眶诈,就一直用著舊的偷懶不去改最新的涨醋。有句話說得好:不是不報,時候未到册养。我最近遇到了要報的懶东帅。

在iOS里,保存圖片到相冊有一個簡單的UIImage的方法:
UIImageWriteToSavedPhotosAlbum(_image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
然后需要實現(xiàn)上面SEL里的回調球拦,一個系統(tǒng)的方法:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
      if (error) {
          NSLog(@"保存失敗");
      } else {
          NSLog(@"保存成功");
      }
  }

當然這個只能簡單的保存圖片到默認的系統(tǒng)相冊中靠闭,如果要創(chuàng)建自己的相冊,就需要用ALAssetsLibrary框架:

// 先保存圖片
- (void)saveImage:(UIImage*)image toAlbum:(NSString *)albumName{  
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];  
    [assetsLibrary writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) {  
        if (error) {  
            NSLog(@"Save image fail:%@",error);  
        }else{  
            NSLog(@"Save image succeed."); 
            [self addAssetURL:assetURL toAlbum:albumName withAssestLibrary:assetsLibrary completionBlock:(SaveRecordCompletion)completionBlock failBlock:(void(^)(NSError *error))failBlock] ;
        }  
    }];  

// 再添加到指定相冊
-(void)addAssetURL:(NSURL*)assetURL toAlbum:(NSString*)albumName withAssestLibrary:(ALAssetsLibrary *)assetsLibrary completionBlock:(SaveRecordCompletion)completionBlock failBlock:(void(^)(NSError *error))failBlock
{
    __block BOOL albumWasFound = NO;
    
    //遍歷所有的相冊
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        //compare the names of the albums
        if ([albumName compare: [group valueForProperty:ALAssetsGroupPropertyName]] == NSOrderedSame)
        {
            //找到名字為albumName的相冊
            albumWasFound = YES;
            
            //get a hold of the photo's asset instance
            [assetsLibrary assetForURL: assetURL resultBlock:^(ALAsset *asset) {
                //add photo to the target album
                //NSAssert(asset != nil, @"asset不能為空");
                [group addAsset: asset];
            } failureBlock: nil];
            *stop = YES;
        }
        
        if (group==nil && albumWasFound==NO)
        {
            __weak ALAssetsLibrary* weakAssetsLibrary = assetsLibrary;
            
            [self addAssetsGroupAlbumWithName:albumName resultBlock:^(ALAssetsGroup *group) {
                
                [weakAssetsLibrary assetForURL: assetURL resultBlock:^(ALAsset *asset)
                 {
                     NSAssert(asset != nil, @"asset不能為空");
                     //add photo to the newly created album
                     [group addAsset: asset];

                 } failureBlock: nil];
                
            } failureBlock: nil];
            *stop = YES;
        }
    } failureBlock:failBlock];
}

因為ALAssetsLibrary的API在iOS9之后被標位棄用了坎炼,所以會有出錯的風險愧膀。我遇到的問題是,當開啟使用iCloud圖庫時谣光,圖片只會保存在系統(tǒng)默認的相冊下檩淋,保存不到我們應用的相冊下,關閉iCloud時就不會有這種問題(在iOS10、11下出現(xiàn)的)蟀悦。所以懷疑到應該是在開啟iCloud時媚朦,蘋果做了一些操作導致舊的框架不支持了。

下面主要看下在iOS8后出現(xiàn)的Photos框架的簡單使用日戈。

首先询张,我們可以創(chuàng)建一個helpe類,用來單獨做對相冊的操作(比如我的叫SRHPhotoHelper浙炼,當然你可以按照自己的想法隨意寫)份氧。
直接上代碼:

+ (void)srh_saveImage:(UIImage *)image completionHandle:(void (^)(NSError *, NSString *))completionHandler {
    // 1. 獲取照片庫對象
    PHPhotoLibrary *library = [PHPhotoLibrary sharedPhotoLibrary];
    
    // 假如外面需要這個 localIdentifier ,可以通過block傳出去
    __block NSString *localIdentifier = @"";
    
    // 2. 調用changeblock
    [library performChanges:^{
        
        // 2.1 創(chuàng)建一個相冊變動請求
        PHAssetCollectionChangeRequest *collectionRequest = [self getCurrentPhotoCollectionWithAlbumName:SRHAlbumName];
        
        // 2.2 根據(jù)傳入的照片弯屈,創(chuàng)建照片變動請求
        PHAssetChangeRequest *assetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
        
        // 2.3 創(chuàng)建一個占位對象
        PHObjectPlaceholder *placeholder = [assetRequest placeholderForCreatedAsset];
        localIdentifier = placeholder.localIdentifier;
        
        // 2.4 將占位對象添加到相冊請求中
        [collectionRequest addAssets:@[placeholder]];
        
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        
        if (error) {
            [iConsole log:@"保存照片出錯>>>%@", [error description]];
            completionHandler(error, nil);
        } else {
            completionHandler(nil, localIdentifier);
        }
    }];
}
+ (PHAssetCollectionChangeRequest *)getCurrentPhotoCollectionWithAlbumName:(NSString *)albumName {
    // 1. 創(chuàng)建搜索集合
    PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    
    // 2. 遍歷搜索集合并取出對應的相冊蜗帜,返回當前的相冊changeRequest
    for (PHAssetCollection *assetCollection in result) {
        if ([assetCollection.localizedTitle containsString:albumName]) {
            PHAssetCollectionChangeRequest *collectionRuquest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
            return collectionRuquest;
        }
    }
    
    // 3. 如果不存在,創(chuàng)建一個名字為albumName的相冊changeRequest
    PHAssetCollectionChangeRequest *collectionRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName];
    return collectionRequest;
}

具體的講解可以自己去查API或者看一下這篇文章资厉、這篇文章厅缺。后續(xù)我會把取相冊圖片、視頻的代碼分享出來酌住,包括完整的demo店归。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酪我,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌且叁,老刑警劉巖都哭,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逞带,居然都是意外死亡欺矫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門展氓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆趴,“玉大人,你說我怎么就攤上這事遇汞∥疵茫” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵空入,是天一觀的道長络它。 經(jīng)常有香客問我,道長歪赢,這世上最難降的妖魔是什么化戳? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮埋凯,結果婚禮上点楼,老公的妹妹穿的比我還像新娘扫尖。我一直安慰自己,他們只是感情好掠廓,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布换怖。 她就那樣靜靜地躺著,像睡著了一般却盘。 火紅的嫁衣襯著肌膚如雪狰域。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天黄橘,我揣著相機與錄音兆览,去河邊找鬼。 笑死塞关,一個胖子當著我的面吹牛抬探,可吹牛的內容都是我干的。 我是一名探鬼主播帆赢,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼小压,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了椰于?” 一聲冷哼從身側響起怠益,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘾婿,沒想到半個月后蜻牢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡偏陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年抢呆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笛谦。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡抱虐,死狀恐怖,靈堂內的尸體忽然破棺而出饥脑,到底是詐尸還是另有隱情恳邀,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布好啰,位于F島的核電站轩娶,受9級特大地震影響,放射性物質發(fā)生泄漏框往。R本人自食惡果不足惜鳄抒,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧许溅,春花似錦瓤鼻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至并蝗,卻和暖如春祭犯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滚停。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工沃粗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人键畴。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓最盅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親起惕。 傳聞我的和親對象是個殘疾皇子涡贱,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容

  • 一. 最簡單的保存函數(shù) UIImage的函數(shù)來保存圖片較為簡單, 只需要一個函數(shù)一個方法就可以保存但是不能創(chuàng)建相冊...
    面糊閱讀 12,874評論 1 55
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,274評論 25 707
  • 積極主動為自己創(chuàng)造機會;以終為始惹想,有了堅定的目標问词;要事第一,有了做事的效率嘀粱;但是還需要以下幾點: 雙贏思維 記得之...
    小胖紅閱讀 409評論 4 6
  • 5月1日——5月13日《挑戰(zhàn)自卑》 這是我20年前買的一本書戏售,是奧地利著名心理學家阿德勒所著。因為當時有很深的...
    李世男閱讀 218評論 0 0
  • 第2節(jié)通過直接喚醒喊停失控的理智使情緒得以緩解使場面得以控制草穆;第3節(jié)由于誘發(fā)式負面情緒導致長期積壓的情緒低潮期,通...
    85后栗子閱讀 255評論 0 1