我正在为持续集成的情况编写一些构建脚本,其中代码将部署在另一台机器上,并且需要能够构建并正确签署Xcode项目,然后我将脚本上载到ITC。到目前为止,我能够构建和存档到.ipa,验证代码签名,但ITC失败并出现以下错误。为什么会出现此错误?我可以添加什么来解决这种情况?
上传.ipa后ITC出错:
无效的代码签名权利。您的应用包标签中的权利与配置文件中包含的权利不匹配。根据配置文件,捆绑包含一个不允许的密钥值:' [" AAAAAAAA.com.domain.Product" ]'关键的钥匙串访问组'在' Payload / Product.app / Product'"
请注意,在目标构建计算机上,我将.mobileprovision文件安装在" $ HOME / Library / Provisioning Profiles"中,并创建一个具有相关.cert和.p12私钥的自定义密钥链,例如构建可以签署文件。这需要花费很多时间,直到xctool终于认出了密钥和配置文件。
我使用相同的分发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进行了构建/归档/导出,ITC接受了XCode,并将结果与脚本生成的构建进行了比较。
脚本化的ipa缺少一个archived-expanded-entitmentments.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>
答案 0 :(得分:0)
以下是我发现有效的修复方法。
原创.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"
这也需要设置&#34;代码签名资源规则路径&#34;在Xcode中设置值为&#34; $(SDKROOT)/ResourceRules.plist" ;,因为它会抛出一个关于此的错误。不满意每个项目需要这样做,但这是一次性的事情并解决了这个问题。