OS X网守/ codesign:签名无效

时间:2015-05-02 10:45:07

标签: macos codesign entitlements osx-gatekeeper

我面临一个棘手的问题,我希望有人之前遇到类似的事情。

我创建了一个OS X应用程序(应用程序包,在Yosemite 10.10.2上进行测试),其中有几个辅助子应用程序作为此捆绑包的一部分。这些子应用程序存储在自己的应用程序包中。

结构是:

AppName.app
      -> Contents/Frameworks/SubAppName_1.app
      -> Contents/Frameworks/SubAppName_2.app

等等。这一切都很好,没有任何问题。

当我对应用程序进行沙盒/编码时,问题就开始出现,以便为开发/ AdHoc / Mac App Store部署做好准备。

我使用以下命令签署我的应用包(+子组件)

codesign --verbose --force --sign "$IDENTITY" --entitlements entitlements.child "$OUTDIRECTORY/AppName.app/Contents/Frameworks/SubAppName_1.app" 
codesign --verbose --force --sign "$IDENTITY" --entitlements entitlements.child "$OUTDIRECTORY/AppName.app/Contents/Frameworks/SubAppName_2.app" 
codesign --verbose --force --sign "$IDENTITY" --entitlements entitlements.parent "$OUTDIRECTORY/AppName.app"

再次,效果很好。签名的应用程序启动,工作正常。所有功能都正常,没有错误/崩溃/可见错误。与非沙盒/代码签名的应用程序类似。一切都在沙箱中运行。我可以使用该应用程序几个小时,没问题。

但是,如果我关闭应用程序一段时间(比如说,15-30分钟,这很随机),我会在其中一个上面出现签名无效错误子应用程序(主要包将它们作为子进程生成)。

12:38:56 MBA.local amfid[274]: /Applications/AppName.app/Contents/Frameworks/SubAppName_1.app/Contents/MacOS/SubAppName_1 signature not valid: 0xfffefa31
12:38:56 MBA kernel[0]: proc 82808: load code signature error 4 for file "SubAppName_1"
12:38:57 MBA.local amfid[274]: /Applications/AppName.app/Contents/Frameworks/SubAppName_1.app/Contents/MacOS/SubAppName_1 signature not valid: 0xfffefa31
12:38:57 MBA kernel[0]: proc 82811: load code signature error 4 for file "SubAppName_1"

如果我在几分钟后重新启动应用程序,一切仍然有效。十分之九的时间我需要重新编译应用程序以使其再次运行。但是,偶尔会随机重新开始工作。

当我在不相关的Yosemite设备上部署此应用的AdHoc版本时,同样的事情发生但我得到以下amfid错误代码: 0xfffefa2a

任何人都有任何想法可能导致这个?必须有一些我做错的事情!

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题并打开了Apple开发人员支持的门票。 然而,我们在嵌套包中发现了导致问题的松弛。

OS X使用不区分大小写的文件系统。因此,命名嵌套框架" SubAppName_1.app"基本上没有关系。或" subappname_1.app"。直到优胜美地才是真的。在OS X 10.10中,Apple开始使用由iOS发起的amfid(Apple Mobile File Integrity Daemon)。似乎amfid 确实考虑了文件和文件夹名称的区分大小写。

最后,我们将所有区分大小写,包括文件名,文件夹名称,软链接以及编译到框架可执行文件中的名称。

otool命令可以帮助您检查编译中使用的名称:

>otool -L <your main executable> //Gives list of libraries to load
>otool -D <nested bundle's executable> //Gives self-name of the library

一旦我们对齐所有名称的区分大小写,问题就会消失。