我面临着一个棘手的问题,我希望有人以前也遇到过类似的事情。
我创建了一个OS X应用程序(应用程序捆绑包,在Yosemite 10.10.2上测试),其中有几个助手子应用程序作为捆绑包的一部分。这些子应用程序存储在它们自己的应用程序捆绑包中。
结构为:
AppName.app
-> Contents/Frameworks/SubAppName_1.app
-> Contents/Frameworks/SubAppName_2.app
等等。这一切都很好,一点问题都没有。
当我对我的应用程序进行沙盒/代码设计,为开发/AdHoc/Mac应用商店部署做准备时,这个问题开始出现。
我正在使用以下命令签署我的应用程序捆绑包(+子组件)
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
有人知道是什么原因造成的吗?一定是我做错了什么!
我们遇到了同样的问题,并向苹果开发者支持部门打开了票证。然而,我们在嵌套的捆绑包中发现了导致问题的松弛。
OS X使用不区分大小写的文件系统。因此,将嵌套框架命名为"SubAppName_1.app"或"SubAppName_1.app"基本上无关紧要。直到Yosemite,这都是事实。在OS X 10.10中,苹果公司开始使用amfid(苹果移动文件完整性守护程序),这是一款源自iOS的软件。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
一旦我们调整了所有名称的大小写敏感性,问题就消失了。