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.

iOS8勉強会@Yahoo! JAPAN "Document Provider"

24,266 views

Published on

iOS8勉強会で話した「Document Provider」についての資料です。話せなかった部分は追加の資料で補っています。

Published in: Software
  • Be the first to comment

iOS8勉強会@Yahoo! JAPAN "Document Provider"

  1. 1. Document Provider ヤフー株式会社 大西智也 2014/10/18
  2. 2. 自己紹介 • 大西智也 • 新卒2年目 • iOS歴4年 • iOSアプリ中心に業務
  3. 3. アジェンダ • 何ができるのか? • Document Providerの構成 • 実装方法 • まとめ
  4. 4. 何ができるのか?
  5. 5. DocumentProviderを実装すると 自分のアプリに対して他のアプリが ファイルの操作をすることができる
  6. 6. DocumentProviderを実装すると 自分のアプリに対して他のアプリが ファイルの操作をすることができる Import Export Open Move
  7. 7. HostApp Document Provider
  8. 8. Import HostApp Document Provider ドキュメントを渡す
  9. 9. Export HostApp Document Provider ドキュメントをもらう
  10. 10. • Open • ドキュメントを直接編集させる • Move • ドキュメントを移動させる
  11. 11. 4つの操作モード Import Export Open Move • 最低1つ、最大4つサポートできる • それぞれについてUIとロジックを実装しなければな らない
  12. 12. Document Providerの構成
  13. 13. Document Providerの構成 • DocumentPickerViewController Extension • UI • Import, Exportのサポート • FileProvider Extension • Open, Moveのサポート
  14. 14. Document Providerの構成 • DocumentPickerViewController Extension • UI • Import, Exportのサポート • FileProvider Extension • Open, Moveのサポート 別々のターゲットとして追加されるので注意
  15. 15. 実装方法
  16. 16. Import Export Open Move
  17. 17. エクステンションを追加
  18. 18. エクステンションを追加
  19. 19. エクステンションを追加 Open, Moveをサポートするならチェックを入れる
  20. 20. Document Providerの構成 • DocumentPickerViewController Extension • UI • Import, Exportのサポート • FileProvider Extension • Open, Moveのサポート
  21. 21. 各種ファイルが追加される • DocumentPickerViewController • MainInterface.storyboard • info.plist
  22. 22. info.plist <key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>UIDocumentPickerModes</key> <array> <string>UIDocumentPickerModeImport</string> <string>UIDocumentPickerModeExportToService</string> </array> <key>UIDocumentPickerSupportedFileTypes</key> <array> <string>public.content</string> </array> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.fileprovider-ui</string> </dict> サポートするモード
  23. 23. info.plist <key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>UIDocumentPickerModes</key> <array> <string>UIDocumentPickerModeImport</string> <string>UIDocumentPickerModeExportToService</string> </array> <key>UIDocumentPickerSupportedFileTypes</key> <array> <string>public.content</string> </array> </dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.fileprovider-ui</string> </dict> サポートするUTI
  24. 24. MainInterface.storyboard UIの一部はシステムが 提供する
  25. 25. DocumentPickerViewController class DocumentPickerViewController: UIDocumentPickerExtensionViewController • UIを管理する • Import, Exportのロジックを実装する • Document Pickerと略される
  26. 26. Importで主に利用するメソッド func prepareForPresentationInMode(mode: UIDocumentPickerMode) • Document Providerが表示される直前に呼ばれる • 操作モードによってUIを変更する
  27. 27. Importで主に利用するメソッド func dismissGrantingAccessToURL(url: NSURL!) • ドキュメントのURLをHostAppに返す • UIを閉じる
  28. 28. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  29. 29. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  30. 30. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  31. 31. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  32. 32. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  33. 33. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  34. 34. class DocumentPickerViewController: UIDocumentPickerExtensionViewController { override func prepareForPresentationInMode(mode: UIDocumentPickerMode) { super.prepareForPresentationInMode(mode) switch mode { // Import, ExportのUIに変更 } } /** UIの処理など */ ! // ユーザがドキュメントを選んだとき、例えばCollectionViewのセルをタップした時 func didSelectDocument() { let URL = self.documentStorageURL.URLByAppendingPathComponent("hoge1.png") self.dismissGrantingAccessToURL(URL) } }
  35. 35. Export @NSCopying var originalURL: NSURL? { get } • HostAppから渡されたドキュメントのURL
  36. 36. FileProvider Extension • Open, Moveをサポートする • ファイルに対して直接アクセスされるので非常に複 雑になる • コンフリクト • リモートファイル(ダウンロード、変更のアップロード、 通信状況の監視)
  37. 37. まとめ • 他のアプリとのドキュメントのやりとりができるように なった • Import, Exportは比較的簡単、Open, Moveは複雑 • ストレージ系、写真管理アプリはぜひ
  38. 38. 参考資料 • 公式ドキュメント • https://developer.apple.com/library/ios/ documentation/General/Conceptual/ExtensibilityPG/ FileProvider.html • Dropbox • https://itunes.apple.com/jp/app/dropbox/ id327630330?mt=8
  39. 39. 追加資料
  40. 40. Document Providerの表示方法
  41. 41. 表示 delegate HostApp Document Provider
  42. 42. 準備 • プロジェクトのiCloudのiCloud Documentsにチェックを入れる iCloudのDocument Providerがデフォルトで表示されるため
  43. 43. UIDocumentMenuViewController • DocumentPickerを呼び出すために使う • 操作モードを指定して表示する
  44. 44. let menu = UIDocumentMenuViewController(documentTypes: self.UTIs, inMode: .Import) ! menu.delegate = self self.showViewController(menu, sender: nil) HostApp側に実装する
  45. 45. Document Providerの一覧が 表示される
  46. 46. // MARK: UIDocumentMenuDelegate func documentMenu(documentMenu: UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) { ! documentPicker.delegate = self self.showViewController(documentPicker, sender: nil) ! } ユーザが開きたいDocumentProviderを選んだ時
  47. 47. // MARK: UIDocumentMenuDelegate func documentMenu(documentMenu: UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) { ! documentPicker.delegate = self self.showViewController(documentPicker, sender: nil) ! } documentPickerはDocument ProviderのUI部分
  48. 48. さきほどのスライド DocumentPickerViewController class DocumentPickerViewController: UIDocumentPickerExtensionViewController • UIを管理する • Import, Exportのロジックを実装する • Document Pickerと略される
  49. 49. // MARK: UIDocumentMenuDelegate func documentMenu(documentMenu: UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) { ! documentPicker.delegate = self self.showViewController(documentPicker, sender: nil) ! } documentPickerを表示する
  50. 50. DocumentProvider側で以下のメソッドを呼ぶ self.dismissGrantingAccessToURL(URL) // MARK: UIDocumentPickerDelegate func documentPicker(controller: UIDocumentPickerViewController,       didPickDocumentAtURL url: NSURL) { ! println(url) ! } デリゲートでドキュメントのURLが渡される

×