AppCenter构建Xamarin.iOS报错code signing key未在钥匙串找到
AppCenter 平台 Xamarin.iOS 构建签名密钥找不到问题排查方案
问题基础信息
当前在appcenter.ms为多分支iOS项目配置独立构建任务,每个分支对应独立Bundle ID,构建配置如下:
- 项目文件:
xxx.sln - 构建配置:Release Prod
- SDK版本:Xamarin.iOS 15.4
- Xcode版本:13.2.1
- 构建脚本:无
- 构建类型:真机设备包
- 触发方式:手动触发
- 环境变量:无
- 签名配置:
xx.mobileprovision描述文件 +distribution.p12分发证书
构建过程中「安装Apple证书」「安装Apple描述文件」步骤均显示执行成功,但编译阶段抛出错误:
"/Users/runner/work/1/s/WAppShell.sln" (Rebuild target) (1) -> "/Users/runner/work/1/s/WAppShell/WAppShell.iOS/WAppShell.iOS.csproj" (Rebuild target) (3) -> (_DetectSigningIdentity target) -> /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.Shared.targets(1566,3): error : iOS code signing key 'Apple Distribution: XXX, Inc (xxxxxxxxxx)' not found in keychain. [/Users/runner/work/1/s/WAppShell/WAppShell.iOS/WAppShell.iOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.Shared.targets(1566,3): error : [/Users/runner/work/1/s/WAppShell/WAppShell.iOS/WAppShell.iOS.csproj] 5 Warning(s) 1 Error(s) Time Elapsed 00:00:31.79 ##[error]Xamarin.iOS task failed with error Error: /Library/Frameworks/Mono.framework/Versions/6_12_12/bin/msbuild failed with return code: 1.
针对性排查步骤
按优先级从高到低操作即可,不需要一开始就重新生成所有证书:
- 第一步:校验p12证书有效性与匹配度
报错明确指定了构建过程要找的签名标识为Apple Distribution: XXX, Inc (xxxxxxxxxx),先把上传到AppCenter的distribution.p12文件下载到本地Mac,导入系统钥匙串核对三个点:- 证书的完整名称(包括括号内的10位团队ID)和报错里的字符串完全一致,不要用开发证书、其他团队的分发证书、过期旧证书凑数
- 导入后证书下拉能看到对应的私钥条目,当初导出p12的时候如果没选同时导出私钥,哪怕文件能正常安装,也没法完成签名
- 回忆下上传p12到AppCenter时填的导入密码是否正确,密码错误时安装步骤偶尔不会抛显性错误,但实际证书并没有正确导入到构建机钥匙串
- 第二步:核对分支对应csproj的签名配置
多分支多Bundle ID的场景最容易出现配置串分支的问题,打开当前构建分支下的WAppShell.iOS.csproj文件,定位到Release Prod配置对应的PropertyGroup节点,检查三个配置项:<CodesignKey>节点的值是否和报错里的签名标识完全一致,注意不要有多余空格、全角字符<BundleIdentifier>节点的值是否和当前分支应该对应的Bundle ID匹配,不要出现A分支配置成B分支Bundle ID的情况- 如果节点里硬编码了
<CodesignProvision>值,要确认这个描述文件名和你上传的xx.mobileprovision文件名一致
- 第三步:校验描述文件和证书的绑定关系
本地用文本编辑器打开上传的xx.mobileprovision文件,核对三个规则:- 描述文件类型为App Store分发类型,和你用的Distribution证书匹配
- 描述文件内包含的证书列表里,有你当前用的这张分发证书
- 描述文件支持的Bundle ID和csproj里配置的Bundle ID完全一致
三个条件有一个不满足,哪怕证书和描述文件都单独安装成功,构建过程也识别不到可用的签名组合
- 第四步:加前置脚本确认构建机实际安装的证书列表
现在构建配置里没有加自定义脚本,可以在构建的Pre-build阶段加一行shell脚本,直接打印构建机钥匙串里所有可用的签名证书:
跑一次构建看脚本输出:security find-identity -v -p codesigning- 如果输出列表里找不到你要的那张Distribution证书,直接换正确的带私钥的p12重新上传,填对导入密码即可
- 如果输出列表里有这张证书,直接把输出里显示的证书完整名称复制下来,替换csproj里
<CodesignKey>的现有值,大概率是配置里的证书名有看不见的特殊字符导致匹配失败
- 第五步:排查版本兼容问题
当前用的Xamarin.iOS 15.4 + Xcode 13.2.1版本组合本身是兼容的,如果前面几步都没问题,检查csproj里有没有硬编码CodesignAllocate工具路径指向旧版Xcode,有的话直接注释掉这个配置,让构建过程自动匹配当前Xcode版本的签名工具即可。
绝大多数这类「安装证书步骤成功但构建提示找不到证书」的问题,都是前四个步骤里的配置不匹配导致的,毕竟之前的构建任务是可运行的,只是没有留存配置文档,不需要大动干戈改构建环境。
内容的提问来源于stack exchange,提问作者Anders Nielsen
相关产品推荐
相关产品推荐

