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