52
Document Provider ヤフー株式会社 大西智也 2014/10/18

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

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerヤフー株式会社

大西智也

2014/10/18

Page 2: iOS8勉強会@Yahoo! JAPAN "Document Provider"

自己紹介

• 大西智也

• 新卒2年目

• iOS歴4年

• iOSアプリ中心に業務

Page 3: iOS8勉強会@Yahoo! JAPAN "Document Provider"

アジェンダ

• 何ができるのか?

• Document Providerの構成

• 実装方法

• まとめ

Page 4: iOS8勉強会@Yahoo! JAPAN "Document Provider"

何ができるのか?

Page 5: iOS8勉強会@Yahoo! JAPAN "Document Provider"

DocumentProviderを実装すると

自分のアプリに対して他のアプリが ファイルの操作をすることができる

Page 6: iOS8勉強会@Yahoo! JAPAN "Document Provider"

DocumentProviderを実装すると

自分のアプリに対して他のアプリが ファイルの操作をすることができる

Import MoveOpenExport

Page 7: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document ProviderHostApp

Page 8: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Import

ドキュメントを渡す

Document ProviderHostApp

Page 9: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Export

ドキュメントをもらう

Document ProviderHostApp

Page 10: iOS8勉強会@Yahoo! JAPAN "Document Provider"

• Open • ドキュメントを直接編集させる

• Move • ドキュメントを移動させる

Page 11: iOS8勉強会@Yahoo! JAPAN "Document Provider"

4つの操作モード

• 最低1つ、最大4つサポートできる

• それぞれについてUIとロジックを実装しなければならない

Import MoveOpenExport

Page 12: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerの構成

Page 13: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerの構成

• DocumentPickerViewController Extension • UI • Import, Exportのサポート

• FileProvider Extension • Open, Moveのサポート

Page 14: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerの構成

• DocumentPickerViewController Extension • UI • Import, Exportのサポート

• FileProvider Extension • Open, Moveのサポート

別々のターゲットとして追加されるので注意

Page 15: iOS8勉強会@Yahoo! JAPAN "Document Provider"

実装方法

Page 16: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Import MoveOpenExport

Page 17: iOS8勉強会@Yahoo! JAPAN "Document Provider"

エクステンションを追加

Page 18: iOS8勉強会@Yahoo! JAPAN "Document Provider"

エクステンションを追加

Page 19: iOS8勉強会@Yahoo! JAPAN "Document Provider"

エクステンションを追加

Open, Moveをサポートするならチェックを入れる

Page 20: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerの構成

• DocumentPickerViewController Extension • UI • Import, Exportのサポート

• FileProvider Extension • Open, Moveのサポート

Page 21: iOS8勉強会@Yahoo! JAPAN "Document Provider"

各種ファイルが追加される

• DocumentPickerViewController • MainInterface.storyboard • info.plist

Page 22: iOS8勉強会@Yahoo! JAPAN "Document Provider"

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"

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"

MainInterface.storyboard

UIの一部はシステムが 提供する

Page 25: iOS8勉強会@Yahoo! JAPAN "Document Provider"

DocumentPickerViewController

• UIを管理する

• Import, Exportのロジックを実装する

• Document Pickerと略される

class DocumentPickerViewController: UIDocumentPickerExtensionViewController

Page 26: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Importで主に利用するメソッド

func prepareForPresentationInMode(mode: UIDocumentPickerMode)

• Document Providerが表示される直前に呼ばれる • 操作モードによってUIを変更する

Page 27: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Importで主に利用するメソッド

func dismissGrantingAccessToURL(url: NSURL!)

• ドキュメントのURLをHostAppに返す • UIを閉じる

Page 28: iOS8勉強会@Yahoo! JAPAN "Document Provider"

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"

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"

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"

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"

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"

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"

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"

Export

• HostAppから渡されたドキュメントのURL

@NSCopying var originalURL: NSURL? { get }

Page 36: iOS8勉強会@Yahoo! JAPAN "Document Provider"

FileProvider Extension

• Open, Moveをサポートする

• ファイルに対して直接アクセスされるので非常に複雑になる • コンフリクト • リモートファイル(ダウンロード、変更のアップロード、

通信状況の監視)

Page 37: iOS8勉強会@Yahoo! JAPAN "Document Provider"

まとめ

• 他のアプリとのドキュメントのやりとりができるようになった

• Import, Exportは比較的簡単、Open, Moveは複雑

• ストレージ系、写真管理アプリはぜひ

Page 38: iOS8勉強会@Yahoo! JAPAN "Document Provider"

参考資料

• 公式ドキュメント • 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"

追加資料

Page 40: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerの表示方法

Page 41: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document ProviderHostApp

表示

delegate

Page 42: iOS8勉強会@Yahoo! JAPAN "Document Provider"

準備

• プロジェクトのiCloudのiCloud Documentsにチェックを入れる

iCloudのDocument Providerがデフォルトで表示されるため

Page 43: iOS8勉強会@Yahoo! JAPAN "Document Provider"

UIDocumentMenuViewController

• DocumentPickerを呼び出すために使う

• 操作モードを指定して表示する

Page 44: iOS8勉強会@Yahoo! JAPAN "Document Provider"

let menu = UIDocumentMenuViewController(documentTypes: self.UTIs, inMode: .Import) !menu.delegate = self self.showViewController(menu, sender: nil)

HostApp側に実装する

Page 45: iOS8勉強会@Yahoo! JAPAN "Document Provider"

Document Providerの一覧が 表示される

Page 46: iOS8勉強会@Yahoo! JAPAN "Document Provider"
Page 47: iOS8勉強会@Yahoo! JAPAN "Document Provider"

// 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"

// 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"

DocumentPickerViewController

• UIを管理する

• Import, Exportのロジックを実装する

• Document Pickerと略される

class DocumentPickerViewController: UIDocumentPickerExtensionViewController

さきほどのスライド

Page 50: iOS8勉強会@Yahoo! JAPAN "Document Provider"

// 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"
Page 52: iOS8勉強会@Yahoo! JAPAN "Document Provider"

// MARK: UIDocumentPickerDelegate func documentPicker(controller: UIDocumentPickerViewController,       didPickDocumentAtURL url: NSURL) { ! println(url) ! }

デリゲートでドキュメントのURLが渡される

self.dismissGrantingAccessToURL(URL)

DocumentProvider側で以下のメソッドを呼ぶ