我最近更新到了 XCode 6.3,并开始遇到一些奇怪的代码签名问题。有时 XCode 会开始抱怨代码签名问题。两者都会有这样的问题:
invalid or unsupported format for signature ... Command /usr/bin/codesign failed with exit code 1
或
... Command /usr/bin/codesign failed with exit code 11
尚无法找到模式,但看起来像是 XCode 代码符号的问题,因为有时在清理并重新启动 XCode 后它会起作用。
我没有更改任何有关代码签名的设置。项目结构比较复杂,有引用的项目和pod。
任何帮助表示赞赏。
** 更新 **
删除派生数据或重新启动 XCode 对我没有帮助。 但如果我删除该项目并从 git 下载新的,它确实有效。这删除了未提交到 git 的 XCode 文件。
清洁后再次停止工作。在控制台日志中我有这样的内容:
codesign[4111]: Internal error unloading bundle CFBundle 0x7fb44a40adc0 <(null)> (framework, not loaded)
** 另一个更新 **
在推特上发现有人有同样的问题。 看起来 问题是由代码签名中的 --deep 选项引起的。
https://github.com/atom/atom-shell/issues/1396
解决方案是不要使用 --deep 对应用程序和框架进行代码签名。而是分别对每个框架进行代码签名。
在最新的 Xcode 更新后,我也遇到了这种情况。但 Xcode 已经建议我更新我的项目设置有一段时间了,我只是没有抽出时间去做。您提供的链接很好地解释了这一点。
它实际上在导航器中显示为一个问题,当您选择该问题时,Xcode 会自动为您修复它。您只需要自己从构建设置中删除 --deep 选项即可。
这适用于我的两个第 3 方框架 Sparkle 和 Syphon。
问题是由 --deep 代码签名选项和权利引起的。
为了解决这个问题,我必须手动对框架进行代码签名。 这需要添加新的运行脚本构建阶段,并运行与此类似的脚本:
IDENTITY="HEX_IDENTITY"
export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"
FRAMEWORKS_LOCATION="${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"
EXECUTABLES_LOCATION="${BUILT_PRODUCTS_DIR}"/"${EXECUTABLE_FOLDER_PATH}"
codesign --verbose --force --deep --verify --sign "$IDENTITY" "$EXECUTABLES_LOCATION/MY_HELPER_APP.app"
codesign --verbose --force --deep --verify --sign "$IDENTITY" "$FRAMEWORKS_LOCATION/MY_FRAMEWORK/Versions/A"
HEX_IDENTITY可以通过shell命令获取:
security find-identity
这将显示签名身份列表及其十六进制数字。
将应用程序导出为应用程序后,我使用命令验证了代码签名:
codesign --verify --verbose --deep MyApp.app
spctl --verbose --assess --type execute MyApp.app
参考资料: