重命名导致 "You can't open the application "XXXXX" 因为它可能已损坏或不完整。"更新到 Xamarin.Mac 后

Rename causes "You can't open the application "XXXXX" because it may be damaged or incomplete." after updating to Xamarin.Mac

编辑: 事实证明这不是代码设计问题,所以我正在更新以帮助 运行 遇到同样问题的任何人。

将 MonoMac 应用程序更新到 Xamarin.Mac 后,如果我更改应用程序的名称,我会收到消息 "You can't open the application "XXXXX“因为它可能已损坏或不完整。”看起来这可能是一个代码设计问题,因为当我 运行 codesign --verify 我会得到 code object is not signed at all.

原题:

我最近将 MonoMac 应用更新为 Xamarin.Mac。在此过程中,协同设计步骤中的某些内容似乎发生了变化。具体来说,现在当我重命名应用程序包时,我会从 GUI 和命令行工具中收到代码签名错误。似乎如果应用程序包不匹配 CFBundleName,则签名无效。

例如,如果我 运行 codesign --verify --deep -vvvv Program.app(其中 Program 匹配 CFBundleName,我得到

Program.app: valid on disk
Program.app: satisfies its Designated Requirement

但是,如果我将名称更改为 Program2.app 和 运行 codesign --verify --deep -vvvv Program2.app,我会得到:

Program2.app: code object is not signed at all

搬回来,我又一次签名成功

从 MonoMac 应用程序与 Xamarin.Mac 应用程序的比较来看,存在一些差异:

  1. archived-expanded-entitlements.xcent 现在放在 Contents/Resources
  2. Info.plist 被编译成一些二进制版本。
  3. Contents/MonoBundle 现在包括 libMonoPosixHelper.dylib,这显然需要签名。
  4. PkgInfo 现在包含在 Contents 中,内容为 APPL????

为什么代码设计工具突然关心应用程序的名称?我怎样才能让它不关心名字?

事实证明,问题是从 MonoMac 到 Xamarin.Mac 的更新发生了变化,以某种方式将其设置为查找与应用程序包同名的可执行文件,因此如果您更改 Program.appProgram2.app,OS X 会查找 运行 Contents/MacOS/Program2 而不是 Contents/MacOS/Program。我仍然不确定为什么 MonoMac 版本在重命名时可以正常工作,但显然它有一些其他指向正确可执行文件的指针。

Xamarin.Mac的解决方法是添加

<key>CFBundleExecutable</key>
<string>[Original app name]</string>

Info.plist。这告诉 OS X 在哪里寻找可执行文件,并允许您毫无问题地重命名应用程序。