【问题标题】:File types association with my app与我的应用程序的文件类型关联
【发布时间】:2018-02-25 14:57:30
【问题描述】:

我的应用程序能够导出和导入 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>

导出按预期工作,没有问题。导入也很有效,但仅适用于存储在my app iCloud folder 之外的文件,即当我从邮件或通用 iCloud 文件夹中点击 .txt 文件时,我可以在其他应用程序旁边的"Import with ..." 菜单中看到我的应用程序。但是当我从my app folder on iCloud 点按完全相同的文件时,我的应用程序未列在"Import with ..." 菜单中。

为了澄清我所说的my app folder on 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 驱动器中创建 app 文件夹并将我的文件存储在那里。当我点击这个文件时,我在"Import with ..." 菜单中看不到我的应用程序。当我将文件移出应用程序文件夹时,我的应用程序出现在 "Import with ..." 菜单中。

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

【问题讨论】:

    标签: ios swift icloud icloud-drive icloud-documents


    【解决方案1】:

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

    更新

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

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

    【讨论】:

    • 您好 Rein,感谢您的回答,请您详细说明一下。对于其他应用程序,我可以看到 3 种类型的文件关联:1)导入到...,2)复制到...,3)只是应用程序名称。它们中的每一个有何不同,是否可以将其中任何一个用于应用程序读取/打开/复制/导入等,应用程序自己的 icloud 文件夹中的文件?
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2012-01-29
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2011-02-15
    相关资源
    最近更新 更多