iPhoneのカメラロールにある写真や動画データをアプリ内で使いたい時にはAssetsLibrary.frameworkというものを使用します。今回はその概要と使い方についてまとめました。
AssetsLibrary.frameworkとは
[公式]Assets Library Framework Reference
iOS端末内に保存されている写真/動画にアクセスするためのフレームワークです。このフレームワークの重要なクラスとして以下のようなものがあります。
- ALAssetsLibrary
フォトライブラリに相当 - ALAssetsGroup
各アルバムに相当 - ALAsset
各写真/動画に相当
クラスの説明がざっくりしててやや不正確ですが、直感的にはこんな感じです。図にすると以下のような感じ。
このフレームワークを使って何ができるかというと、例えば
- カスタムのUIImagePickerが作れる(複数選択できるものなど)
- 写真/動画のメタデータが取得できる
- カメラロール内のデータを自分のアプリ内で管理できる
などです。
各クラスの概要と使い方
ALAsset
ALAssetは1つの写真/動画に相当しますが、写真/動画データ本体以外にも以下のようなデータを内包しています。
- 各種メタデータ(サイズ, 撮影日時, 位置情報, Exifなど)
- ライブラリ内でのURL(assets-library://asset/asset.jpg?id=…)
- サムネイル画像, フルスクリーンサイズ画像
各種データの取得例
1 2 3 4 |
[[asset defaultRepresentation] metadata] //メタデータ(NSDictionary*型) [[asset defaultRepresentation] url] //AssetURL(NSURL*型) [asset thumbnail] //サムネイル画像(CGImageRef型) [[asset defaultRepresentation] fullScreenImage] //フルスクリーンサイズ画像(CGImageRef型) |
ALAssetsGroup
ALAssetsGroupは写真アプリ内のアルバムに相当します。このクラスがもつデータには以下のようなものがあります。
- アルバム名
- ライブラリ内でのURL
- ポスターイメージ(アルバムの代表画像)
また
1 |
– enumerateAssetsUsingBlock: |
等のメソッドでグループ内のAssetを取り出すことができます。
ALAssetsLibrary
ライブラリへのアクセスをコントロールする親玉のクラスです。主要なメソッドをいくつか紹介します。
1 |
– enumerateGroupsWithTypes:usingBlock:failureBlock: |
指定したタイプのAssetsGroupを全て取得します。
1 |
– assetForURL:resultBlock:failureBlock: |
AssetのURLを渡すとライブラリからAssetを取ってきます。
1 |
– groupForURL:resultBlock:failureBlock: |
AssetsGroupのURLを渡すとライブラリからAssetsGroupを取ってきます。
他にも写真/動画をライブラリに保存したり、アルバムを増やしたりするメソッドがあります。
概要はこんなもんです。
【おまけ】AssetsAccessorというクラスをつくりました
AssetsLibraryを利用する時に、ライブラリにアクセスするためのクラスが必要だなと思ってAssetsAccessorというクラスを作ってみました。自分にとって便利かなと思うメソッド実装していますが、人によって色々だと思うので、もしこのクラスを使う人がいれば適宜メソッドを追加したり修正したりしてくれたらと思います。
シングルトン的な
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// AssetsAccessor.m static ALAssetsLibrary *assetsLibrary; - (id)init { if (self = [super init]) { if(assetsLibrary==nil) { assetsLibrary = [[ALAssetsLibrary alloc] init]; } _assetsLibrary = assetsLibrary; } return self; } |
複数のViewControllerなどからライブラリにアクセスする場合でもALAssetLibraryのインスタンスは一つでいいので、静的変数として宣言し、1つのALAssetLibraryインスタンスを、複数のAssetAccessorインスタンス間で共有するようにしています。(AssetAccessorクラスがシングルトンクラスな訳ではありません)
メソッド
– (void)getAssetByURL:(NSURL *)assetURL
AssetURLを渡すとライブラリから非同期にAssetを取ってきて、下のデリゲートメソッドを呼びます。
1 |
- (void)assetDidLoadByURL:(ALAsset *)asset |
取得したAssetはデリゲートメソッドの引数に渡されます。
– (void)getAssetsByURLs:(NSArray *)assetURLs
複数のAssetURL(NSURL *型)を配列にして渡すとライブラリから非同期にAssetを取ってきて、下のデリゲートメソッドを呼びます。
1 |
- (void)assetsDidLoadByURLs:(NSArray *)assets |
取得した複数のAssetは配列としてデリゲートメソッドの引数に渡されます。
– (void)getAssetsGroupWithTypes:(ALAssetsGroupType)groupTypes
指定のタイプに該当するAssetsGroupを全てライブラリから非同期に取ってきて、下のデリゲートメソッドを呼びます。
1 |
- (void)assetsGroupsDidLoad:(NSArray *)groups |
取得したAssetsGroupは配列としてデリゲートメソッドの引数に渡されます。
– (void)getAssetsFromGroup:(ALAssetsGroup *)group withFilter:(ALAssetsFilter *)filter;
AssetsGroup内のAssetを非同期に取ってきて、下のデリゲートメソッドを呼びます。
1 |
- (void)assetsDidLoadByGroup:(NSArray *)assets |
取得したAssetは配列としてデリゲートメソッドの引数に渡されます。引数にALAssetsFilterを指定すると、AssetsGroup内でフィルターにひっかかったAssetだけを取得してきます。
使い方
実際の使い方はgithubにあるデモプロジェクトを見てください。デモでは自前のイメージピッカーを実装して、選択したAssetオブジェクトを取得しています。またそのAssetのURLを用いて再度ライブラリにアクセスしてAssetを取得し画像を表示します(あまり意味の無いことをやっていますが)。
基本的な使い方は使用したいクラスで
1 |
assetsAccessor = [[AssetsAccessor alloc] initWithDelegate:self]; |
のようにインスタンスを生成して各種メソッドを呼び、それに対応するデリゲートメソッドを実装する感じです。
デリゲートを使用するので、実装先のクラスのヘッダでは
1 2 3 |
@interface ViewController : UIViewController <AssetsAccessorDelegate>; { AssetsAccessor *assetsAccessor; } |
のように<AssetsAccessorDelegate>を追加して下さい。
おわりに
iOSアプリでカメラロールの写真を使ってあれやこれやする時はAssetsLibraryを使わなきゃいけなくなるのですが、調べても詳しい記事が少なかったので書かせてもらいました。間違ってる部分もあるかもしれないので、何かあったら教えてください!
もりしん(@morishin127)
はじめまして、みやびプリンと申します。
ALAssetsに関する記事や書籍が少ない中、本当にすごいと思いました。
貴殿のクラスを使わさせていただいておりますが、
非常に使いやすく、わかりやすいもので、大変重宝しております。
今後ともご活躍を期待しております。