Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Photos vs Assets Library - いまさら始めるPhotos.framework

8,094 views

Published on

iOS9から写真映像アクセス用フレームハークはAssetsLibrary.framework は非奨励となりPhotos.framework を使うことが奨励されています。フレームワークを切り替えるとしてAssetsLibrary.frameworkとPhotos.framework の違いは何でしょう? またPhotos.framework を最小限の用途で使う上で知っておくことは何でしょう?スライドで明らかにします。

Published in: Technology
  • Be the first to comment

Photos vs Assets Library - いまさら始めるPhotos.framework

  1. 1. Photos vs AssetLibrary Twitter: @notoroid Twitter: @irimasu
  2. 2. お題目 • 写真関連アクセス用フレームワークPhotos.framework • AssetsLibraryと比べるPhotos.framework • PHImageManager • まとめ
  3. 3. 自己紹介 • 個人開発者 • 屋号: いります電算企画 • Twitter: irimasu • Twitter: notoroid • 喫茶作業者
  4. 4. 写真関連アクセス用 フレームワーク Photos.framework
  5. 5. iOS9 が公開!
  6. 6. iO8以上のデバイスも9割超えているし Earlier 10% iOS8 33% iOS9 57% AppStore on October 5,2015
  7. 7. アプリもiOS8 からの サポートにするか!
  8. 8. やったね!
  9. 9. そこに忍び寄る影
  10. 10. AssetLibrary.framework は iOS9 でdeprecated になるよ!
  11. 11. AssetsLibrary.frameworkの かわりに Photos.frameworkを使ってね
  12. 12. そもそも AssetLibrary.framework って何?
  13. 13. そもそも AssetLibrary.framework って何? • iOS SDKに含まれるフレームワークの一つ • カメラロールの写真からサムネイル、画面サイズ の写真、オリジナル写真、ムービーにアクセス可 能 • iOS4 SDKから公開 • iOS5 SDKでPhotoStreamに対応
  14. 14. 写真映像を扱うライブラリと して写真アプリには必須な framework として長年活躍
  15. 15. 対して Photos.framework とは?
  16. 16. Photos.framework • iOS SDKに含まれるフレームワークの一つ • カメラロールの写真から取得方法を指定して写真取得可能、オリジナルの写真、 ムービーにアクセス可能 • iCloud PhotoLibrary(クラウド)へのアクセスが可能 • コレクション(収集ルールごとにまとめられた写真)へのアクセスが可能 • ブラスト撮影など特殊な写真への対応 • 写真の編集が可能(写真.appの編集機能をアプリでも可能に) • 写真バージョンの管理 • iOS7 SDKから公開
  17. 17. できることが多すぎる
  18. 18. 写真取得だけに絞る
  19. 19. Photos.framework • iOS SDKに含まれるフレームワークの一つ • カメラロールの写真から取得方法を指定して写真取得可 能、オリジナルの写真、ムービーにアクセス可能 • iCloud PhotoLibrary(クラウド)へのアクセスが可能 • コレクション(収集ルールごとにまとめられた写真)への アクセスが可能 • iOS8 SDKから公開
  20. 20. AssetsLibrary.framework登場時 にはなかったクラウドへの対応に重 きをおいたのがPhotos.framework
  21. 21. iOS8 以降をサポートしていくのであ れば、AssetLibrary.frameworkから Photos.framework への移行が必要
  22. 22. AssetsLibraryと比べる Photos.framework
  23. 23. 変更に伴う相違点 • 1.プリフィックス • 2.トップレベルクラスの変更 • 3.非同期対応 • 4.モデルの変更 • 5.写真へのアクセス
  24. 24. 1. プリフィックス • AL (AssetsLibrary) • PH (PHotos) AssetsLibrary.framework Photos.framework
  25. 25. 2.トップレベルクラス • クラス名 • ALAssetsLibrary • 共有オブジェクト • なし • クラス名 • PHPhotoLibrary • 共有オブジェクト • [PHPhotoLibrary sharedPhotoLibrar y] AssetsLibrary.framework Photos.framework
  26. 26. 2.写真へのアクセス • クラス名 • ALAssetsLibrary • 共有オブジェクト • なし • クラス名 • PHPhotoLibrary • 共有オブジェクト • [PHPhotoLibrary sharedPhotoLibrar y] AssetsLibrary.framework Photos.framework
  27. 27. 3.非同期対応 • 同期でのみアクセス を許可。 • スレッドセーフで読み 込みが可能(メインス レッドorバックグラ ウンドスレッド) • 非同期で写真にアク セスする。アプリ開 発者はメインスレッ ドのみを意識すれば よい。 AssetsLibrary.framework Photos.framework
  28. 28. 4.モデルの変更 • ALAssetsLibrary (管理オブジェクト) • ALAssetsGroup(写真グループ) • ALAsset(写真アセットとサムネイル画像) • ALAssetRepresentation(写真アセットの実際のデータオブ ジェクト) • 4つのオブジェクトでモデルを構成 AssetsLibrary.framework
  29. 29. 4.モデルの変更 • PHCollectionList (コレクションリスト) • PHAssetCollection (写真アセットのコレクション) • PHAsset (写真アセット) • PHFetchResult • 4つのオブジェクトのうちPHFetchResult はオブジェクト の列挙用 Photos.framework
  30. 30. 4.モデルの変更 • カメラロールにアクセスするだけならば簡素 Photos.framework
  31. 31. 4.モデルの変更 • Photos.framework はモデル構造にアクセスす る際にトップレベルオブジェクトが関与しない • PHCollectionList、PHAssetCollectionのクラ スメソッドで最初のモデルオブジェクトを入手で きる • Photos.frameworkはAssetsLibrary.framework に比べてモデル構造の見通しが悪くなったかも
  32. 32. 5.写真へのアクセス ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop) { NSLog(@"group.numberOfAssets=%@",@(group.numberOfAssets) ); id obj = [group valueForProperty:ALAssetsGroupPropertyName]; NSLog(@"ALAssetsGroupPropertyName=%@",obj); [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { // resultを使って画像を取得 }]; *stop = YES; } failureBlock:^(NSError *error) { }]; AssetsLibrary.framework
  33. 33. 5.写真へのアクセス // PHAssetCollectionを取得 PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]; [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *smartFolderAssetCollection, NSUInteger idx, BOOL *stop) { NSLog(@"momentAssetCollection:%@", smartFolderAssetCollection); // PHAssetを取得 PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:smartFolderAssetCollection options:nil]; [assets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { // asset を使って画像を取得 }]; }]; Photos.framework
  34. 34. 5.写真へのアクセス // PHAssetCollectionを取得 PHFetchResult *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]; [assetCollections enumerateObjectsUsingBlock:^(PHAssetCollection *smartFolderAssetCollection, NSUInteger idx, BOOL *stop) { NSLog(@"momentAssetCollection:%@", smartFolderAssetCollection); // PHAssetを取得 PHFetchResult *assets = [PHAsset fetchAssetsInAssetCollection:smartFolderAssetCollection options:nil]; [assets enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) { // asset を使って画像を取得 }]; }]; Photos.framework
  35. 35. PHImageManager
  36. 36. Photos.frameworkは 画像のアクセス用に PHImageManagerを用意
  37. 37. PHImageManager • 非同期での写真取得 • 取得中にキャンセルも可能 • 取得の際に細かいパラメータ指定が可能
  38. 38. PHImageManagerは 良いことづくめのように 見えるが…
  39. 39.  実際にはAssetsLibrary を使うようにはいかない
  40. 40. PHImageManagerの問題点 • キャンセルが必要なほど遅い処理もありうる • 写真オプションを指定することで正確なサイズ が得られるとは限らない • 写真オプションによっては1つの写真につき複数 送られてくる
  41. 41. PHImageManagerの問題点2 • Photos.frameworkはローカルストレージとク ラウドサービス(iCloud Photo Library)の両方 にアクセスするがユーザはそれらを意識しないで アプリを使うのでもたつくように感じる • オプションのデフォルトは1つの写真につき複数 送られてくる
  42. 42. PHImageRequestOptions @property (nonatomic, assign) PHImageRequestOptionsVersion version; @property (nonatomic, assign) PHImageRequestOptionsDeliveryMode deliveryMode; @property (nonatomic, assign) PHImageRequestOptionsResizeMode resizeMode; @property (nonatomic, assign) CGRect normalizedCropRect; @property (nonatomic, assign, getter=isNetworkAccessAllowed) BOOL networkAccessAllowed; @property (nonatomic, assign, getter=isSynchronous) BOOL synchronous; @property (nonatomic, copy) PHAssetImageProgressHandler progressHandler;
  43. 43. PHImageRequestOptions • PHImageRequestOptionsDeliveryMode deliveryMode; • デリバリーモードを指定する • PHImageRequestOptionsResizeMode resizeMode; • リサイズモードを指定 • CGRect normalizedCropRect; • クロップ領域を比率で指定 • PHAssetImageProgressHandler progressHandler; • 画像処理中の過程ごとに呼び出されるblocksを指定
  44. 44. パラメーターを正確に理解し ないと意図しない結果になる
  45. 45. PHImageManagerの設定
  46. 46. PHImageManagerの設定 PHImageManagerM aximumSizeがすべて のオプションに優先
  47. 47. PHImageManagerの設定2 PHImageRequestOpti onsDeliveryModeOpp ortunistic PHImageRequestOpti onsDeliveryModeHig hQualityFormat PHImageRequestOpti onsDeliveryModeFas tFormat PHImageRequestOptions ResizeModeNone 複数呼び出し 表示に十分なサイズ 複数呼び出しでの最 後に相当 複数呼び出しでの1 回目に相当 PHImageRequestOptions ResizeModeFast 複数呼び出し 表示に十分なサイズ 複数呼び出しでの最 後に相当 表示に十分なサイズ 複数呼び出しでの1 回目に相当 表示に十分なサイズ PHImageRequestOptions ResizeModeExact 複数呼び出し 正確なサイズ 複数呼び出しでの最 後に相当 正確なサイズ 複数呼び出しでの1 回目に相当正確な比 率だがサイズは小さ い
  48. 48. PHImageManagerの設定2 PHImageRequestOpti onsDeliveryModeOpp ortunistic PHImageRequestOpti onsDeliveryModeHig hQualityFormat PHImageRequestOpti onsDeliveryModeFas tFormat PHImageRequestOptions ResizeModeNone 複数呼び出し 表示に十分なサイズ 複数呼び出しでの最 後に相当 複数呼び出しでの1 回目に相当 PHImageRequestOptions ResizeModeFast 複数呼び出し 表示に十分なサイズ 複数呼び出しでの最 後に相当 表示に十分なサイズ 複数呼び出しでの1 回目に相当 表示に十分なサイズ PHImageRequestOptions ResizeModeExact 複数呼び出し 正確なサイズ 複数呼び出しでの最 後に相当 正確なサイズ 複数呼び出しでの1 回目に相当正確な比 率だがサイズは小さ い
  49. 49. PHImageRequestOptionsRes izeModeNoneの • PHImageRequestOptionsResizeModeNone はリサイズ無しではなくリサイズ指定なし • サイズが小さいと PHImageRequestOptionsResizeModeFast相 当 • サイズが大きいと適当なサイズ
  50. 50. PHImageRequestOptions normalizedCropRectの罠 • normalizedCropRect でオリジナル画像からのク リップ領域を指定可能 • 指定は比率(-1.0∼1.0) • 比率指定は顔認識などで利用するため比率となって いるらしい
  51. 51. PHImageManagerの使い方 requestImageForAsset、requestImageDataForAsset のメソッドにオプションを指定する • 1) オリジナル写真はtargetSizeにPHImageManagerMaximumSize指定一択 • 2) PHImageManagerを使って適した写真サイズを得るには • options.deliveryMode=PHImageRequestOptionsDeliveryModeHighQualityF ormat • resizeMode=PHImageRequestOptionsResizeModeExact • 3) サムネイル表示には • options.deliveryMode=PHImageRequestOptionsDeliveryModeOpportunistic • resizeMode=PHImageRequestOptionsResizeModeFast
  52. 52. まとめ
  53. 53. まとめ • AssetsLibrary はiOS9 移行は使えなくなります • 写真アクセスにはPhotos.frameworkが必要 • Photos.framework は高機能で余計に複雑です • PHImageManagerを使いこなそう
  54. 54. http://irimasu.com Twitter: @notoroid 公式: @irimasu

×