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

在制作iPhone应用程序时从xcodebuild中设置配置文件,iphone,xcode,xcodebuild,provisioning,Iphone,Xcode,Xcodebuild,Provisioning,我正在使用xcodebuild从命令行编译我的iPhone应用程序。有没有办法传入某种选项来设置配置文件?一般来说,关于xcodebuild的信息似乎不多。 从文档中可以看出,您无法设置配置文件,但可以指定目标: [-目标targetname] 因此,如果为每个资源调配文件创建一个目标,则可以从命令行中选择适当的目标 这基本上可以满足您的要求。实际上,您应该能够将其添加到XCode命令行设置中 xcodebuild[您拥有的任何其他选项]配置_PROFILE=“[您的配置文件唯一ID在此]” 命

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

从文档中可以看出,您无法设置配置文件,但可以指定目标:

[-目标targetname]

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


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

实际上,您应该能够将其添加到XCode命令行设置中

xcodebuild[您拥有的任何其他选项]配置_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-更干净!有关详细信息,请参阅。

我意识到这可能有点离题,但在搜索如何让Xcode构建在Jenkins上运行时,首先会出现这个问题。在这里为后代发布一些附加信息。和要点。如果您觉得这很有用,请给出分数:)

不管怎么说,最近有好几次都是这样。我们发现:

似乎有效。确保:

  • 首先将Xcode构建设置为普通OSX用户;让它从那里构建您的可分发配置文件,通过Xcode修复任何资源调配配置文件问题

  • 作为普通OSX用户,使用xcodebuild使命令行构建正常工作

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


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

    配置文件必须由UUID提供,在我的情况下,配置文件被签入到源代码管理系统,因此由开发人员/构建服务器/CI系统使用代码签出。在源代码树中,配置文件具有人类可读的名称,如MyApp.MobileProvision,并位于名为“ProvisioningProfiles”的目录中。要创建xcode存档,必须重命名配置文件并将其复制到~/Library/MobileDevice/Provisioning profiles目录,然后xcode构建才能识别它们。这是可以在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"
    
    请查看此处的帖子以了解原因

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

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

    您可以创建ExportOption.plist文件,在其中设置所有参数,如: 编译EBITCODE、teamID、证书和资源调配配置文件

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

    xcodebuild -quiet -workspace <ProjectName>.xcworkspace -scheme <ProjectScheme> -sdk iphoneos -configuration Release -destination generic/platform=iOS clean archive -archivePath <PathForArchive>/<ProjectName>.xcarchive
    
    xcodebuild-quiet-workspace.xcworkspace-scheme-sdk iphoneos-configuration Release-destination generic/platform=iOS clean archive-archive-archivePath/.xarchive
    
    下一步将ExportOption.plist放入当前文件夹(PathForArchive)并运行:

    xcodebuild-quiet-exportArchive-archivePath.xarchive-ExportOptions plist ExportOptions.plist-exportPath
    
    文件夹中会有一个.ipa,设置为ExportOptions.plist


    谢谢。我已经看到了这一点,这并不像我希望的那样优雅,但我认为它仍然会按照我希望的方式工作。你应该取消选中这一项作为正确答案。罗布的回答是正确的。刚刚尝试了一秒钟,我可以很好地覆盖配置文件。在过去几天中,您是否成功地找到了从命令行添加配置文件的方法?由于这些工具的不灵活性,这么简单的事情无法完成,这真是令人沮丧……别介意我之前的评论。我在这个问题中找到了答案:你笔记中的链接:已经死了。你有没有可能把它发布到其他地方或恢复?wayback上deal link的另一个碰撞wayback上的deal link快照有一件事让我大吃一惊:你在XCode界面中看到的设置实际上是两个设置-配置文件和代码签名标识。如果您执行客户端工作并且具有多个签名标识,请小心从命令行正确设置这两个标识。如何查找配置文件的名称和代码配置文件的名称?配置文件的UDID来自配置文件本身。这些概要文件在技术上是二进制文件,因为它们包含签名数据,但您仍然可以在文本编辑器中打开它们并查找UDID:UUID longstring。CODE\u SIGN\u IDENTITY是您的证书的“common name”字段,您可以在keychain access中看到它。此外,当您在xcode中选择了正确的配置文件时,请打开配置文件选择项,然后选择底部的“Other…”。您将获得一个文本字段,其中包含为我们工作的所选资源调配配置文件的ID!谢谢你的主意!这是我最喜欢的答案之一,这里有很多iOS构建脚本的好技术。我特别喜欢从*.mobileprovision中提取UUID的方法。尝试这种方法时,我遇到了一个错误
     sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
    
    xcodebuild -quiet -workspace <ProjectName>.xcworkspace -scheme <ProjectScheme> -sdk iphoneos -configuration Release -destination generic/platform=iOS clean archive -archivePath <PathForArchive>/<ProjectName>.xcarchive
    
    xcodebuild -quiet -exportArchive -archivePath <ProjectName>.xcarchive -exportOptionsPlist ExportOptions.plist -exportPath <PathForExport>