【问题标题】:MacOS Application can't reopen autosaved filesMacOS 应用程序无法重新打开自动保存的文件
【发布时间】:2021-11-04 21:14:24
【问题描述】:

我正在构建一个基于 MacOS SwiftUI 文档的应用程序,我在其中定义了一个带有新扩展名的新导出类型标识符以及所有这些。

一开始,我并不关心类型标识符,所以我将它命名为com.example.Dapka.dap,但后来,我试图摆脱example这个词,将标识符从Info.xml更改为com.Dapka.dap。 plist 和文档声明文件,但是从那时起,每次我尝试重新打开自动保存的文档时,它都不会打开,并且我在控制台中看到以下错误:

此应用程序无法重新打开自动保存的 com.example.dapka.dap 文件。

-[NSDocumentController rebootDocumentForURL:withContentsOfURL:display:completionHandler:] 在状态恢复期间失败。这是错误:

Error Domain=NSCocoaErrorDomain Code=256 "自动保存的文档 “(null)”无法重新打开。 Dapka无法打开“Dapka”中的文件 文档”格式。” UserInfo={NSUnderlyingError=0x600003e5e610 {Error Domain=NSCocoaErrorDomain Code=256 ""未保存的 Dapka 文档 5" 可以 因为Dapka无法打开“Dapka Document”中的文件,所以不做处理 格式。” UserInfo={NSLocalizedDescription=“未保存的 Dapka 文档 5” 无法处理,因为Dapka无法打开“Dapka”中的文件 Document”格式。, NSLocalizedFailureReason=Dapka 无法打开文件 “Dapka 文档”格式。}}, NSLocalizedDescription=自动保存的 无法重新打开文档“(null)”。 Dapka 无法打开文件 “Dapka 文档”格式。, NSLocalizedFailureReason=Dapka 不能 以“Dapka Document”格式打开文件。}

这里是Exported Type Identifier,如 info.plist 所示:

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
            <string>public.content</string>
        </array>
        <key>UTTypeDescription</key>
        <string>Dapka Document</string>
        <key>UTTypeIdentifier</key>
        <string>com.Dapka.dap</string>
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>dap</string>
            </array>
        </dict>
    </dict>
</array>

这也是Document Types

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeIconSystemGenerated</key>
        <integer>1</integer>
        <key>CFBundleTypeName</key>
        <string>Dapka Document</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>LSHandlerRank</key>
        <string>Owner</string>
        <key>LSItemContentTypes</key>
        <array>
            <string>com.Dapka.dap</string>
        </array>
        <key>NSDocumentClass</key>
        <string></string>
        <key>NSUbiquitousDocumentUserActivityType</key>
        <string>$(PRODUCT_BUNDLE_IDENTIFIER).dap</string>
    </dict>
</array>

这是文档声明文件中的文档变量:

extension UTType {
    static var dapkaDocument = UTType(exportedAs: "com.Dapka.dap")
}

请注意,当我将标识符返回到com.example.dapka.dap 时,一切都恢复正常。我很困惑,我认为还有一些地方包含旧的example 字。

【问题讨论】:

    标签: swift macos swiftui document-based


    【解决方案1】:

    当您更改标识符时,您实际上创建了一个新的文档类型。您使用旧标识符创建的文档不会打开,因为您更改了标识符。

    如果您处于开发初期,最简单的做法就是放弃旧文档。使用新标识符创建新文档。

    如果您需要打开使用旧标识符的文档,请使用旧标识符创建一个 UTType。

    extension UTType {
        static var oldDapkaDocument = UTType(importedAs: "com.example.Dapka.dap")
    }
    

    在您的文档结构中应该有一个 readableContentsType 属性,其中包含一个 UTTypes 数组。将您使用旧标识符创建的 UTType 添加到数组中。

    static var readableContentTypes: [UTType] { [.dapkaDocument, .oldDapkaDocument] }
    

    现在应用应该能够使用旧标识符和新标识符打开文档了。

    【讨论】:

    • 使用 2 个标识符是一个很好的解决方法,谢谢!
    【解决方案2】:

    我以前也遇到过同样的问题。导致问题的原因是 Xcode 兑现数据,因此您可能需要清理该缓存。

    1.清理构建

    从菜单中选择Product,然后点击Clean Build FolderShift+Command+K

    2。删除 Xcode 构建文件夹

    如果上一步没有解决问题,这一步应该可以解决问题。 Derived Data 是 Xcode 存储临时构建数据和索引的文件夹,因此您可以毫无问题地删除它。

    从菜单中选择 Xcode,然后点击 Preferences Command+,,然后点击 Locations。现在,在派生数据下,您将看到该文件夹​​的位置,单击该位置旁边的箭头以在 Finder 中打开该文件夹,然后将其删除,然后清空垃圾箱。

    或者,您可以使用终端删除文件夹:

    cd /Users/<YOUR_MAC_NAME>/Library/Developer/Xcode
    sudo rm -rf DerivedData
    

    【讨论】:

    • 做到了!问题出在缓存中,谢谢!
    猜你喜欢
    • 2022-06-10
    • 2018-09-11
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2013-05-18
    相关资源
    最近更新 更多