将应用程序目标文件管理器中的文件共享到小部件扩展目标

Posted

技术标签:

【中文标题】将应用程序目标文件管理器中的文件共享到小部件扩展目标【英文标题】:Sharing files in FileManager or App target to a WidgetExtension target 【发布时间】:2021-05-05 14:55:29 【问题描述】:

我有一个 json 文件存储在我的应用程序的 FileManager 中,我想为我的小部件访问和解码它。我对文件使用以下网址:

let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        
let jsonURL = documentDirectory
    .appendingPathComponent(filename)
    .appendingPathExtension("json")

其中文件名是“列表”。

但是我不认为目标可以访问我应用的 FileManager 中的文件,因为我收到错误 Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=NSCocoaErrorDomain Code=260 "The file “list.json” couldn’t be opened because there is no such file."

我的previous question可能会提供一些额外的详细信息

【问题讨论】:

【参考方案1】:

如果您想在小部件和应用之间共享文件,而不是使用典型的.documentDirectory,您可以改用“应用组”。

您需要添加“应用程序组”权利 (https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_application-groups),然后您才能访问共享容器 url (https://developer.apple.com/documentation/foundation/filemanager/1412643-containerurl)

然后您的容器 URL 将可以通过执行类似 FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "APP_GROUP_ID_HERE") 的操作来访问,这将返回 URL?

您可以将组件附加到 URL,就像您在原始代码中所做的那样。

补充阅读:https://useyourloaf.com/blog/sharing-data-with-a-widget/

【讨论】:

要明确一点,因为我的应用程序已经发布了几个月,我还需要将应用程序文件传输到这个新路径,以便应用程序和小部件保持同步。因为我必须添加一些代码才能将文件从 documentDirectory 移动到共享容器? 是的,很遗憾,你会 如果这回答了您的问题,您可以用绿色复选标记将其标记为已接受。

以上是关于将应用程序目标文件管理器中的文件共享到小部件扩展目标的主要内容,如果未能解决你的问题,请参考以下文章

将 headerView 添加到小部件上的小部件中的 listView 调整大小 android

无法从 iOS 中删除今日视图扩展

Watchkit - 共享代码 - 框架、应用程序扩展、应用程序组、添加目标或只是复制文件?

使用共享扩展将图像保存到文档文件夹

如何将图像从 Firebase 存储显示到小部件中?

在 Swift 中的主 App 和 Today 小部件/扩展之间共享 UI 元素