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

Posted

技术标签:

【中文标题】在构建脚本中使用 xctool 和 xcodebuild 进行代码签名后,ITC 上的代码签名权利无效【英文标题】:Invalid Code Signing Entitlements on ITC after code signing with xctool and xcodebuild in build scripts 【发布时间】:2015-08-13 20:07:19 【问题描述】:

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

上传 .ipa 后 ITC 出错:

无效的代码签名权利。您的应用程序包签名中的权利与配置文件中包含的权利不匹配。根据配置文件,该包包含一个不允许的键值:“Payload/Product.app/Product”中的键“keychain-access-groups”的“[“AAAAAAAAA.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

编辑:

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

【问题讨论】:

【参考方案1】:

这是我发现的有效修复方法。

原始.ipa创建行

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

替换为这一行:

xcrun -sdk iphoneos PackageApplication ./$PROJECT_NAME.xcarchive/Products/Applications/$PROJECT_NAME.app -o `pwd`/$PROJECT_NAME.ipa --sign "$IDENTITY" - -embed "$PROVISIONING_PROFILE_FILE"

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

【讨论】:

以上是关于在构建脚本中使用 xctool 和 xcodebuild 进行代码签名后,ITC 上的代码签名权利无效的主要内容,如果未能解决你的问题,请参考以下文章

ERROR ITMS-90046 using xctool / xcodebuild vs XCode Archive 的成功

xctool 构建失败:在“Debug-iphonesimulator”下找不到测试包

xcodebuild & xcrun & xctool 脚本打包

ios shell打包脚本 xctool

如何更改 Travis CI 中的 xctool 目标

使用 xctool 在没有模拟器的情况下进行测试