我了解,如果我在 iOS 应用程序的 Info.plist 中提供 UIFileSharingEnabled 和 LSSupportsOpeningDocumentsInPlace 键,我的应用程序的 Documents 文件夹中的文件将显示在 Files.app(“在此 iPad 上”)和文档浏览器中。
现在我的问题 - 除了编写文件提供程序扩展之外 - 有没有办法添加应用程序组的文件夹或用应用程序组文件夹中的文件夹替换文档文件夹? 为了在扩展程序之间共享,我将所有内容保存在“应用程序组”文件夹中,而不是“文档”中,但是,当然,Files.app 无权访问这些文件,这就是我问的原因。
我尝试创建从文档文件夹到实际文件的符号链接,并且显示了它们,但无法正常工作(“文件不存在”)。
我还创建了一个文件提供程序扩展,但它被 Apple 拒绝,因为我的扩展没有云支持,并且仅适用于本地文件。根据我的审阅者的说法,文件提供程序扩展必须支持云存储。
感谢您的帮助和见解,
-马特
这很简单:不。:(
我们正在努力解决同样的问题,而且很简单:如果您不将文件存储在“文档”文件夹中,您将无法参与文件应用程序(或 iTunes 文件共享)。
这似乎是考虑不周的。除非您实际上提供诸如 dropbox 之类的文件系统,否则您不应该作为文件提供程序进行集成,至少我们在 WWDC 上是这么被告知的。另一方面,您应该支持 iMessage 扩展、today 扩展等内容……只有当您的文件可通过应用程序组访问时才可能实现。但这会自动中断 Files.app 以及 iTunes 文件共享的使用。
我们为此提交了雷达,我想任何重复的都会有所帮助。
在主应用程序中,为文档 URL 添加书签并保存到应用程序组的用户默认值。然后从应用程序扩展内部访问书签。这要求主应用程序已打开一次并在应用程序扩展运行之前运行此代码。 (感谢BeepStreet开发者为我提供这个答案!)
伪代码如下... 主应用程序
let documentsDirectory = try FileManager.default.url(for: .documentDirectory,
in: .userDomainMask,
appropriateFor: nil,
create: true).path
let appGroup: String = "group.app.example.etc"
let bookmark = documentsDirectory.bookmarkData(options: .minimalBookmark,
includingResourceValuesForKeys: nil,
relativeTo: nil)
if let userDefaults = UserDefaults(suiteName: appGroup) {
userDefaults.set(bookmark, forKey: "documentsDirectory")
}
应用程序扩展
let userDefaults = UserDefaults(suiteName: appGroup),
let bookmark = userDefaults.value(forKey: "documentsDirectory") as? Data
{
let resolvedURL = try URL(resolvingBookmarkData: bookmark, options: [], relativeTo: nil, bookmarkDataIsStale: nil)
}
不要忘记适当地访问书签....
resolvedURL.startAccessingSecurityScopedResource()