在制作iPhone应用程序时,从xcodebuild中设置configuration文件

我正在使用xcodebuild从命令行编译我的iPhone应用程序。 有没有办法通过某种选项来设置configuration文件? 一般来说似乎没有太多有关xcodebuild的信息。

文档

从文档看来,你不能设置configuration文件,但你可以指定目标:

[-target targetname]

因此,如果您为每个configuration文件创build目标,则可以从命令行中select适当的目标。

这基本上可以完成你的要求。

其实,你应该可以把它添加到XCode命令行设置。

xcodebuild [其他任何选项] PROVISIONING_PROFILE =“[您的个人资料唯一ID]

从命令行构build设置应该覆盖一切,所以这应该胜过在项目或目标中定义的任何东西。

我的解决scheme不是优雅的,但它确实做了这个工作,让我自动化生成服务器上的一切:

 #!/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}" 

这里的关键是我不需要首先安assembly置文件。 实际上我有另外一个脚本,在每次构build之前使用机械化来下载configuration文件的最新副本,这意味着我们可以远程更新configuration文件(例如添加新设备),并且无需任何额外的工作即可使CI服务器获取这些更改。

注意:我已经find了一种安装或更新configuration文件的方法,根本不需要涉及Xcode – 非常干净! 看到这里的全部细节。

供应configuration文件必须由UUID提供,就我而言,供应configuration文件将签入到源代码pipe理系统,因此,开发人员/构build服务器/ CI系统使用代码签出。 在源码树中,configuration文件具有人类可读的名称,如MyApp.mobileprovison,并位于名为“ProvisioningProfiles”的目录中。 要创build一个Xcode档案,configuration文件必须重命名并复制到〜/ Library / MobileDevice / Provisioning Profiles目录,然后xcodebuild才能识别它们。 这是一个可以在CI构build脚本中使用的代码片段。

 # 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”工具访问与签名身份关联的私钥才能使其工作 – 以下参考资料已被使用https://stackoverflow.com/a/21327591/ 2351246,并分别为没有Keychain的私钥ACL添encryption码 ,解锁和添encryption钥链访问。

如果要使用xcodebuild随后将存档导出到IPA,则必须考虑以下问题( xcodebuild不从.app复制文件 )。 configuration文件需要重新提供。 创buildIPA的脚本片段是

 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在build议的文章中build议的更改,请运行以下命令:

  sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication` 

我意识到这可能是OP主题的一个小问题,但是当search如何让Xcode在Jenkins上工作时,这个问题首先出现。 在这里为后人发布一些额外的信息。 和点。 如果你发现这个有用,请给点:)

无论如何,最近这几次几次来了。 find这个:

http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html

似乎工作。 确保:

  1. 首先将Xcode版本设置为常规OSX用户; 从那里build立你的可分配,通过Xcode修复任何configuration文件问题;

  2. 获取使用xcodebuild工作的命令行,作为一个普通的OSX用户;

  3. 然后按照上面信件中的说明操作,将所有iOS证书从login钥匙~jenkins/Library/MobileDevice/Provisioning Profiles复制到系统,并将~/Library/MobileDevice/Provisioning Profiles复制到Jenkins用户的~jenkins/Library/MobileDevice/Provisioning Profiles文件夹中。

下一个Jenkins构build,使用上面的步骤2中的命令,应该完美无缺地工作。