93 lines
3.8 KiB
Swift
93 lines
3.8 KiB
Swift
// iOS File Provider extension scaffold for UltiDrive (drive-mount).
|
|
//
|
|
// Surfaces the Ulti drive in the system Files app. Add as a "File Provider
|
|
// Extension" target in the UltiDrive gen/apple project after `pnpm tauri ios
|
|
// init`. Requires the App Group `group.space.ulti.suite` and reads the OIDC
|
|
// token from the shared Keychain access group (service "space.ulti.suite").
|
|
//
|
|
// This is a minimal NSFileProviderReplicatedExtension skeleton — wire the item
|
|
// enumeration + content fetch to /api/v1/drive. Targets iOS 16+.
|
|
|
|
import FileProvider
|
|
|
|
final class FileProviderExtension: NSObject, NSFileProviderReplicatedExtension {
|
|
|
|
required init(domain: NSFileProviderDomain) {
|
|
super.init()
|
|
// TODO: load shared session (Keychain access group) for auth.
|
|
}
|
|
|
|
func invalidate() {}
|
|
|
|
func item(
|
|
for identifier: NSFileProviderItemIdentifier,
|
|
request: NSFileProviderRequest,
|
|
completionHandler: @escaping (NSFileProviderItem?, Error?) -> Void
|
|
) -> Progress {
|
|
// TODO GET /api/v1/drive/items/{identifier}; map to NSFileProviderItem.
|
|
completionHandler(nil, NSError(domain: NSFileProviderErrorDomain,
|
|
code: NSFileProviderError.noSuchItem.rawValue))
|
|
return Progress()
|
|
}
|
|
|
|
func fetchContents(
|
|
for itemIdentifier: NSFileProviderItemIdentifier,
|
|
version requestedVersion: NSFileProviderItemVersion?,
|
|
request: NSFileProviderRequest,
|
|
completionHandler: @escaping (URL?, NSFileProviderItem?, Error?) -> Void
|
|
) -> Progress {
|
|
// TODO download /api/v1/drive/items/{id}/content to a temp URL.
|
|
completionHandler(nil, nil, NSError(domain: NSFileProviderErrorDomain,
|
|
code: NSFileProviderError.serverUnreachable.rawValue))
|
|
return Progress()
|
|
}
|
|
|
|
func createItem(
|
|
basedOn itemTemplate: NSFileProviderItem,
|
|
fields: NSFileProviderItemFields,
|
|
contents url: URL?,
|
|
options: NSFileProviderCreateItemOptions = [],
|
|
request: NSFileProviderRequest,
|
|
completionHandler: @escaping (NSFileProviderItem?, NSFileProviderItemFields, Bool, Error?) -> Void
|
|
) -> Progress {
|
|
// TODO POST /api/v1/drive/items (upload).
|
|
completionHandler(nil, [], false, NSError(domain: NSFileProviderErrorDomain,
|
|
code: NSFileProviderError.serverUnreachable.rawValue))
|
|
return Progress()
|
|
}
|
|
|
|
func modifyItem(
|
|
_ item: NSFileProviderItem,
|
|
baseVersion version: NSFileProviderItemVersion,
|
|
changedFields: NSFileProviderItemFields,
|
|
contents newContents: URL?,
|
|
options: NSFileProviderModifyItemOptions = [],
|
|
request: NSFileProviderRequest,
|
|
completionHandler: @escaping (NSFileProviderItem?, NSFileProviderItemFields, Bool, Error?) -> Void
|
|
) -> Progress {
|
|
completionHandler(nil, [], false, NSError(domain: NSFileProviderErrorDomain,
|
|
code: NSFileProviderError.serverUnreachable.rawValue))
|
|
return Progress()
|
|
}
|
|
|
|
func deleteItem(
|
|
identifier: NSFileProviderItemIdentifier,
|
|
baseVersion version: NSFileProviderItemVersion,
|
|
options: NSFileProviderDeleteItemOptions = [],
|
|
request: NSFileProviderRequest,
|
|
completionHandler: @escaping (Error?) -> Void
|
|
) -> Progress {
|
|
// TODO DELETE /api/v1/drive/items/{identifier}.
|
|
completionHandler(nil)
|
|
return Progress()
|
|
}
|
|
|
|
func enumerator(
|
|
for containerItemIdentifier: NSFileProviderItemIdentifier,
|
|
request: NSFileProviderRequest
|
|
) throws -> NSFileProviderEnumerator {
|
|
throw NSError(domain: NSFileProviderErrorDomain,
|
|
code: NSFileProviderError.noSuchItem.rawValue)
|
|
}
|
|
}
|