4

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

我创建了一个 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

任何人都有任何想法可能导致这种情况?一定有什么我做错了!

4

1 回答 1

1

我们遇到了同样的问题并打开了苹果开发者支持的票。然而,我们在嵌套包中发现了一个导致问题的漏洞。

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

一旦我们调整了所有名称的区分大小写,问题就消失了。

于 2015-08-20T08:34:42.240 回答