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簡介
-
這是一個支持照片編輯擴展的框架亿胸。請查閱 Photos framework 文檔坯钦。 ?