我正在使用xcodebuild
从命令行编译我的iPhone应用程序。是否有一种方法可以传递某种选项来设置预置配置文件?关于xcodebuild的信息似乎并不是很多。
我正在使用xcodebuild
从命令行编译我的iPhone应用程序。是否有一种方法可以传递某种选项来设置预置配置文件?关于xcodebuild的信息似乎并不是很多。
实际上,你只需要将其添加到XCode命令行设置中即可。
xcodebuild [其他选项] PROVISIONING_PROFILE="[您的配置文件唯一标识符在此处]"
从命令行构建设置应该覆盖一切,因此这应该优先于项目或目标中定义的任何内容。
我的解决方案并不优雅,但它确实完成了工作,并让我能够在构建服务器上自动化所有操作:
#!/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}"
在我的情况下,预配描述文件必须通过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#21327591 和 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`
我知道这可能有点偏离主题,但在搜索如何在Jenkins上使Xcode构建工作时,这个问题首先出现。在此发布一些额外的信息以供后人参考和借鉴。如果您觉得这很有用,请给予赞。
无论如何,最近几次遇到了这个问题。找到了这个:
http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html
看起来工作正常。请确保:
首先,以普通的OSX用户身份设置Xcode构建;从那里开始构建您的可分发版本,在Xcode中解决任何配置文件问题;
使用xcodebuild将命令行构建作为普通的OSX用户进行;
然后按照上面的帖子中的说明一字不漏地操作,将所有iOS证书从Login Keychain复制到System,并将~/Library/MobileDevice/Provisioning Profiles
复制到Jenkins用户的~jenkins/Library/MobileDevice/Provisioning Profiles
文件夹中。
使用上述步骤2中的命令进行的下一个Jenkins构建应该可以完美运行。
你可以创建一个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 的设置。