Unity iOS项目:命令行导出Xcode归档时禁用UnityFramework签名
我之前在CI/CD流水线中集成Unity iOS项目的企业版导出时,也遇到过完全一样的问题——Xcode手动导出一切正常,但命令行用xcodebuild就会报UnityFramework.framework does not support provisioning profiles的错误。下面是几个亲测有效的解决方案:
方案1:切换到自动签名模式(最推荐)
Xcode手动导出时能顺利跳过UnityFramework的配置文件检查,本质是它用了自动签名逻辑来处理不同目标的签名需求。我们只需要修改exportOptions.plist,把签名风格改成自动,让Xcode自动处理框架的签名:
更新后的exportOptions.plist内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>destination</key> <string>export</string> <key>method</key> <string>enterprise</string> <key>teamID</key> <string>XXXXXXXX</string> <key>signingStyle</key> <string>automatic</string> <!-- 可选:如果Xcode自动匹配企业版profile有问题,可以保留主APP的配置 --> <key>provisioningProfiles</key> <dict> <key>com.inhouse.test</key> <string>In House Test Profile</string> </dict> </dict> </plist>
修改后重新执行你的导出命令,Xcode会像手动操作时一样,自动识别UnityFramework不需要provisioning profile,顺利完成导出。
方案2:手动指定框架跳过签名检查(适合必须用手动签名的场景)
如果你的流水线必须使用手动签名模式,可以在导出命令中添加额外参数,单独给UnityFramework设置签名规则:
xcodebuild -exportArchive \ -exportOptionsPlist /path/exportOptions.plist \ -archivePath '/pathToArchive' \ -exportPath /exportPath \ -allowProvisioningUpdates \ CODE_SIGN_REQUIRED[UnityFramework]=NO \ CODE_SIGN_STYLE[UnityFramework]=Automatic
这里通过CODE_SIGN_REQUIRED[UnityFramework]=NO告诉Xcode不需要验证UnityFramework的签名,同时设置它的签名风格为自动,这样就能绕过报错,同时保持主APP的手动签名配置不变。
方案3:修改归档内的框架构建设置(备选方案)
如果前两个方案都不生效,你可以在归档之后、导出之前,手动修改UnityFramework的构建设置:
- 先解压归档文件(
.xcarchive其实是一个特殊的文件夹):
cd /path/to/archive/dir unzip -q YourAppArchive.xcarchive
- 找到UnityFramework的构建设置文件(一般在
Products/Library/Frameworks/UnityFramework.framework/Info.plist或者归档内的xcarchive/Products/Applications/YourApp.app/Frameworks/UnityFramework.framework/Info.plist),添加或修改以下键值对:
<key>CODE_SIGN_REQUIRED</key> <string>NO</string> <key>CODE_SIGN_STYLE</key> <string>Automatic</string>
- 重新打包成
.xcarchive格式,再执行导出命令。
这个方法步骤相对繁琐,一般作为前两个方案的备选。
问题根源
当使用signingStyle=manual时,xcodebuild会强制给归档中的所有目标(包括主APP和嵌入式框架)应用指定的provisioning profile,但UnityFramework作为嵌入式框架,本身不需要独立的配置文件——Xcode手动导出时会自动识别这一点,但命令行的手动签名模式没有这个智能判断,因此触发了报错。
内容的提问来源于stack exchange,提问作者DimKa

