使用xcodebuild创建iPhone应用时,如何从内部设置配置文件。

47

我正在使用xcodebuild从命令行编译我的iPhone应用程序。是否有一种方法可以传递某种选项来设置预置配置文件?关于xcodebuild的信息似乎并不是很多。

6个回答

89

实际上,你只需要将其添加到XCode命令行设置中即可。

xcodebuild [其他选项] PROVISIONING_PROFILE="[您的配置文件唯一标识符在此处]"

从命令行构建设置应该覆盖一切,因此这应该优先于项目或目标中定义的任何内容。


6
有一件事让我困惑:您在XCode界面中看到的设置实际上是两个设置——PROVISIONING_PROFILE和CODE_SIGN_IDENTITY。如果您做客户端工作并且拥有多个签名标识,请小心从命令行正确地设置这两个设置。 - Bdebeez
7
如何查找PROVISIONING_PROFILE和CODE_SIGN_IDENTITY的名称? - Hilen
4
PROVISIONING_PROFILE的UDID来自于配置文件本身。由于配置文件包含签名数据,因此技术上它们是二进制文件,但您仍然可以在文本编辑器中打开它们并查找UDID:<key>UUID</key><string>长字符串</string>。CODE_SIGN_IDENTITY是您证书的“通用名称”字段,您可以在钥匙串访问中看到它。 - Rob
此外,当在Xcode中选择正确的配置文件后,打开配置文件选择工具并选择底部的“其他…”。将出现一个文本字段,其中包含所选配置文件的ID。 - Bob Vork

35

我的解决方案并不优雅,但它确实完成了工作,并让我能够在构建服务器上自动化所有操作:

#!/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就可安装或更新配置文件-更加简洁!请参见此处获取完整详细信息。

在过去的几天里,您是否成功找到了一种通过命令行添加配置文件的方法?由于工具的不灵活性,这样一个简单的事情无法完成真的很令人沮丧... - Shade
2
不用在意我的之前的评论,我已经在这个问题中找到了答案:https://dev59.com/uG445IYBdhLWcg3wq8Lp - Shade
19
你的注释中的链接已经失效了。有没有可能在其他地方发布或恢复它? - Luke
另一个死链接的障碍。 - Joshua
7
交易链接的快照在wayback上:http://web.archive.org/web/20101127065710/http://devblog.vworkapp.com/post/160876198/add-hoc-iphone-distribution-and-ci-pt-2 - James Brooks
他的博客似乎在Tumblr上有一份副本,https://vworkdev.tumblr.com/post/160876198/add-hoc-iphone-distribution-and-ci-pt-2 - dragon788

24

在我的情况下,预配描述文件必须通过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"工具访问与签名标识相关联的私钥-以下参考资料被使用https://dev59.com/cmIj5IYBdhLWcg3wfVJ8#21327591Add 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`

为我们工作了!感谢这个想法! - Zillan
这是我最喜欢的SO答案之一,这里有许多iOS构建脚本的精细技巧。特别喜欢从*.mobileprovision中提取UUID的方法。 - funkybro
尝试使用此方法在生成存档时出现错误,即第一个代码块中的最后一个命令。我不得不将PROVISIONING_PROFILE替换为APP_PROFILE,以防止cocoapods pods与应用程序预配配置文件一起构建。我遇到的错误是:您构建设置中指定的预配配置文件(“PROVISIONING PROFILE NAME”)具有AppID“APP_ID”,该AppID与您的捆绑标识符“org.cocoapods.Alamofire”不匹配。 - Gorcyn

5

我知道这可能有点偏离主题,但在搜索如何在Jenkins上使Xcode构建工作时,这个问题首先出现。在此发布一些额外的信息以供后人参考和借鉴。如果您觉得这很有用,请给予赞。

无论如何,最近几次遇到了这个问题。找到了这个:

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

看起来工作正常。请确保:

  1. 首先,以普通的OSX用户身份设置Xcode构建;从那里开始构建您的可分发版本,在Xcode中解决任何配置文件问题;

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

  3. 然后按照上面的帖子中的说明一字不漏地操作,将所有iOS证书从Login Keychain复制到System,并将~/Library/MobileDevice/Provisioning Profiles复制到Jenkins用户的~jenkins/Library/MobileDevice/Provisioning Profiles文件夹中。

使用上述步骤2中的命令进行的下一个Jenkins构建应该可以完美运行。


4

文档

从文档来看,似乎不能设置预配文件,但可以指定目标:

[-target 目标名称]

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

这基本上就实现了你的要求。


谢谢。我已经看过这个了,虽然这不是我想要的最优雅的解决方案,但我认为它仍然可以按照我想要的方式工作。 - Steve Klabnik
10
你应该取消勾选这个作为正确答案。Rob的回答是正确的。我刚试了一下,我可以很好地覆盖配置文件。 - Jonny

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 的设置。

ExportOption.plist 示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接