File Provider Extensionは、ビルトインのFilesアプリを通じて、外部ソースからのファイルへのアクセスをアプリケーションに提供させるiOSメカニズムです。Apple Developer Documentation, 2024によると、File Provider Extensionは、クラウドストレージ、サーバー、カスタムファイルシステムからのファイルをFiles.app内に直接表示することができます—ローカルにインポートする必要はありません。ユーザーは物理的な場所に関わらず、ファイルを扱うための統一インターフェースを得られます。
メインポイント
File Provider Extensionは、iOSおよびmacOSにおけるアプリ拡張機能で、システムのFilesアプリを通じて外部ソースからのファイルへのアクセスをアプリケーションに提供させます。iOS 11で導入され、Document Providerメカニズムを置き換え、シンクロナイゼーション、検索、タグのサポートを追加しました。
File Provider Extensionの主な任務は、外部ストレージ(クラウドサーバー、企業NAS、FTP)とFiles.appのブリッジとして働くことです。ユーザーは、データが遠隔のサーバーにあっても、あたかもローカルに保存されているかのようにファイルやフォルダを見ることができます。拡張機能はバックグラウンドで動作し、必要に応じてコンテンツを同期します。
WWDC 2024によると、AppleはFileProvider APIを活発に開発しています:インクリメンタル同期のサポートが追加され、大きなディレクトリのパフォーマンスが向上し、一括操作が可能になりました。これにより、File Provider Extensionは外部ファイルをAppleエコシステムに統合する義務の方法になります。
アーキテクチャFile Provider Extensionは、主の拡張機能(ファイルプロバイダータイプ)と、認証および設定のためのオプショナルUI拡張機能の2つのコンポーネントで構成されています。主の拡張機能はNSFileProviderExtensionプロトコルを実装し、Files.appからのすべてのリクエストを処理します。
import FileProvider
class CloudFileProvider: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
guard let item = storage
.item(for: identifier) else {
throw NSError(domain: NSFileProviderErrorDomain,
code: NSFileProviderError.noSuchItem.rawValue)
}
return item
}
override func urlForItem(with identifier: NSFileProviderItemIdentifier) -> URL {
return fileCoordinator.urlForItem(with: identifier)
}
}
ユーザーがFiles.appを開いてプロバイダーを選択すると、システムは拡張機能をバックグラウンドプロセスで起動します。拡張機能にUIはありません—ファイルの読み込み、書き込み、名前変更、削除リクエストを処理するヘッドレスプロセスです。すべての操作はNSFileProviderManagerを介して非同期的に実行されます。
重要なニュアンス:File Provider Extensionは別のプロセスで動作し、メモリが不足になった場合にシステムによって終了される可能性があります。したがって、プロバイダーは再起動後に状態を復元できるように、識別子とシンクキャッシュを永続ストレージに保存する必要があります。
NSFileProviderItemは、プロバイダー階層における個々のファイルまたはフォルダを記述するプロトコルです。各アイテムには、固有の識別子、名前、タイプ(ファイルまたはフォルダ)、作成日、更新日、サイズ、フラグ(オフライン利用可能、読み取り専用)があります。
| プロパティ | タイプ | 説明 |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | プロバイダーシステムでのアイテムの固有ID |
| parentItemIdentifier | NSFileProviderItemIdentifier | 親フォルダのID(ルートは.rootContainer) |
| filename | String | 拡張子付きのファイル名 |
| typeIdentifier | String (UTType) | コンテンツタイプを決定するための統一タイプ識別子 |
| capabilities | NSFileProviderItemCapabilities | フラグ:削除、名前変更、タグの追加 |
また、このプロトコルはNSFileProviderItemProtocolを通じて拡張機能もサポートしています:タグ(カラーラベル)、アイコン、バージョン管理、カスタムアクション。大きなファイルには、NSFileProviderServiceを介して再開可能トランスファーのサポートが実装されています。
WWDC 2023によると、Appleはオブジェクト全体ではなく、変更されたプロパティだけを更新するためにクロージャ(NSFileProviderItemFields)を使用することを推奨しています。これにより、一括更新時の同期が大幅に高速化されます—例えば、ファイルグループのサイズのみが変わった場合などです。
NSFileProviderManagerは、拡張機能のライフサイクルを管理するセントラルクラスです。システムに変更を知らせたり、協力争いを処理したり、ダウンロードを管理したりするメソッドを提供します。マネージャーは作動中のトランスファーを自動的に追跡し、ユーザーに見えるファイルを優先します。
class SyncManager {
let providerManager = NSFileProviderManager.default
func signalUpdate(for item: NSFileProviderItemIdentifier) {
providerManager.signalEnumerator(
for: item.parentItemIdentifier
) { error in
if let error = error {
Logger.sync.error(
"Failed to signal: \(error.localizedDescription)"
)
}
}
}
func uploadItem(at url: URL, itemId: NSFileProviderItemIdentifier) {
providerManager.registerURLBasedItem(
with: itemId,
url: url
)
}
}
シンクエンジンは、ディベロッパーが独立に実装するロジックです。Appleは組み込みの同期メカニズムを提供していません—変更をシステムに通知するためのAPIのみを提供しています。プロバイダー自身が、サーバーからのファイルのダウンロード方法、ローカルキャッシュ方法、編集争いの解決方法を決定します。
争い:システムはNSFileProviderSyncAnchorを介してバージョン争い検出をサポートしています。ファイルがローカルとリモートで同時に変更された場合、プロバイダーはシンクアンカーを使用して最終同期バージョンを確定し、最終書き込み者勝ちのストラテジーまたは争いコピーの作成によって争いを解決します。
File Provider Extensionは、厳密なiOSサンドボックス内で動作します。拡張機能はホストアプリのファイルシステムに直接アクセスできず、逆にアプリもプロバイダーのファイルを直接読むことができません。すべてのデータやり取りはFiles.appシステムAPIを通じて行われます。
ユーザーのファイルへのアクセスは、明示的なインタラクションを通じてのみ可能です:ユーザーがアプリケーションでFiles.appからファイルを開くと、システムがアイソレートされたコンテナ内にファイルの一時コピーを作成します。受け取りアプリは、プロバイダーのストレージにあるオリジナルではなく、このコピーを扱います。
Apple Security Guide, 2024によると、プロバイダーは送信時のデータ暗号化(TLS 1.3)を実装する必要があり、キャッシュされたファイルにオプションでディスク暗号化を追加できます。ユーザー認証は、別のFileProviderUIコンポーネントを通じて実行され、セキュアな認証情報の入力のために拡張機能サンドボックスの外で動作します。
主な制限:拡張機能は任意のコードを実行できません—NSFileProviderManagerを通じてのみリクエストを処理します。ファイル操作を超えるロジックは、メインアプリで実装し、アプリグループまたはXPCサービスを通じて呼び出す必要があります。
よくある質問
File Provider Extensionは、ファイルアプリと外部ファイルストレージを統合するアプリ拡張機能です。クラウドサービス、FTP、NASなどからのファイルをローカルにコピーせずに表示できます。
File Provider (iOS 11+)はDocument Providerを置き換え、バックグラウンド同期、Spotlight検索サポート、タグ、パフォーマンス向上を実現しました。Document ProviderはiOS 11で廃止となり、iOS 14で削除されました。
同期は、ディベロッパーによってNSFileProviderManagerを通じて実装されます。拡張機能はsignalEnumeratorを介してシステムに変更を知らせ、システムが更新されたアイテムリストをリクエストします。バージョン争いはNSFileProviderSyncAnchorを通じて解決されます。
はい、File Provider Extensionはメインアプリが実行されていなくても独立したプロセスとして動作できます。iOSがFiles.appからのリクエストに応じて起動するヘッドレス拡張機能です。ただし、認証と初期設定は通常、メインアプリを通じて実行されます。
拡張機能にはXcodeでのFile Provider権能および特許com.apple.developer.file-providerが必要です。ネットワークアクセスには、Network権能が追加されます。その他のすべての権限はiOSサンドボックスによって厳密に制限されています。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。