我想使用共享表共享一个文件,并编写了似乎工作正常的代码。但是我一直在日志中看到这些错误消息(使用 Xcode 11.3)
[ShareSheet] connection invalidated
Run Code Online (Sandbox Code Playgroud)
我有两个正在测试的物理设备;运行 iOS 13.1.2 的 iPad 和运行 11.4 的 iPhone 6。我在装有旧版 iOS 的 iPhone 上看不到这些消息。在这两种情况下,共享似乎都可以正常工作。这是我使用文本而不是文件的代码:
let activityViewController = UIActivityViewController(activityItems: ["simple text for test"], applicationActivities: nil)
activityViewController.excludedActivityTypes = [.message, .airDrop]
activityViewController.popoverPresentationController?.barButtonItem = myBarButtonItem
self.present(activityViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)
当共享表消失时,该消息会显示(因为用户完成了一个操作,或者他们点击它之外以取消)。
忽略这些消息是否安全?奇怪的是,它们没有出现在旧操作系统中,但出现在新操作系统中。
2020 年 3 月 20 日编辑:我确认我提供了有效的来源或 barButtonItem。我已经更改了代码以匹配我使用 UIBarButtonItem 的地方,但我仍然看到 ShareSheet 连接无效错误。
我希望我的用户能够点击“文件”应用程序中的文件并将其发送到我的应用程序。以前,我已经将应用程序设置为能够在使用“打开方式”以这种方式共享文件时成功地从邮件打开文件。我使用的文件类型是我的应用程序自定义的。创建文档类型、导出的 UTI 和导入的 UTI 是为了启用“打开方式”,并且尚未更改。
如果文件尚未在“文件”应用程序中下载,我会收到错误消息(带有向下箭头的小云位于文件名旁边)。即使您长按它并选择“共享”并使用“打开方式”,我也会收到相同的错误。
如果该文件已从该设备添加到“文件”中,则该文件已经下载并在“文件”中点击它就可以正常工作。如何强制 Files 在将文件发送到我的应用程序之前下载该文件?我在网上搜索过,我能找到的唯一参考资料在这里: https: //forums.developer.apple.com/thread/47890,最后一篇文章讨论了同样的问题,但我在任何地方都找不到解决方案。
在我的 info.plist 文件中,我将应用程序设置为“支持就地打开文档”设置为“是”。我还将“应用程序支持 iTunes 文件共享”设置为“是”。
我正在检查该方法中 options[.openInPlace] 的值,application(_:open:options:)以检测该文件是否来自“文件”应用程序。url.startAccessingSecurityScopedResource()当文件已经下载到设备上时,我必须先添加调用,然后它才能工作。
这是执行处理的代码的精简版本:
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
let isOpenInPlace = options[.openInPlace] as? Bool
var securityScopedResource = false
if isOpenInPlace {
securityScopedResource = url.startAccessingSecurityScopedResource()
}
do {
let data = try Data(contentsOf: url)
// Use the data to create something inside my app
if securityScopedResource {
url.stopAccessingSecurityScopedResource()
} …Run Code Online (Sandbox Code Playgroud)