objective-c - 调试 QuickLook 插件时出现 'bundle is damaged' 错误

标签 objective-c cocoa bundle appkit quicklook

我们正在向我们的项目添加一个 QuickLook 插件。

一切都很好,直到 macOS 尝试调用我们的插件,此时我们收到了令人喜爱的无法加载 bundle ,因为它已损坏或缺少必要的资源错误。

我们已使用 otool -L 对插件的二进制文件进行了检查,确保所有依赖项均已就位,但是一旦操作系统要求我们的插件预览文件类型在我们的支持下,我们得到:

22/04/17 12:03:05,716 quicklookd[55323]: 
[QL] Can't load plug-in at file:///Users/myname/Library/Developer/Xcode/DerivedData/The_Project-gpihzjouhxvifqcslmywktktizer/Build/Products/Debug/MyApp.app/Contents/Library/QuickLook/SomeQuickLookPlugIn.qlgenerator/: 
The bundle “SomeQuickLookPlugIn” couldn’t be loaded because it is damaged or missing necessary resources.

我们不太确定的一件事是对我们内部框架的依赖。

我们设置的插件与我们的主应用程序类似,即私有(private)框架依赖项解析为:

@executable_path/../Frameworks/MyFW.framework/Versions/A/MyFW(兼容版本1.0.0,当前版本1.0.0)

..如果 @executable_path 是主应用程序的二进制文件或插件的主二进制文件,那么当我们将框架复制到 bundle 中的两个位置时,它就可以正常工作。

有什么想法吗?

理想情况下,我们希望操作系统告诉我们它未能解决哪个依赖项 -
是否有可以设置的调试标志..?

最佳答案

根据https://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.htmlhttp://www.dribin.org/dave/blog/archives/2009/11/15/rpath/你应该

  • 将引用的框架的安装目录设置为@rpath
  • 在应用中将运行时搜索路径设置为@loader_path/../Frameworks
  • 并在 QuickLook 插件中按照建议将运行时搜索路径设置为 @loader_path/../../../../../Frameworks作者:catlan -
    这样您就不需要在 QuickLook 插件中复制引用的框架

编译、运行,如果其他一切设置正确,一切都应该正常工作。

此外,您可能需要检查插件中的代码签名设置,以确保那里没有问题。

您可以做的一件事是从应用程序中删除(或关闭)代码签名,然后查看它是否会加载插件...

要检查代码签名是否是问题所在,您可以使用终端暂时关闭应用程序的代码签名codesign --remove-signature YourApp.app并查看它是否有效。

关于objective-c - 调试 QuickLook 插件时出现 'bundle is damaged' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43557986/

相关文章:

ios - 如何在应用程序中使用像素艺术?

objective-c - NSIndexPath 递增值

iOS - 删除 NSMutableArray 中的对象抛出 NSRangeException

ruby-on-rails - Bundler::HTTPError 无法从 https://rubygems.org/获取规范

objective-c - 按下UIButton后,在设置的延迟后播放声音

ios - 我应该始终为我的模型使用 Core Data 吗?

objective-c - 防止 NSTimer 在后台应用程序中触发延迟

swift - 重新加载数据后 NSCollectionViewItem 困惑

php - 制作 :entity command: [ERROR] Only annotation mapping is supported by make:entity

android-studio - Android 错误 : package android. 操作系统不存在