更改文档参数后,NSCocoaErrorDomain 256打开* new * docs

时间:2017-06-24 03:28:52

标签: macos cocoa info.plist nsdocument

对于基于NSDocument的应用程序的下一个版本,我正在修改文档参数,即Info.plist>中的值。 CFBundleDocumentTypes和UTExportedTypeDeclarations。具体来说,我正在从一个扁平的NSPersistentDocument更改为一个文档包(在BSManagedDocument的帮助下)。

修改后的应用程序可以创建新文档,但它们在Finder中显示一个通用图标,当我关闭这样一个新文档并尝试重新打开它时,-[NSDocumentController openDocumentWithContentsOfURL:display:completionHandler:]失败,在NSCocoaErrorDomain中创建一个错误代码256,无法处理描述“newDoc.myExtension”,因为MyApp无法打开此类型的文件,并且失败原因 MyApp无法打开此类型的文件

据我所知,CFBundleDocumentTypes和UTExportedTypeDeclarations有几个重要参数,这些参数必须都是正确的,否则会出现此错误。在这种情况下,它们是正确的。我已经通过将我构建的产品中的Info.plist与一个不同但相似的应用程序的Info.plist进行比较来确认这一点。

我还尝试使用main()中的LSRegisterURL()来调用inUpdate = true,但这没有帮助。

可能有什么问题?我在macOS 10.12.6中运行,使用macOS 10.13 SDK和Xcode 9构建。

1 个答案:

答案 0 :(得分:1)

显然问题在于更新Launch Services数据库。我将新应用程序(已修订Info.plist)复制到/Applications ,替换旧版本,然后启动此副本一次。在这两个步骤之后,当我重新打开Finder窗口时,文档图标现在是正确的,并且在重新启动我的新应用程序时,它现在可以重新打开它自己的新文档而不会出错。

更新:今天(macOS 10.13 Beta 8)我遇到了同样的问题,但将修正后的应用程序安装到/ Applications中无法正常工作。但是,这一次,通过在终端中运行以下命令重新启动Launch Services数据库,然后重新启动我的应用程序,确实有效:

/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain u -domain s -domain l -v

上述的一个副作用是,某些应用程序将在dock和cmd-tab应用程序切换器中具有通用图标,直到重新启动。

我认为启动服务比/Applications中的应用程序更喜欢Xcode的DerivedData文件夹中的应用程序,即使后者是当前唯一运行的应用程序,或者是从Xcode运行应用程序&# 39; s DerivedData根本没有注册,或两者兼而有之。

从文档中可以看出,调用LSRegisterURL()应该具有相同的效果,但显然不是。