代码之家  ›  专栏  ›  技术社区  ›  Steve Klabnik

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

  •  40
  • Steve Klabnik  · 技术社区  · 16 年前

    我在用 xcodebuild 从命令行编译我的iPhone应用程序。有没有方法传入某种选项来设置配置文件?一般来说,关于xcodebuild的信息似乎不多。

    5 回复  |  直到 8 年前
        1
  •  1
  •   Corey Floyd    16 年前

    Documentation

    从文档上看,您不能设置配置文件,但可以指定目标:

    [-目标目标名称]

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

    这基本上可以满足你的要求。

        2
  •  81
  •   Rob    16 年前

    实际上,您应该能够将它添加到xcode命令行设置中。

    xcodebuild[您拥有的任何其他选项]provisioning_profile=“[此处是您的配置文件唯一ID]”

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

        3
  •  25
  •   jmoody    11 年前

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

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

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

    注: 从那以后,我找到了一种不需要涉及Xcode就可以安装或更新资源调配配置文件的方法——更干净了!见 here 详细信息。

        4
  •  20
  •   Community Mohan Dere    8 年前

    配置配置文件必须由UUID提供,在我的情况下,配置配置文件将签入源代码管理系统,因此由开发人员/构建服务器/CI系统用代码签出。在源树中,配置文件具有人类可读的名称,如myapp.mobileprovision,位于名为“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”工具访问与签名标识相关联的私钥,这样才能工作-使用了以下引用 https://stackoverflow.com/a/21327591/2351246 Add 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支持建议的更改,请运行以下命令:

     sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
    
        5
  •  4
  •   Evan Wieland Jorawar Singh    8 年前

    我意识到这可能是一个有点离题的话题,但在寻找如何让Xcode构建在Jenkins上工作时,这个问题首先出现。为子孙后代在这里发布一些附加信息。并指出。如果你觉得这个有用,请给分:)

    不管怎么说,最近这一次进行了几轮。发现这一点:

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

    似乎有用。确保:

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

    2. 作为一个普通的OSX用户,使用xcodebuild进行命令行构建;

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

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