代码在构建脚本中使用xctool和xcodebuild进行代码签名后ITC上的代码签名无效

问题描述:

我正在编写一些构建脚本,以实现代码将部署在另一台计算机上的持续集成情况,并且需要能够构建正确签署一个Xcode项目,然后将我的脚本上传到ITC。到目前为止,我能够构建并存档到.ipa,验证代码签名,但ITC失败并出现以下错误。为什么会发生这个错误,我可以添加什么来解决这种情况?在ITC代码在构建脚本中使用xctool和xcodebuild进行代码签名后ITC上的代码签名无效

错误的.ipa的上传后:

无效代码签名授权。应用程序包签名中的权利与供应配置文件中包含的权利不匹配。根据供应配置文件,捆绑包包含一个不允许的密钥值:'[Payload/Product.app/Product'中的密钥'keychain-access-groups'的'[AAAAAAAA.com.domain.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 

编辑:

我没有使用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> 

下面是我发现的修复工作。

原始的.ipa创建线

xcodebuild -exportArchive -archivePath ./$PROJECT_NAME.xcarchive -exportPath $PROJECT_NAME -exportFormat ipa -exportProvisioningProfile "$PROVISIONING_PROFILE_NAME" 

这一行替换:

这也需要设置“代码签名资源规则路径”在Xcode中设置具有值“$ (SDKROOT)/ResourceRules.plist“,否则会引发错误。对于每个项目都需要这样做并不满意,但这只是一次性解决问题。