我正在为持续集成情况编写一些构建脚本,其中代码将部署在另一台机器上,并且需要能够构建并正确签署 Xcode 项目,然后将我的脚本上传到 ITC。到目前为止,我能够构建并存档到 .ipa,验证代码签名,但 ITC 失败并出现以下错误。为什么会发生此错误,我可以添加什么来解决这种情况?
上传 .ipa 后 ITC 出现错误:
无效的代码签名权利。您的应用程序包签名中的权利与配置文件中包含的权利不匹配。根据配置文件,捆绑包包含一个不允许的键值:'[ "AAAAAAAAA.com.domain.Product" ]' for the key 'keychain-access-groups' in 'Payload/Product.app/Product' "
请注意,在目标构建机器上,我将 .mobileprovision 文件安装在“$HOME/Library/Provisioning Profiles”中,并创建一个具有相关 .cert 和 .p12 私钥的自定义钥匙串,以便构建可以签署文件。在 xctool 最终识别出密钥和配置文件之前,这需要花费相当多的时间。
我正在使用相同的 Distribution App Store 证书和配置文件,我可以在我的机器上的 Xcode 上使用,这工作正常。
这是我构建代码和归档 ipa 的方式。
xctool -project ./$PROJECT_NAME.xcodeproj
-scheme $SCHEME
-configuration Release
CODE_SIGN_IDENTITY="${IDENTITY}"
PROVISIONING_PROFILE="${PROVISIONING_PROFILE_UUID}"
OTHER_CODE_SIGN_FLAGS="--keychain $HOME/Library/Keychains/$KEYCHAIN"
clean archive
-archivePath ./$PROJECT_NAME.xcarchive
xcodebuild -exportArchive -archivePath ./$PROJECT_NAME.xcarchive
-exportPath $PROJECT_NAME
-exportFormat ipa
-exportProvisioningProfile "$PROVISIONING_PROFILE_NAME"
如果这意味着什么,我还可以验证解压缩的 ipa 应用程序是否已签名。如果没有按上述方式进行签名,它肯定会失败。
$codesign --verify -vvvv Payload/Product.app
Payload/Product.app: valid on disk
Payload/Product.app: satisfies its Designated Requirement
编辑:
我使用 ITC 接受的 XCode 进行了构建/归档/导出,并将结果与脚本生成的构建进行了比较。
脚本化的 ipa 缺少一个文件 archived-expanded-entitlements.xcent。这似乎是问题的根源。
<?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>application-identifier</key>
<string>AAAAAAA.com.domain.Product</string>
<key>keychain-access-groups</key>
<array>
<string>AAAAAAA.com.domain.Product</string>
</array>
</dict>
</plist>