我正在使用Mono Framework将.NET应用程序移植到OSX。该应用程序运行良好,除了包装之外,我们已经完成了所有工作。我在捆绑包中打包了一个独立的Mono构建,以避免依赖性,并使用此工具完成任务:https://github.com/OutOfOrder/MonoKickstart
我们使用的束结构如下:
OurApp.app
-Contents
+-Info.plist
+-MacOS
| +-osx - native libraries for osx
| +-mono - mono config files
| ... - the OS X kickstart binaries, the .exe file, C# .dlls
-Resources/
-icon.icns
当OS X的Gatekeeper功能启动时,捆绑包运行良好,但当试图对其进行签名以使其始终运行时,我遇到了问题。。。
$ codesign -s "3rd Party Mac Developer Application: Our Certificate" --force --deep --verbose OurApp.app
OurApp.app: bundle format unrecognized, invalid, or unsuitable
In subcomponent: OurApp.app/Contents/MacOS/mono/4.0
好吧,我会暂时删除mono目录,看看它是否会继续:
$ codesign -s "3rd Party Mac Developer Application: Our Certificate" --force --deep --verbose OurApp.app
OurApp.app: signed bundle with Mach-O universal (i386) [org.ourcompany.ourapp]
成功!我是这么认为的,但当我尝试运行该应用程序时,它仍然说它仍然被Gatekeeper屏蔽。当我运行时
spctl -a -v OurApp.app
OurApp.app/: rejected
那是什么呢?它说它签署了捆绑包,如果我理解正确的话,使用--deep参数,它应该已经签署了所有的库等等。我该怎么做才能让它发挥作用?
更新:
尝试使用此逐一对文件进行签名。
codesign -s "3rd Party Mac Developer Application: Our Certificate" --force --verbose OurAppExecutable.bin
但它拒绝这样做,因为"子组件"(即使我没有使用--deep)。
我最终通过将除实际二进制文件外的所有其他文件移动到Resources文件夹,然后对二进制文件进行签名,然后对应用程序捆绑包进行签名。
但是,它说:
spctl -a -v OurApp.app
OurApp.app/: rejected
source=No Matching Rule
有什么进一步的见解吗?
我不确定--deep是否应该工作,但它不是我们在Xamarin.Mac项目代码签名时在Xamarin Studio中使用的。我们所做的是分别对每个原生库进行代码签名,然后对应用程序捆绑包本身进行代码签名。
希望能有所帮助。
更新:这可能是问题所在:
OurApp.app: bundle format unrecognized, invalid, or unsuitable
In subcomponent: OurApp.app/Contents/MacOS/mono/4.0
问题可能是MonoKickStart没有生成正确的Mac可执行文件?
之后我就开始工作了。诀窍是在MacOS目录中只保留一个也是唯一的可执行文件,并在Resources目录中保留其他所有文件。这样我们就不需要对所有其他文件进行签名。
另一个错误——不是这个问题的根源,而是另一个问题的根源——是我们试图用错误的证书签名。"第三方Mac开发者应用程序"显然用于应用商店提交。这个名字有点误导人,所以很容易搞砸。更多信息:"Mac开发者"one_answers"第三方Mac开发者应用程序"之间的区别