SlideShare una empresa de Scribd logo
1 de 52
Descargar para leer sin conexión
Document Provider 
ヤフー株式会社 
大西智也 
2014/10/18
自己紹介 
• 大西智也 
• 新卒2年目 
• iOS歴4年 
• iOSアプリ中心に業務
アジェンダ 
• 何ができるのか? 
• Document Providerの構成 
• 実装方法 
• まとめ
何ができるのか?
DocumentProviderを実装すると 
自分のアプリに対して他のアプリが 
ファイルの操作をすることができる
DocumentProviderを実装すると 
自分のアプリに対して他のアプリが 
ファイルの操作をすることができる 
Import Export Open Move
HostApp Document Provider
Import 
HostApp Document Provider 
ドキュメントを渡す
Export 
HostApp Document Provider 
ドキュメントをもらう
• Open 
• ドキュメントを直接編集させる 
• Move 
• ドキュメントを移動させる
4つの操作モード 
Import Export Open Move 
• 最低1つ、最大4つサポートできる 
• それぞれについてUIとロジックを実装しなければな 
らない
Document Providerの構成
Document Providerの構成 
• DocumentPickerViewController Extension 
• UI 
• Import, Exportのサポート 
• FileProvider Extension 
• Open, Moveのサポート
Document Providerの構成 
• DocumentPickerViewController Extension 
• UI 
• Import, Exportのサポート 
• FileProvider Extension 
• Open, Moveのサポート 
別々のターゲットとして追加されるので注意
実装方法
Import Export Open Move
エクステンションを追加
エクステンションを追加
エクステンションを追加 
Open, Moveをサポートするならチェックを入れる
Document Providerの構成 
• DocumentPickerViewController Extension 
• UI 
• Import, Exportのサポート 
• FileProvider Extension 
• Open, Moveのサポート
各種ファイルが追加される 
• DocumentPickerViewController 
• MainInterface.storyboard 
• info.plist
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> 
サポートするモード
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
MainInterface.storyboard 
UIの一部はシステムが 
提供する
DocumentPickerViewController 
class DocumentPickerViewController: UIDocumentPickerExtensionViewController 
• UIを管理する 
• Import, Exportのロジックを実装する 
• Document Pickerと略される
Importで主に利用するメソッド 
func prepareForPresentationInMode(mode: UIDocumentPickerMode) 
• Document Providerが表示される直前に呼ばれる 
• 操作モードによってUIを変更する
Importで主に利用するメソッド 
func dismissGrantingAccessToURL(url: NSURL!) 
• ドキュメントのURLをHostAppに返す 
• UIを閉じる
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) 
} 
}
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) 
} 
}
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) 
} 
}
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) 
} 
}
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) 
} 
}
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) 
} 
}
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) 
} 
}
Export 
@NSCopying var originalURL: NSURL? { get } 
• HostAppから渡されたドキュメントのURL
FileProvider Extension 
• Open, Moveをサポートする 
• ファイルに対して直接アクセスされるので非常に複 
雑になる 
• コンフリクト 
• リモートファイル(ダウンロード、変更のアップロード、 
通信状況の監視)
まとめ 
• 他のアプリとのドキュメントのやりとりができるように 
なった 
• Import, Exportは比較的簡単、Open, Moveは複雑 
• ストレージ系、写真管理アプリはぜひ
参考資料 
• 公式ドキュメント 
• https://developer.apple.com/library/ios/ 
documentation/General/Conceptual/ExtensibilityPG/ 
FileProvider.html 
• Dropbox 
• https://itunes.apple.com/jp/app/dropbox/ 
id327630330?mt=8
追加資料
Document Providerの表示方法
表示 
delegate 
HostApp Document Provider
準備 
• プロジェクトのiCloudのiCloud Documentsにチェックを入れる 
iCloudのDocument Providerがデフォルトで表示されるため
UIDocumentMenuViewController 
• DocumentPickerを呼び出すために使う 
• 操作モードを指定して表示する
let menu = 
UIDocumentMenuViewController(documentTypes: self.UTIs, inMode: .Import) 
! 
menu.delegate = self 
self.showViewController(menu, sender: nil) 
HostApp側に実装する
Document Providerの一覧が 
表示される
// MARK: UIDocumentMenuDelegate 
func documentMenu(documentMenu: UIDocumentMenuViewController, 
didPickDocumentPicker documentPicker: UIDocumentPickerViewController) { 
! 
documentPicker.delegate = self 
self.showViewController(documentPicker, sender: nil) 
! 
} 
ユーザが開きたいDocumentProviderを選んだ時
// MARK: UIDocumentMenuDelegate 
func documentMenu(documentMenu: UIDocumentMenuViewController, 
didPickDocumentPicker documentPicker: UIDocumentPickerViewController) { 
! 
documentPicker.delegate = self 
self.showViewController(documentPicker, sender: nil) 
! 
} 
documentPickerはDocument ProviderのUI部分
さきほどのスライド 
DocumentPickerViewController 
class DocumentPickerViewController: UIDocumentPickerExtensionViewController 
• UIを管理する 
• Import, Exportのロジックを実装する 
• Document Pickerと略される
// MARK: UIDocumentMenuDelegate 
func documentMenu(documentMenu: UIDocumentMenuViewController, 
didPickDocumentPicker documentPicker: UIDocumentPickerViewController) { 
! 
documentPicker.delegate = self 
self.showViewController(documentPicker, sender: nil) 
! 
} 
documentPickerを表示する
DocumentProvider側で以下のメソッドを呼ぶ 
self.dismissGrantingAccessToURL(URL) 
// MARK: UIDocumentPickerDelegate 
func documentPicker(controller: UIDocumentPickerViewController, 
      didPickDocumentAtURL url: NSURL) { 
! 
println(url) 
! 
} 
デリゲートでドキュメントのURLが渡される

Más contenido relacionado

Destacado

Xcode 6の新機能
Xcode 6の新機能Xcode 6の新機能
Xcode 6の新機能Shingo Sato
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までYuki Tanabe
 
大人のHomekit
大人のHomekit大人のHomekit
大人のHomekitKen Haneda
 
iOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahooiOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahooHiramatsu Ryosuke
 
iOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフーiOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフー大介 束田
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅Tomoki Hasegawa
 
SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記yohei sugigami
 
Ios8yahoo swift-json
Ios8yahoo swift-jsonIos8yahoo swift-json
Ios8yahoo swift-jsondankogai
 
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahooもしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahooniwatako
 

Destacado (11)

Xcode 6の新機能
Xcode 6の新機能Xcode 6の新機能
Xcode 6の新機能
 
iOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips までiOS 8 Widget ~ 導入から Tips まで
iOS 8 Widget ~ 導入から Tips まで
 
大人のHomekit
大人のHomekit大人のHomekit
大人のHomekit
 
iOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahooiOS 8/Swift 概要 #ios8yahoo
iOS 8/Swift 概要 #ios8yahoo
 
iOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフーiOS 8/Swift エンジニア勉強会@ヤフー
iOS 8/Swift エンジニア勉強会@ヤフー
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 
既存アプリのiOS8対応 #ios8yahoo
既存アプリのiOS8対応 #ios8yahoo既存アプリのiOS8対応 #ios8yahoo
既存アプリのiOS8対応 #ios8yahoo
 
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅オプショナル型。 〜 なんとなく付ける ! ? 撲滅
オプショナル型。 〜 なんとなく付ける ! ? 撲滅
 
SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記SwiftでSioriを開発した体験記
SwiftでSioriを開発した体験記
 
Ios8yahoo swift-json
Ios8yahoo swift-jsonIos8yahoo swift-json
Ios8yahoo swift-json
 
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahooもしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
 

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

Google Apps Scirpt勉強会 #1
Google Apps Scirpt勉強会 #1Google Apps Scirpt勉強会 #1
Google Apps Scirpt勉強会 #1ikikko
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugToshiaki Maki
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Takako Miyagawa
 
Xamarin.formsで作成する翻訳機能付きtwitterクライアント
Xamarin.formsで作成する翻訳機能付きtwitterクライアント Xamarin.formsで作成する翻訳機能付きtwitterクライアント
Xamarin.formsで作成する翻訳機能付きtwitterクライアント Shinichi Hirauchi
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門Hori Tasuku
 
Djangoのチュートリアル
DjangoのチュートリアルDjangoのチュートリアル
Djangoのチュートリアルsakihohoribe
 
Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信Wataru Kimura
 
Android勉強会 1
Android勉強会 1Android勉強会 1
Android勉強会 1shotaueda3
 
140917運用管理勉強会job scheduler
140917運用管理勉強会job scheduler140917運用管理勉強会job scheduler
140917運用管理勉強会job schedulerOSSラボ株式会社
 
SubversionとSugarsync
SubversionとSugarsyncSubversionとSugarsync
SubversionとSugarsyncHidenori Goto
 
関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」Noritada Shimizu
 
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)NTT DATA Technology & Innovation
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法Naruto TAKAHASHI
 

Similar a iOS8勉強会@Yahoo! JAPAN "Document Provider" (20)

Google Apps Scirpt勉強会 #1
Google Apps Scirpt勉強会 #1Google Apps Scirpt勉強会 #1
Google Apps Scirpt勉強会 #1
 
20080524
2008052420080524
20080524
 
Firefoxosハンズオン
FirefoxosハンズオンFirefoxosハンズオン
Firefoxosハンズオン
 
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsugSpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
SpringOne 2GX 2014 参加報告 & Spring 4.1について #jsug
 
Clrh 20121215
Clrh 20121215Clrh 20121215
Clrh 20121215
 
APIMeetup 20170329_ichimura
APIMeetup 20170329_ichimuraAPIMeetup 20170329_ichimura
APIMeetup 20170329_ichimura
 
HTML5最新動向
HTML5最新動向HTML5最新動向
HTML5最新動向
 
Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中Code igniterでテスト駆動開発 資料作成中
Code igniterでテスト駆動開発 資料作成中
 
Xamarin.formsで作成する翻訳機能付きtwitterクライアント
Xamarin.formsで作成する翻訳機能付きtwitterクライアント Xamarin.formsで作成する翻訳機能付きtwitterクライアント
Xamarin.formsで作成する翻訳機能付きtwitterクライアント
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門
 
Djangoのチュートリアル
DjangoのチュートリアルDjangoのチュートリアル
Djangoのチュートリアル
 
Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信Quickcursorに見る、アプリケーション間通信
Quickcursorに見る、アプリケーション間通信
 
Android勉強会 1
Android勉強会 1Android勉強会 1
Android勉強会 1
 
140917運用管理勉強会job scheduler
140917運用管理勉強会job scheduler140917運用管理勉強会job scheduler
140917運用管理勉強会job scheduler
 
SubversionとSugarsync
SubversionとSugarsyncSubversionとSugarsync
SubversionとSugarsync
 
関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」
 
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
Apache Airflow 概要(Airflowの基礎を学ぶハンズオンワークショップ 発表資料)
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法NPAPIを使ったandroid標準ブラウザの拡張方法
NPAPIを使ったandroid標準ブラウザの拡張方法
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 

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