重命名导致“您无法打开应用程序”XXXXX“因为它可能已损坏或不完整。”更新到Xamarin.Mac后

时间:2015-05-22 02:53:02

标签: macos xamarin monomac info.plist xamarin.mac

编辑:原来这不是代码签名问题,因此我正在更新以帮助遇到同样问题的任何人。

将MonoMac应用程序更新为Xamarin.Mac后,如果我更改了应用程序的名称,我会收到消息“您无法打开应用程序”XXXXX“因为它可能已损坏或不完整。”看起来它可能是一个代码签名问题,因为当我运行codesign --verify时,我会得到code object is not signed at all

原始问题:

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

例如,如果我运行codesign --verify --deep -vvvv Program.app(其中ProgramCFBundleName匹配,我就会

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????
  5. 为什么代码签名工具会突然关注应用程序的名称?我怎么能不关心这个名字?

1 个答案:

答案 0 :(得分:0)

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

Xamarin.Mac的解决方案是添加

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

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