ALAssetsLibrary學習-訪問相冊所有相片


ALAssetsLibrary提供了我們對iOS設備中的相片、視頻的訪問飒赃,而平常我們常用UIImagePickerController類來完成,但有時這個類并不能滿足我們的需求棚唆,比如獲取或者修改相片的exif信息等洽蛀。 詳情請查閱: 官方文檔


!注意

ALAssetsLibrary庫是iOS4之后可用的见妒,但從最新的官方文檔來看孤荣,iOS9之后這個庫被廢棄了,當然有些功能還是可以用的须揣,但是官方建議使用他們提供的Photos Framework[1]盐股。

AssetsLibrary組成

  • AssetsLibrary: 代表整個設備中的資源庫(照片庫),通過 AssetsLibrary 可以獲取和包括設備中的照片和視頻;
  • ALAssetsGroup:映射照片庫中的一個相冊耻卡,通過 ALAssetsGroup 可以獲取某個相冊的信息疯汁,相冊下的資源,同時也可以對某個相冊添加資源;
  • ALAsset: 映射照片庫中的一個照片或視頻卵酪,通過 ALAsset 可以獲取某個照片或視頻的詳細信息幌蚊,或者保存照片和視頻;
  • ALAssetRepresentation:ALAssetRepresentation 是對 ALAsset 的封裝(但不是其子類)溃卡,可以更方便地獲取 ALAsset 中的資源信息溢豆,每個 ALAsset 都有至少有一個 ALAssetRepresentation 對象,可以通過 defaultRepresentation 獲取塑煎。而例如使用系統(tǒng)相機應用拍攝的 RAW + JPEG 照片沫换,則會有兩個 ALAssetRepresentation臭蚁,一個封裝了照片的 RAW 信息最铁,另一個則封裝了照片的 JPEG 信息讯赏。

獲取exif信息

導入庫文件

使用ALAssetsLibrary需要添加AssetsLibrary.framework然后引入

#import <AssetsLibrary/ALAssetsLibrary.h>

ALAssetsLibrary的使用

首先創(chuàng)建ALAssetsLibrary實例

ALAssetsLibrary *assetsLibrary=[[ALAssetsLibrary alloc] init];

使用- enumerateGroupsWithTypes:usingBlock:failureBlock:方法調用給定的block遍歷相冊,從而可以通過valueForProperty:獲取到asset group的相關信息冷尉,相冊的名字漱挎、類型存儲id雀哨、位置地址磕谅。

  • ALAssetsGroupPropertyName:關鍵字對應相冊名字的property
  • ALAssetsGroupPropertyType:關鍵字對應相冊類型的property
  • ALAssetsGroupPropertyPersistentID:關鍵字對應相冊存儲id的property
  • ALAssetsGroupPropertyURL:關鍵字對應相冊存儲位置地址的property
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
 if (group) {
 [groupArray addObject:group]; // 通過這個可以知道相冊的名字,從而也可以知道安裝的部分應用 
//例如 Name:美顏相機, Type:Album, Assets count:1
 NSLog(@"===>%@",group);
 NSLog(@"ALAssetsGroupPropertyName:%@",[group valueForProperty:ALAssetsGroupPropertyName]); 
} 
} 
failureBlock:^(NSError *error) {
 NSLog(@"Group not found!\n");
 }];

然后使用enumerateAssetsUsingBlock:方法遍歷ALAssetsGroup雾棺,從而通過valueForProperty:可以獲取到asset的相關信息:地理位置信息膊夹、創(chuàng)建時間描述信息捌浩、url路徑等放刨。

  • ALAssetPropertyLocation:對應asset的地理位置信息
  • ALAssetPropertyDuration:type為視頻的話,對應視頻的時長
  • ALAssetPropertyDate:對應asset的創(chuàng)建時間
  • ALAssetPropertyRepresentations:對應asset的描述信息
  • ALAssetPropertyAssetURL:對應asset的url路徑- ......
 [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 
if (result) {
 [imageArray addObject:result]; 
NSLog(@"~~~~~~%@",result);
NSLog(@"ALAssetPropertyLocation:%@",[result valueForProperty:ALAssetPropertyLocation]); //如果資源是視頻尸饺,查看視頻的時長 
NSLog(@"ALAssetPropertyDuration:%@",[result valueForProperty:ALAssetPropertyDuration]); //查看資源的方向进统,圖片的旋轉方向
NSLog(@"ALAssetPropertyOrientation:%@",[result valueForProperty:ALAssetPropertyOrientation]); //查看資源的創(chuàng)建時間 
NSLog(@"ALAssetPropertyDate:%@",[result valueForProperty:ALAssetPropertyDate]); //查看資源的描述信息 
NSLog(@"ALAssetPropertyRepresentations:%@",[result valueForProperty:ALAssetPropertyRepresentations]); 
NSLog(@"ALAssetPropertyURLs:%@",[result valueForProperty:ALAssetPropertyURLs]); 
NSLog(@"ALAssetPropertyAssetURL:%@",[result valueForProperty:ALAssetPropertyAssetURL]);//查看資源的url路徑  
} }];

AssetsLibrary的一些注意點:

AssetsLibrary實例需要使用強引用

當我們把這些獲取到的相冊和資源儲存到數(shù)組時,實際上只是在數(shù)組中儲存了這些相冊和資源在 AssetsLibrary 中的引用(指針)浪听,因而無論把相冊和資源儲存數(shù)組后如何利用這些數(shù)據(jù)螟碎,都首先需要確保 AssetsLibrary 沒有被 ARC 釋放,否則把數(shù)據(jù)從數(shù)組中取出來時迹栓,會發(fā)現(xiàn)對應的引用數(shù)據(jù)已經(jīng)丟失掉分。所以,建議在使用 AssetsLibrary 的 viewController 中迈螟,把 AssetsLibrary 作為一個強持有的 property 或私有變量叉抡,避免在枚舉出 AssetsLibrary 中所需要的數(shù)據(jù)后,AssetsLibrary 就被 ARC 釋放了答毫。

AssetsLibrary遵循寫入優(yōu)先原則

寫入優(yōu)先也就是說褥民,在利用 AssetsLibrary 讀取資源的過程中,有任何其它的進程(不一定是同一個 App)在保存資源時洗搂,就會收到 ALAssetsLibraryChangedNotification消返,讓用戶自行中斷讀取操作。

開啟Photo Stream容易導致exception

本質上耘拇,這跟上面的 AssetsLibrary 遵循寫入優(yōu)先原則是同一個問題撵颊。如果用戶開啟了共享照片流(Photo Stream),共享照片流會以 mstreamd 的方式“偷偷”執(zhí)行惫叛,當有人把相片寫入 Camera Roll 時倡勇,它就會自動保存到 Photo Stream Album 中,如果用戶剛好在讀取嘉涌,那就跟上面說的一樣產(chǎn)生 exception 了妻熊。我們可以通過下面的接口在需要保護的時刻關閉監(jiān)聽共享照片流產(chǎn)生的頻繁通知信息夸浅。

[ALAssetsLibrary disableSharedPhotoStreamsSupport];

擴展

除了使用ALAssetsLibrary和Photos Framework,還可以使用imageIO這個偏底層的框架來獲取圖片的exif信息,同時這個框架也可對exif信息進行修改扔役。傳送門

參考鏈接:ALAssetsLibrary獲取所有圖片帆喇、ALAssetsLibrary學習總結iOS開發(fā)之照片框架詳解

下一篇:PhotoKit簡介


  1. 這是一個支持照片編輯擴展的框架亿胸。請查閱 Photos framework 文檔坯钦。 ?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侈玄,隨后出現(xiàn)的幾起案子婉刀,更是在濱河造成了極大的恐慌,老刑警劉巖序仙,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路星,死亡現(xiàn)場離奇詭異,居然都是意外死亡诱桂,警方通過查閱死者的電腦和手機洋丐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挥等,“玉大人友绝,你說我怎么就攤上這事「尉ⅲ” “怎么了迁客?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辞槐。 經(jīng)常有香客問我掷漱,道長,這世上最難降的妖魔是什么榄檬? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任卜范,我火速辦了婚禮,結果婚禮上鹿榜,老公的妹妹穿的比我還像新娘海雪。我一直安慰自己,他們只是感情好舱殿,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布奥裸。 她就那樣靜靜地躺著,像睡著了一般沪袭。 火紅的嫁衣襯著肌膚如雪湾宙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音侠鳄,去河邊找鬼嗡害。 笑死,一個胖子當著我的面吹牛畦攘,可吹牛的內容都是我干的。 我是一名探鬼主播十电,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼知押,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹃骂?” 一聲冷哼從身側響起台盯,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畏线,沒想到半個月后静盅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡寝殴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年蒿叠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚣常。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡市咽,死狀恐怖,靈堂內的尸體忽然破棺而出抵蚊,到底是詐尸還是另有隱情施绎,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布贞绳,位于F島的核電站谷醉,受9級特大地震影響,放射性物質發(fā)生泄漏冈闭。R本人自食惡果不足惜俱尼,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萎攒。 院中可真熱鬧号显,春花似錦、人聲如沸躺酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹应。三九已至揽碘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雳刺。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工劫灶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掖桦。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓本昏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枪汪。 傳聞我的和親對象是個殘疾皇子涌穆,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容