技術ブログメニューコンテンツへスキップホーム【iOS】iPhoneのカメラロールにアクセスするAssetsLibraryについて1件のフィードバックiPhoneのカメラロールにある写真や動画データをアプリ内で使いたい時にはAssetsLibrary.frameworkというものを使用します。今回はその概要と使い方についてまとめました。ReferenceiOS端末内に保存されている写真/動画にアクセスするためのフレームワークです。このフレームワークの重要なクラスとして以下のようなものがあります。ALAssetsLibraryフォトライブラリに相当ALAssetsGroup各アルバムに相当ALAsset各写真/動画に相当クラスの説明がざっくりしててやや不正確ですが、直感的にはこんな感じです。図にすると以下のような感じ。このフレームワークを使って何ができるかというと、例えばカスタムのUIImagePickerが作れる(複数選択できるものなど)写真/動画のメタデータが取得できるカメラロール内のデータを自分のアプリ内で管理できるなどです。各クラスの概要と使い方ALAssetALAssetは1つの写真/動画に相当しますが、写真/動画データ本体以外にも以下のようなデータを内包しています。//フルスクリーンサイズ画像(CGImageRef型)ALAssetsGroupALAssetsGroupは写真アプリ内のアルバムに相当します。このクラスがもつデータには以下のようなものがあります。enumerateAssetsUsingBlock:等のメソッドでグループ内のAssetを取り出すことができます。ALAssetsLibraryライブラリへのアクセスをコントロールする親玉のクラスです。主要なメソッドをいくつか紹介します。enumerateGroupsWithTypes:usingBlock:failureBlock:指定したタイプのAssetsGroupを全て取得します。assetForURL:resultBlock:failureBlock:AssetのURLを渡すとライブラリからAssetを取ってきます。groupForURL:resultBlock:failureBlock:AssetsGroupのURLを渡すとライブラリからAssetsGroupを取ってきます。他にも写真/動画をライブラリに保存したり、アルバムを増やしたりするメソッドがあります。概要はこんなもんです。【おまけ】AssetsAccessorというクラスをつくりましたAssetsLibraryを利用する時に、ライブラリにアクセスするためのクラスが必要だなと思ってAssetsAccessorというクラスを作ってみました。自分にとって便利かなと思うメソッド実装していますが、人によって色々だと思うので、もしこのクラスを使う人がいれば適宜メソッドを追加したり修正したりしてくれたらと思います。self;}複数のViewControllerなどからライブラリにアクセスする場合でもALAssetLibraryのインスタンスは一つでいいので、静的変数として宣言し、1つのALAssetLibraryインスタンスを、複数のAssetAccessorインスタンス間で共有するようにしています。*)assetURLAssetURLを渡すとライブラリから非同期にAssetを取ってきて、下のデリゲートメソッドを呼びます。*)asset取得したAssetはデリゲートメソッドの引数に渡されます。*型)を配列にして渡すとライブラリから非同期にAssetを取ってきて、下のデリゲートメソッドを呼びます。*)assets取得した複数のAssetは配列としてデリゲートメソッドの引数に渡されます。(void)getAssetsGroupWithTypes:(ALAssetsGroupType)groupTypes指定のタイプに該当するAssetsGroupを全てライブラリから非同期に取ってきて、下のデリゲートメソッドを呼びます。*)groups取得したAssetsGroupは配列としてデリゲートメソッドの引数に渡されます。*)filter;AssetsGroup内のAssetを非同期に取ってきて、下のデリゲートメソッドを呼びます。*)assets取得したAssetは配列としてデリゲートメソッドの引数に渡されます。引数にALAssetsFilterを指定すると、AssetsGroup内でフィルターにひっかかったAssetだけを取得してきます。実際の使い方はgithubにあるデモプロジェクトを見てください。デモでは自前のイメージピッカーを実装して、選択したAssetオブジェクトを取得しています。そのAssetのURLを用いて再度ライブラリにアクセスしてAssetを取得し画像を表示します(あまり意味の無いことをやっていますが)。initWithDelegate:self];のようにインスタンスを生成して各種メソッドを呼び、それに対応するデリゲートメソッドを実装する感じです。*assetsAccessor;}のように<AssetsAccessorDelegate>を追加して下さい。おわりにiOSアプリでカメラロールの写真を使ってあれやこれやする時はAssetsLibraryを使わなきゃいけなくなるのですが、調べても詳しい記事が少なかったので書かせてもらいました。【node】port:80で来たのをport:8080に振る。PMはじめまして、みやびプリンと申します。ALAssetsに関する記事や書籍が少ない中、本当にすごいと思いました。非常に使いやすく、わかりやすいもので、大変重宝しております。今後ともご活躍を期待しております。コメントをキャンセルメールアドレスが公開されることはありません。