ios - 与我的应用关联的文件类型

标签 ios swift icloud icloud-drive icloud-documents

我的应用程序能够导出和导入 txt 文件。我的.plist中的CFBundleDocumentTypesUTExportedTypeDeclarations如下:

<key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeIconFiles</key>
            <array>
                <string>Icon60@2x</string>
            </array>
            <key>CFBundleTypeName</key>
            <string>CSV</string>
            <key>CFBundleTypeRole</key>
            <string>Default</string>
            <key>LSHandlerRank</key>
            <string>Default</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>public.text</string>
            </array>
        </dict>
    </array>

<key>UTExportedTypeDeclarations</key>
    <array>
        <dict>
            <key>UTTypeConformsTo</key>
            <array>
                <string>public.text</string>
            </array>
            <key>UTTypeDescription</key>
            <string>CSV</string>
            <key>UTTypeIdentifier</key>
            <string>public.text</string>
            <key>UTTypeTagSpecification</key>
            <dict>
                <key>public.filename-extension</key>
                <string>csv</string>
                <key>public.mime-type</key>
                <string>application/myApp</string>
            </dict>
        </dict>
    </array>

导出工作如预期,没有问题。导入也很有效,但仅适用于存储在 我的应用程序 iCloud 文件夹 之外的文件,即当我从邮件或通用 iCloud 文件夹中点击一个 .txt 文件时,我可以在 中看到我的应用程序”使用...导入” 其他应用程序旁边的菜单。但是,当我从 iCloud 上我的应用程序文件夹 中点击完全相同的文件时,我的应用程序未在 “导入方式...” 菜单中列出。

为了阐明我所说的 iCloud 上的我的应用程序文件夹 的意思。应用程序具有使用以下功能导出和保存 iCloud 上某些数据的功能:

func autoExportToIcloudDrive(_ localFileURL:URL, fileNameST:String) {
        let iCloudDocumentsURL = FileManager.default.url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents").appendingPathComponent("\(fileNameST).csv");
        if iCloudDocumentsURL != nil {
            let olderFileURL = iCloudDocumentsURL?.appendingPathComponent(fileNameST);
            if FileManager.default.fileExists(atPath: olderFileURL!.path) {
                self.uniFunc.deleteFileAtPath(pathUrl: olderFileURL!);
            }
            do {
                try FileManager.default.copyItem(at: localFileURL, to: iCloudDocumentsURL!);
            } catch {
                let nserror = error as NSError;
                fatalError("\(nserror), \(nserror.userInfo)");
            }
        }
    }

这会在 iCloud 驱动器中创建应用程序文件夹并将我的文件存储在那里。当我点击这个文件时,我在 "Import with ..." 菜单中看不到我的应用程序。当我将文件移出应用程序文件夹时,我的应用程序出现在 "Import with ..." 菜单中。

这是预期的设计吗?应用程序不应“查看”它们自己的 iCloud 驱动器文件夹中的文件,或者我在 .plist 文件中缺少某种附加文件关联?

最佳答案

这是有意为之的行为,因为“导入”不同于“打开”。通过导入文件,您可以将其内容作为应用程序数据的一部分。您的应用程序 iCloud 容器中的文件已经是您的应用程序数据的(一部分),因此将它们导入您的应用程序数据没有任何意义。

更新

CFBundleDocumentTypes 下的以下属性将影响您的应用是否以及如何在文件上下文中呈现:

  • CFBundleTypeRole 的值:“编辑器”与“查看器”——持久编辑需要将文件导入应用程序数据(此处“默认”不是有效值)
  • 已分配 LSHandlerRank:“所有者”、“默认”、“备用”——声明为文件类型的主要应用(所有者)可能会导致“导入方式”部分被删除
  • 注册正确的 LSItemContentTypes:“.csv”文件将被识别为“public.comma-separated-values-text”(kUTTypeCommaSeparatedText)

关于ios - 与我的应用关联的文件类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46256126/

相关文章:

ios - 如何在 Swift 中更改结构中的变量存储属性?

iphone - 观察 NSURL iCloud 属性

ios - Xcode 11 - 实例方法...与另一个类别的相同方法冲突

ios - 如何创建在触发功能时通过的测试?

ios - 当用户使用 UISwitch 禁用它时,如何暂时禁用所有本地通知?

ios - 在 iOS 中打开文档的 iCloud 错误

ios - 将应用提交到使用iCloud的App Store,无效的权利

ios - 在 UITableViewCell 中显示多个图像上传的进度指示器

ios - 为什么使用 nibName 初始化 View Controller 不会将新实例设置为文件所有者?

Swift 使用委托(delegate)实现多个协议(protocol)