将文件从 iOS 应用程序扩展保存到包含的应用程序

Posted

技术标签:

【中文标题】将文件从 iOS 应用程序扩展保存到包含的应用程序【英文标题】:Saving files from an iOS app extension to the containing app 【发布时间】:2015-03-26 16:22:51 【问题描述】:

我正在努力添加使用共享按钮的功能,以允许用户保存文件以用于我的主应用程序。需要支持多种文件类型(图像、视频、音频、pdf 等)。

一般用例是: 用户使用标准相机应用程序拍照或使用语音备忘录应用程序进行录音。 用户单击“共享”按钮并从共享列表中选择我的分机。 对话框打开,让用户有机会为文件提供描述。 文件保存到我的主应用程序(包含应用程序)以后可以访问和处理它的位置。

我已经能够到达提示我共享文件的地步,但我无法找到一个位置来成功保存到我的主应用程序以后可以从中读取的位置。这甚至可能吗?有没有更好的方法来处理这种情况?

我目前正在使用 Xamarin 执行此操作,因此不支持调试(并且日志记录很少)。如果有人在 Objective C 中有答案,那至少会帮助我指明正确的方向。

【问题讨论】:

有没有找到好的方法?有示例代码吗? @Dave.Lebr1 您可以做的是确保您的应用和扩展在同一个应用组中,并且您可以从该公共目录读取和写入文件。我写的文件使用了一个也使用共享组的 NSUserDefaults: NSUserDefaults sharedPrefs = new NSUserDefaults ("group.com.name", NSUserDefaultsType.SuiteName); 我找到了如何与 NSUserDefaults 共享但问题是当我有超过 40 mb 的大文件时......应用程序崩溃了。因此,我无法将数据导入主机应用程序。但是,如果我将文件保存在组应用程序目录中并从主机应用程序中取回,我认为这会起作用。 您是在尝试将文件写入 NSUserDefaults 还是目录?在导入文件时,我使用 userDefaults 来跟踪文件的 URL 和元数据。我不相信我尝试过任何大于 20 兆的文件。崩溃日志中出现什么错误? 哦,好吧!是的,它因内存警告而崩溃......因为 NSUserDefaults 无法处理大数据。所以,我通过 NSUserDefaults 发送信息,这是文件的 url,然后我使用 NSFileManager 将文件保存到目录中? 【参考方案1】:

您需要做一些事情。

首先,你的应用和你的应用扩展应该属于同一个应用组:

https://developer.apple.com/library/prerelease/ios/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html#//apple_ref/doc/uid/TP40011195-CH4-SW19

然后您可以使用以下方式访问共享存储:

var groupUrl = NSFileManager.DefaultManager.GetContainerUrl ("***.com.mygroup")

现在您可以访问 groupUrl 指向的目录中的文件了。

【讨论】:

这对我帮助很大!谢谢!【参考方案2】:

Xamarin 为 iOS 创建共享扩展的指南:http://developer.xamarin.com/guides/ios/platform_features/introduction_to_extensions/

【讨论】:

我已经使用了该指南,它使我能够响应共享事件,但是我在从扩展程序中保存文件并在应用程序中重新打开它时遇到了问题。

以上是关于将文件从 iOS 应用程序扩展保存到包含的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

iOS8 扩展:将 CoreData 与包含的应用程序同步

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

如何将文件从 iOS 反应原生应用程序保存到 Files 文件夹

iOS将表单数据保存到多个文件

今天的 iOS 扩展目标成员资格是容器类还是用户默认值?

从 iOS 上的 UIView 将图像保存到应用程序文档文件夹