File Provider Extension是一种iOS机制,允许应用程序通过内置的“文件”应用提供对外部源文件的访问。根据Apple Developer Documentation, 2024,File Provider Extension能够直接显示来自云存储、服务器和自定义文件系统的文件,而无需在本地导入它们。用户可以获得一个统一的界面来处理文件,无论其物理位置如何。
要点
File Provider Extension是iOS和macOS中的一个应用扩展,允许应用程序通过系统“文件”应用提供对外部源文件的访问。它出现在iOS 11中,取代了Document Provider机制,增加了对同步、搜索和标签的支持。
File Provider Extension的主要任务是充当外部存储(云服务器、企业NAS、FTP)和Files.app之间的桥梁。用户看到的文件和文件夹就像存储在本地一样,尽管数据可能位于远程服务器上。该扩展在后台运行,根据需要同步内容。
根据WWDC 2024,Apple正在积极开发FileProvider API:增加了增量同步支持、改进了大目录的性能,并增加了批量操作的能力。这使得File Provider Extension成为将外部文件集成到Apple生态系统中的首选方式。
架构:File Provider Extension由两个组件组成:主扩展(文件提供者类型)和用于身份验证和配置的可选UI扩展。主扩展实现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并选择您的提供者时,系统会在后台进程中启动该扩展。该扩展没有用户界面—它是一个无头进程,处理读取、写入、重命名和删除文件的请求。所有操作都通过NSFileProviderManager异步执行。
重要说明:File Provider Extension存在于一个独立的进程中,在内存不足时可能被系统终止。因此,提供者必须能够在重新启动后恢复状态,将标识符和同步缓存保存在持久存储中。
NSFileProviderItem是一个协议,描述提供者层次结构中的单个文件或文件夹。每个元素都有唯一的标识符、名称、类型(文件或文件夹)、创建和修改日期、大小以及标志(可离线使用、只读)。
| 属性 | 类型 | 描述 |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | 提供者系统中元素的唯一ID |
| parentItemIdentifier | NSFileProviderItemIdentifier | 父文件夹的ID(根—.rootContainer) |
| filename | String | 带扩展名的文件名 |
| typeIdentifier | String (UTType) | 用于确定内容类型的统一类型标识符 |
| capabilities | NSFileProviderItemCapabilities | 标志:删除、重命名、添加标签 |
该协议还通过NSFileProviderItemProtocol支持高级功能:标签(彩色标记)、图标、版本控制和自定义操作。对于大文件,通过NSFileProviderService实现可恢复传输(resumable transfers)的支持。
根据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),并可选择为缓存的文件添加磁盘加密。用户身份验证通过单独的UI组件FileProviderUI进行,该组件在扩展沙盒之外启动,以安全地输入凭据。
关键限制:扩展不能运行任意代码—它仅通过NSFileProviderManager处理请求。任何超出文件操作范围的逻辑都必须在主应用程序中实现,并通过app groups或XPC services调用。
常见问题
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中的capability File Provider以及com.apple.developer.file-provider授权。对于网络访问,添加Network capability。所有其他权限都受到iOS沙盒的严格限制。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。