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

时间:2009-05-15 02:34:24

标签: iphone xcode xcodebuild provisioning

我正在使用xcodebuild从命令行编译我的iPhone应用程序。有没有办法传递某种选项来设置配置文件?似乎没有太多关于xcodebuild的信息。

6 个答案:

答案 0 :(得分:82)

实际上,您应该只需将其添加到XCode命令行设置中。

xcodebuild [无论你有什么其他选择] PROVISIONING_PROFILE =“[你的个人资料中的唯一ID]”

命令行中的构建设置应该覆盖所有内容,因此这应该胜过项目或目标中定义的任何内容。

答案 1 :(得分:26)

我的解决方案并不优雅,但它确实可以完成工作并让我自动化构建服务器上的所有内容:

#!/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 - 更清洁!有关详细信息,请参阅here

答案 2 :(得分:20)

供应配置文件必须由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"

钥匙串必须解锁并且&#34; / usr / bin / codesign&#34;必须允许工具访问与签名身份相关联的私钥才能使用此工具 - 以下引用分别用于https://stackoverflow.com/a/21327591/2351246Add codesign to private key ACL without Keychain解锁和添加代码签名的密钥链访问。

如果要使用xcodebuild将存档导出到IPA,则必须考虑以下问题(xcodebuild not copying file from .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"

在此命令运行时,必须解锁钥匙串。

更新

在OSX Mavericks(v10.9.5)和OSX Yosemite上,我们开始看到代码签名错误:

Codesign check fails : ...../MyApp.app: resource envelope is obsolete

点击此处查看原因xcodebuild - codesign -vvvv says"resource envelope is obsolete"

要在引用的帖子中实施Apple Support建议的更改,请运行以下命令:

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

答案 3 :(得分:4)

我意识到这可能是OP主题的一点点,但是在搜索如何使用Jenkins的Xcode构建时,首先会出现这个问题。为后人发布一些额外信息。和点。如果您觉得这很有用,请给点:)

无论如何,最近几次对这一次进行了几轮。发现这个:

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

似乎工作。请务必:

  1. 首先将Xcode构建设置为常规OSX用户;让它从那里构建您的可分发,通过Xcode修复任何配置文件问题;

  2. 使用xcodebuild作为常规OSX用户获取命令行构建工作;

  3. 然后按照上面帖子中的说明,将所有iOS证书从登录密钥链复制到系统,并将~/Library/MobileDevice/Provisioning Profiles复制到Jenkins用户的~jenkins/Library/MobileDevice/Provisioning Profiles文件夹。< / p>

  4. 使用上面步骤2中的命令,下一个Jenkins构建应该可以正常运行。

答案 4 :(得分:1)

Documentation

从doc开始,您无法设置配置文件,但您可以指定目标:

[ - 目标名称]

因此,如果为每个配置文件创建目标,则可以从命令行中选择适当的目标。

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

答案 5 :(得分:0)

您可以创建 ExportOption.plist 文件,您将在其中设置所有参数,例如: compileBitcode、teamID、证书和配置文件。

然后转到终端中的项目文件夹并使用命令创建存档,例如:

xcodebuild -quiet -workspace <ProjectName>.xcworkspace -scheme <ProjectScheme> -sdk iphoneos -configuration Release -destination generic/platform=iOS clean archive -archivePath <PathForArchive>/<ProjectName>.xcarchive

接下来将 ExportOption.plist 放到当前文件夹 (PathForArchive) 并运行:

xcodebuild -quiet -exportArchive -archivePath <ProjectName>.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath <PathForExport>

您将在文件夹中拥有一个 .ipa,其中包含来自 ExportOptions.plist 的设置

Example of ExportOption.plist