我正在使用xcodebuild
命令行编译我的iPhone应用程序.有没有办法传递某种选项来设置配置文件?一般来说,关于xcodebuild的信息似乎不多.
实际上,您应该只需将其添加到XCode命令行设置即可.
xcodebuild [无论你有什么其他选择] PROVISIONING_PROFILE ="[你的个人资料中的唯一ID]"
从命令行构建设置应该覆盖所有内容,因此这应该胜过项目或目标中定义的任何内容.
我的解决方案并不优雅,但它确实可以完成工作并让我自动化构建服务器上的所有内容:
#!/bin/bash TARGET="Your App" CONFIGURATION="Release" SDK="iphoneos" PROFILE_PATH="/Users/jkp/Desktop/foo.mobileprovision" IDENTITY="iPhone Distribution: Your Company Ltd" KEYCHAIN="/Users/jkp/Desktop/keychain" PASSWORD="foobar" open "${PROFILE_PATH}" sleep 5 osascript -e "tell application \"Xcode\" to quit" security unlock-keychain -p ${PASSWORD} ${KEYCHAIN} xcodebuild \ -target "${TARGET}" \ -configuration ${CONFIGURATION} \ -sdk iphoneos \ CODE_SIGN_IDENTITY="${IDENTITY}" \ OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}"
这里的关键是我不需要先安装配置文件.我实际上有另一个脚本,它使用mechanize在每次构建之前下载配置文件的最新副本,这意味着我们可以远程更新配置文件(例如添加新设备),并且我们的CI服务器可以在没有任何额外工作的情况下获取这些更改.
注意:我已经找到了一种安装或更新配置文件的方法,而无需涉及Xcode - 更清洁!请参阅此处了解详细信息.
供应配置文件必须由UUID提供,在我的情况下,供应配置文件被签入源控制系统,因此由开发人员/构建服务器/ CI系统用代码检出.在源树中,配置文件具有人类可读的名称,例如MyApp.mobileprovison,并且位于名为"ProvisioningProfiles"的目录中.要创建xcode存档,必须重命名配置文件并将其复制到〜/ Library/MobileDevice/Provisioning Profiles目录,然后xcodebuild才能识别它们.这是一个可以在CI构建脚本中使用的代码段.
# The keychain needs to be unlocked for signing, which requires the keychain # password. This is stored in a file in the build account only accessible to # the build account user if [ ! -f $HOME/.pass ] ; then echo "no keychain password file available" exit 1 fi case `stat -L -f "%p" $HOME/.pass` in *400) ;; *) echo "keychain password file permissions are not restrictive enough" echo "chmod 400 $HOME/.pass" exit 1 ;; esac # # unlock the keychain, automatically lock keychain on script exit # security unlock-keychain -p `cat $HOME/.pass` $HOME/Library/Keychains/login.keychain trap "security lock-keychain $HOME/Library/Keychains/login.keychain" EXIT # # Extract the profile UUID from the checked in Provisioning Profile. # uuid=`/usr/libexec/plistbuddy -c Print:UUID /dev/stdin <<< \ \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\`` # # Copy the profile to the location XCode expects to find it and start the build, # specifying which profile and signing identity to use for the archived app # cp -f ProvisioningProfiles/MyApp.mobileprovision \ "$HOME/Library/MobileDevice/Provisioning Profiles/$uuid.mobileprovision" xcodebuild -workspace MyApp.xcworkspace -scheme MyScheme \ -archivePath build/MyApp.xcarchive archive \ PROVISIONING_PROFILE="$uuid" CODE_SIGN_IDENTITY="iOS Distribution"
必须解锁钥匙串,并且必须允许"/ usr/bin/codesign"工具访问与签名身份相关联的私钥才能工作 - 使用以下引用 /sf/ask/17360801/ 2351246并添加代码签名到没有钥匙串的私钥ACL,分别用于解锁和添加代码签名的密钥链访问.
如果随后使用xcodebuild将存档导出到IPA,则必须考虑以下问题(xcodebuild不从.app复制文件).需要再次提供配置文件.用于创建IPA的脚本片段是
profileName=`/usr/libexec/plistbuddy -c Print:Name /dev/stdin <<< \ \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\`` xcodebuild \ -exportArchive \ -exportFormat IPA \ -archivePath build/MyApp.xcarchive \ -exportPath $IPADIR/MyApp.ipa \ -exportProvisioningProfile "$profileName"
在此命令运行时,必须解锁钥匙串.
UPDATE
在OSX Mavericks(v10.9.5)和OSX Yosemite上,我们开始看到代码签名错误:
Codesign check fails : ...../MyApp.app: resource envelope is obsolete
在这里查看此帖子的原因xcodebuild - codesign -vvvv说"资源信封已过时"
要在引用的帖子中实现Apple Support建议的更改,请运行以下命令:
sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`