我xcodebuild
用来从命令行编译我的 iPhone 应用程序。有没有办法传递某种选项来设置配置文件?一般来说,关于 xcodebuild 的信息似乎并不多。
6 回答
实际上,您应该可以将其添加到 XCode 命令行设置中。
xcodebuild [无论您有什么其他选项] PROVISIONING_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 - 更干净!请参阅此处了解完整详情。
供应配置文件必须由 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://stackoverflow.com/a/21327591/ 2351246和Add codesign to private key ACL without Keychain分别用于解锁和添加钥匙串访问权限。
如果随后要使用 xcodebuild 将存档导出到 IPA,则必须考虑以下问题(xcodebuild 不会从 .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 说“资源信封已过时”
要实施 Apple 支持在引用的帖子中建议的更改,请运行以下命令:
sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
我意识到这可能有点偏离 OP 主题,但是在搜索如何让 Xcode 构建在 Jenkins 上运行时,首先会出现这个问题。在此处发布一些其他信息以供后代使用。和积分。如果你觉得这很有用,请给分:)
无论如何,最近几次在这个上进行了几轮。发现这个:
http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html
似乎工作。确保:
首先将 Xcode 构建设置为普通 OSX 用户;让它从那里构建您的可分发,通过 Xcode 修复任何配置文件问题;
作为普通 OSX 用户,使用 xcodebuild 进行命令行构建;
然后按照上面帖子中的说明操作,将所有 iOS 证书从 Login Keychain 复制到 System 并复制
~/Library/MobileDevice/Provisioning Profiles
到 Jenkins 用户的~jenkins/Library/MobileDevice/Provisioning Profiles
文件夹中。
下一个 Jenkins 构建,使用上面步骤 2 中的命令,应该可以完美运行。
您可以创建 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