文件类型与我的应用程序关联

时间:2017-09-16 16:38:05

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

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

<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澄清我的意思。 App具有使用以下功能在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 ..."菜单中看到我的应用。当我将文件移出app文件夹时,我的应用程序会显示在"Import with ..."菜单中。

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

1 个答案:

答案 0 :(得分:0)

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

<强>更新

CFBundleDocumentTypes 下的以下属性将对您的应用在文件上下文中的显示方式和方式产生影响:

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