LASSIC Media らしくメディア
アプリのファイル管理・ドキュメント連携を実装、外注
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- iOSはUIDocumentPickerViewControllerとFileManagerを使い、ユーザーが選んだファイルをアプリ内で読み書きできるようにします。
- AndroidはStorage Access Framework(SAF)のACTION_OPEN_DOCUMENT/ACTION_CREATE_DOCUMENTを使い、ドキュメントプロバイダ経由でファイルを選択・保存します。
- 権限の最小化・大容量ファイルの扱い・オフライン時の同期など、実装で見落としやすい論点が複数あり、内製・外注の判断材料になります。
目次
- アプリのファイル管理・ドキュメント連携とは、クラウド・他アプリとファイルをやり取りする実装
- iOSの要——UIDocumentPickerViewControllerとFileManagerでファイルを選び読み書きする
- セキュリティスコープ付きブックマークとFile Provider——iCloud Driveと連携を保つ鍵
- AndroidのStorage Access Framework——ACTION_OPEN_DOCUMENTとACTION_CREATE_DOCUMENTの仕組み
- MediaStoreとScoped Storage——写真・動画はドキュメントと別枠で扱う
- 権限最小化・大容量・オフライン——実装で見落としやすい3つの落とし穴
- 対応OSとクラウド連携範囲——内製と外注の分かれ目
- まとめ:ファイル管理・ドキュメント連携実装で押さえる3つの判断軸
- よくある質問
アプリのファイル管理・ドキュメント連携とは、クラウド・他アプリとファイルをやり取りする実装
アプリのファイル管理・ドキュメント連携とは、スマートフォンアプリがiCloud DriveやGoogle Drive等のクラウドストレージ、あるいは他アプリが保持するファイルを、ピッカー(ファイル選択画面)を通じて選択・保存・共有できるようにする実装を指します*1。iOSはUIDocumentPickerViewControllerを、AndroidはStorage Access FrameworkのACTION_OPEN_DOCUMENTを、それぞれ標準の選択UIとして提供しています*1*4。
ピッカーで選ばれたファイルは、アプリのサンドボックス外に置かれたままです。iOSはFileManagerで実際の読み書きを行い、Androidはドキュメントプロバイダ経由でContentResolverがアクセスを仲介します*2*4。
この仕組みにより、ユーザーは自分のファイルをどこに置くかを選べます。一方でアプリ側は、選択後もアクセス権を保ち続けるための実装を、OSごとに用意しなければなりません。
iOSの要——UIDocumentPickerViewControllerとFileManagerでファイルを選び読み書きする
UIDocumentPickerViewController——インポート・エクスポート・オープンの3モード
UIDocumentPickerViewControllerは、ユーザーがFilesアプリ経由でファイルを選ぶ標準UIです*1。既定でiCloud Drive、オンデバイスのファイル、サードパーティのクラウドサービスが選択対象になります*1。
ピッカーには用途に応じたモードがあります。ファイルをアプリ内にコピーするインポート、外部ストレージへ書き出すエクスポート、外部ストレージ上のファイルを直接開くオープンの3種類です*1。用途に合わせてモードを選ぶことが実装の出発点になります。
FileManager——ローカルのファイル操作を担う基盤クラス
FileManagerは、アプリ内のディレクトリ作成・ファイルの存在確認・コピー・削除など、ファイルシステム操作全般を担うクラスです*2。ピッカーで取得したファイルの実体を、アプリのドキュメントディレクトリへ保存する処理でも使います*2。
ただしFileManagerだけでは、ピッカーの外部にあるファイルへ再度アクセスすることはできません。アプリを閉じて再度開いたときにも同じファイルへアクセスするには、次に説明するセキュリティスコープ付きブックマークが必要になります*1。
セキュリティスコープ付きブックマークとFile Provider——iCloud Driveと連携を保つ鍵
セキュリティスコープ付きブックマークは、ピッカーで得たファイルへのアクセス権を、サンドボックスの外に置かれたままでも保持する仕組みです*1。ブックマークをデータとして保存しておけば、アプリの再起動後も同じファイルへ再アクセスできます*1。
ただしブックマークは、対象ファイルの移動・削除で失効する点に注意が必要です*1。起動時にブックマークの有効性を確認し、失効時は再度ピッカーでの選択を促す実装が求められます。
File Provider——他社クラウドをFilesアプリに統合する仕組み
File Provider(Document Provider。他社のクラウドストレージをFilesアプリに統合する拡張機能)は、サードパーティのクラウドサービスをピッカーの選択対象に加える仕組みです*3。この拡張があるため、iCloud Drive以外のクラウドも同じピッカーUIから選べます*3。
自社アプリがクラウド連携先そのものになる場合は、File Provider拡張の実装が欠かせません。既存クラウドのファイルを取り込むだけであれば、ピッカーとブックマークの実装で足ります。
AndroidのStorage Access Framework——ACTION_OPEN_DOCUMENTとACTION_CREATE_DOCUMENTの仕組み
Storage Access Framework(SAF。システム共通のピッカーUIでファイルを選択・保存する仕組み)は、Android 4.4(API level 19)以降で利用でき、ドキュメントプロバイダを実装する他アプリが提供するファイルも選択対象になります*4。
既存ファイルを開く場合はACTION_OPEN_DOCUMENTを使い、新規ファイルを保存する場合はACTION_CREATE_DOCUMENTを使うという整理です*4。フォルダ全体へのアクセスが必要な場合は、API level 21以降で使えるACTION_OPEN_DOCUMENT_TREEを選びます*4。
SAFで取得したURIへの再アクセスには、Persistable URI Permission(端末再起動後もアクセス権を保持する仕組み)が必要です*5。takePersistableUriPermissionを呼び出しておくと、再起動後もアクセス権が保たれます*5。
ここまでのiOSとAndroidの実装方式を整理すると、次の通りです。
| 項目 | iOS | Android |
|---|---|---|
| ファイル選択のUI | UIDocumentPickerViewController*1 | ACTION_OPEN_DOCUMENT*4 |
| 新規ファイルの保存 | ピッカーのエクスポートモード*1 | ACTION_CREATE_DOCUMENT*4 |
| 永続アクセス権 | セキュリティスコープ付きブックマーク*1 | Persistable URI Permission*5 |
| 他社クラウドの統合 | File Provider拡張*3 | ドキュメントプロバイダ(SAF)*4 |
| 写真・動画の扱い | Files以外の専用API(別枠) | MediaStore*7。Scoped Storageが既定*6 |
MediaStoreとScoped Storage——写真・動画はドキュメントと別枠で扱う
写真・動画・音声などのメディアファイルは、SAFではなくMediaStore(端末内の共有メディアを検索・追加・更新するAPI)で扱うのが基本です*7。ドキュメント系のファイルとメディア系のファイルとで、使うAPIが分かれている点が実装のポイントになります*7。
Android 10(API level 29)以降を対象とするアプリには、Scoped Storage(スコープ付きストレージ。アプリごとにアクセス範囲を制限する仕組み)が既定で有効になります*6。有効になったアプリでは、アクセス範囲がアプリ専用ディレクトリとMediaStore対象のメディアに限られるという仕組みです*6。
アプリ専用ディレクトリやMediaStoreの対象外にあるファイルへアクセスする場合は、Scoped StorageではなくSAFを使う必要があります*6。ドキュメント系ファイルとメディア系ファイルとで使うAPIを切り分ける設計が欠かせません。
権限最小化・大容量・オフライン——実装で見落としやすい3つの落とし穴
1つ目は権限の範囲です。ACTION_OPEN_DOCUMENT_TREEでフォルダ全体へのアクセスを求めるなど、必要以上に広い権限を要求すると、ユーザーの許可が得られずファイル選択自体が失敗しかねません*4。目的のファイル種別・操作範囲に応じて、最小限の権限で済むAPIを選ぶことが実装の前提になります。
2つ目は大容量ファイルの扱いです。ファイル全体を一度にメモリへ読み込む実装では、大容量の動画・アーカイブファイルを開いた際にメモリ不足でアプリが強制終了するおそれがあります。ストリーミング読み込みや一時ファイルへの分割書き込みなど、メモリ使用量を抑える実装が必要です。
3つ目はオフライン時の同期です。セキュリティスコープ付きブックマークやSAFのURIは、クラウド側のファイルが同期中や削除済みの状態でも有効に見える場合があります*1*5。オフライン時のエラー処理や再同期のタイミングを、設計段階で決めておくことが大切です。
この作業を内製で担うには、iOSのFile系API、AndroidのSAF・MediaStore・Scoped Storageという、OSごとに異なる仕組みへの理解が要ります*1*4*6*7。連携先のクラウドサービスが複数に及ぶ場合は、それぞれの認証方式への対応も加わります。
対応OSとクラウド連携範囲——内製と外注の分かれ目
ファイル選択・保存の基本実装であれば、iOS・Androidそれぞれの標準APIを使い、自社で対応できる場合もあります*1*4。判断が分かれるのは、対応するクラウドサービスの数が多い場合や、iOS・Android両方で一貫した挙動を求める場合です。
専門パートナーに委託する場合は、対応OS・対応クラウド連携先の範囲、権限設計の考え方、大容量・オフライン対応の実装方針までを一括して依頼できるかどうかが選定の分かれ目になります。内製では、既存の開発担当者が通常業務と並行して対応することになり、検証に割ける時間が限られる場合があります。
。連携するクラウドサービスの数やiOS・Android両対応の要否によって、必要な工数は変わってきます。現状の要件を整理したうえで、内製・外注の切り分けを検討することが実務的です。
まとめ:ファイル管理・ドキュメント連携実装で押さえる3つの判断軸
本稿ではアプリのファイル管理・ドキュメント連携の実装を、iOS・Androidの公式情報をもとに整理しました。要点は3つに集約できます。第一に、iOSはUIDocumentPickerViewControllerとセキュリティスコープ付きブックマーク、AndroidはSAFとPersistable URI Permissionという、それぞれ別の仕組みでファイルへの永続アクセスを実現する点です*1*4*5。第二に、写真・動画等のメディアはSAFではなくMediaStoreとScoped Storageの対象になります*6*7。第三に、権限最小化・大容量・オフライン対応という3つの落とし穴への対応工数が、内製と外注の判断材料になります。
よくある質問
アプリのファイル管理機能を実装する際、iOSとAndroidで対応方法は大きく異なりますか。
対応方法は異なります。iOSはUIDocumentPickerViewController、AndroidはStorage Access Frameworkという別々の仕組みを使うためです*1*4。ただし設計思想は共通しており、両OSともユーザーが選んだファイルへのアクセス許可をシステムが仲介する点は同じです。
セキュリティスコープ付きブックマークとは何ですか。
iOSでアプリがサンドボックス外のファイルへ、ピッカー終了後も再アクセスできるようにする仕組みです*1。ブックマークは対象ファイルの移動・削除で失効する場合があるため、起動時に有効性を確認する実装が必要になります。
Androidで写真や動画を扱う場合もStorage Access Frameworkを使うべきですか。
写真・動画などのメディアファイルは、SAFではなくMediaStore APIで扱うのが基本です*7。Android 10以降はScoped Storageが既定で有効になり、メディアの種類ごとにアクセス方法が整理されています*6。
大容量ファイルの保存・読み込みで注意すべき点はありますか。
ファイル全体をメモリに読み込む実装では、大容量ファイルを開いた際にアプリが強制終了するおそれがあります。ストリーミング処理や一時ファイルへの分割書き込みなど、メモリ使用量を抑える実装が求められます。
実装を外部に委託する場合、何を確認すればよいですか。
対応するクラウド連携先の範囲、iOS・Android両方の対応可否、権限設計の考え方をまず確認します。オフライン時の同期競合への対応方針も、契約前にすり合わせておくことが大切です。
著者:テレリモ総研編集部 鈴木 亮佑
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:Apple「UIDocumentPickerViewController」(Apple Developer Documentation)
- *2 出典:Apple「FileManager」(Apple Developer Documentation)
- *3 出典:Apple「File Provider」(Apple Developer Documentation)
- *4 出典:Android Developers「Storage Access Framework」
- *5 出典:Android Developers「Access documents and other files from shared storage」
- *6 出典:Android Developers「Data and file storage overview」(Scoped storage)
- *7 出典:Android Developers「Access media files from shared storage」