编辑:原来这不是代码签名问题,因此我正在更新以帮助遇到同样问题的任何人。
将MonoMac应用程序更新为Xamarin.Mac后,如果我更改了应用程序的名称,我会收到消息“您无法打开应用程序”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应用程序相比,存在一些差异:
archived-expanded-entitlements.xcent
现已放入Contents/Resources
Info.plist
被编译为二进制版本。Contents/MonoBundle
现在包含libMonoPosixHelper.dylib
,显然需要签名。PkgInfo
现已包含在Contents
中,内容为APPL????
为什么代码签名工具会突然关注应用程序的名称?我怎么能不关心这个名字?
答案 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在哪里查找可执行文件,并允许您毫无问题地重命名应用程序。