Xcode 3.2在Build菜单"Build and Archive"下提供了一个很棒的新功能,它可以生成一个适合Ad Hoc分发的.ipa文件.您也可以打开管理器,转到"已存档的应用程序"和"将应用程序提交到iTunesConnect".
有没有办法从命令行使用"构建和存档"(作为构建脚本的一部分)?我认为xcodebuild
会以某种方式涉及,但man
页面似乎没有说明这一点.
更新 Michael Grinich要求澄清; 这就是命令行构建无法完成的功能,在"构建和存档"后,您只能使用Xcode的管理器.
您可以点击"共享应用程序..."与Beta测试人员分享您的IPA.正如Guillaume在下面指出的,由于一些Xcode魔术,这个IPA文件不需要beta测试人员需要安装的单独分发的.mobileprovision文件; 这太神奇了.没有命令行脚本可以做到这一点.例如,Arrix的脚本(5月1日提交)不符合该要求.
更重要的是,在您对测试版进行beta测试后,您可以单击"将应用程序提交到iTunes Connect",将完全相同的版本提交给Apple,即您测试的二进制文件,而无需重建.这在命令行中是不可能的,因为签署应用程序是构建过程的一部分; 您可以为Ad Hoc beta测试签名,或者您可以签名提交到App Store,但不能同时签署.在命令行上构建的IPA不能在手机上进行beta测试,然后直接提交给Apple.
我喜欢有人过来证明我错了:这两个功能在Xcode GUI中运行良好,无法从命令行复制.
我找到了如何从命令行自动化构建和归档过程,我刚刚写了一篇博客文章,解释了如何实现这一目标.
您必须使用的命令是xcrun
:
/usr/bin/xcrun -sdk iphoneos PackageApplication \ -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" \ -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" \ --sign "${DEVELOPER_NAME}" \ --embed "${PROVISONING_PROFILE}"
您将在文章中找到所有细节.如果您有任何问题,请不要犹豫.
使用Xcode 4.2,您可以使用-scheme标志执行此操作:
xcodebuild -schemearchive
在此命令之后,存档将显示在Xcode管理器中.
使用Xcode 9和Swift更新我的答案
档案
xcodebuild -workspace/ .xcworkspace -scheme clean archive -configuration release -sdk iphoneos -archivePath .xcarchive
IPA导出(请注意导出选项plist)
xcodebuild -exportArchive -archivePath.xcarchive -exportOptionsPlist /exportOptions.plist -exportPath .ipa
对于那些不了解exportOptions.plist的人,https: //blog.bitrise.io/new-export-options-plist-in-xcode-9
那些使用它来构建CI/CD工具(如teamcity/jenkins)项目的人,请确保使用构建代理中安装的正确xcode进行存档和导出.
您可以使用以下2个选项中的任何一个.
使用xcodebuild的完整路径,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
使用xcode-select,
xcode-select -switch /Applications/Xcode 9.3.1.app
以下是旧答案
这是用于创建存档和IPA示例的命令行脚本.我有一个iPhone xcode项目,它位于Desktop/MyiOSApp文件夹中.
逐个执行以下命令.
cd /Users/username/Desktop/MyiOSApp/ xcodebuild -scheme MyiOSApp archive \ -archivePath /Users/username/Desktop/MyiOSApp.xcarchive xcodebuild -exportArchive -exportFormat ipa \ -archivePath "/Users/username/Desktop/MyiOSApp.xcarchive" \ -exportPath "/Users/username/Desktop/MyiOSApp.ipa" \ -exportProvisioningProfile "MyCompany Distribution Profile"
这是用Xcode 5测试的,对我来说工作正常.
我一直在使用自己的构建脚本来生成用于临时分发的ipa包.
die() { echo "$*" >&2 exit 1 } appname='AppName' config='Ad Hoc Distribution' sdk='iphoneos3.1.3' project_dir=$(pwd) echo using configuration $config echo updating version number agvtool bump -all fullversion="$(agvtool mvers -terse1)($(agvtool vers -terse))" echo building version $fullversion xcodebuild -activetarget -configuration "$config" -sdk $sdk build || die "build failed" echo making ipa... # packaging cd build/"$config"-iphoneos || die "no such directory" rm -rf Payload rm -f "$appname".*.ipa mkdir Payload cp -Rp "$appname.app" Payload/ if [ -f "$project_dir"/iTunesArtwork ] ; then cp -f "$project_dir"/iTunesArtwork Payload/iTunesArtwork fi ipaname="$appname.$fullversion.$(date -u +%Y%m%d%H%M%S).ipa" zip -r $ipaname Payload echo finished making $ipaname
该脚本还会增加版本号.如果不需要,您可以删除该部分.希望能帮助到你.
我们开发了一个带有XCode 4.2.1的iPad应用程序,并希望将构建集成到我们的持续集成(Jenkins)中以进行OTA分发.这是我提出的解决方案:
# Unlock keychain security unlock-keychain -p jenkins /Users/jenkins/Library/Keychains/login.keychain # Build and sign app xcodebuild -configuration Distribution clean build # Set variables APP_PATH="$PWD/build/Distribution-iphoneos/iPadApp.app" VERSION=`defaults read $APP_PATH/Info CFBundleShortVersionString` REVISION=`defaults read $APP_PATH/Info CFBundleVersion` DATE=`date +"%Y%m%d-%H%M%S"` ITUNES_LINK="Download iPad2-App v$VERSION.$REVISION-$DATE<\/a>" # Package and verify app xcrun -sdk iphoneos PackageApplication -v build/Distribution-iphoneos/iPadApp.app -o $PWD/iPadApp-$VERSION.$REVISION-$DATE.ipa # Create plist cat iPadApp.plist.template | sed -e "s/\${VERSION}/$VERSION/" -e "s/\${DATE}/$DATE/" -e "s/\${REVISION}/$REVISION/" > iPadApp-$VERSION.$REVISION-$DATE.plist # Update index.html curl https://xxx.xxx.xxx/index.html -o index.html.$DATE cat index.html.$DATE | sed -n '1h;1!H;${;g;s/\(Aktuelle Version<\/h3>\)\(.*\)\(
Ältere Versionen<\/h3>.
.
- \)/\1\ ${ITUNES_LINK}\ \3\2<\/li>\
- /g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html
然后Jenkins将ipa,plist和html文件上传到我们的网络服务器.
这是plist模板:
items assets kind software-package url https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa kind full-size-image needs-shine url https://xxx.xxx.xxx/iPadApp.png kind display-image needs-shine url https://xxx.xxx.xxx/iPadApp_sm.png metadata bundle-identifier xxx.xxx.xxx.iPadApp bundle-version ${VERSION} kind software subtitle iPad2-App title iPadApp
要进行此设置,您必须将分发证书和配置文件导入指定用户的钥匙串.
The xcodebuild
tool can build and export archive products with the -exportArchive flag (as of Xcode 5). The export step was previously only possible via the Xcode Organizer UI.
First archive your app:
xcodebuild -schemearchive
Given $ARCHIVE_PATH
(the path to the .xcarchive file), export the app from the archive with one of the following:
iOS .ipa file:
xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"
Mac .app file:
xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"
In both commands the -exportProvisioningProfile and -exportSigningIdentity arguments are optional. man xcodebuild
for details on the semantics. In these examples, the provisioning profile for the iOS build specified an AdHoc distribution provisioning profile, and the signing identity for the Mac app specified a Developer ID for export as a 3rd party application (i.e. not distributed via the Mac App Store).
我发现其他一些答案很难开始.这篇文章对我有用.某些路径可能需要是绝对的,如其他答案中所述.
命令:
xcrun -sdk iphoneos PackageApplication \ "/path/to/build/MyApp.app" \ -o "output/path/to/MyApp.ipa" \ --sign "iPhone Distribution: My Company" \ --embed "/path/to/something.mobileprovision"
实际上,您可以像XCode一样重新构建构建,以便您可以测试和发送相同的二进制文件.例如在我的脚本中(类似于上面的那些)我构建了我的发布版本,签名为AdHoc版本,然后我将其存档为IPA进行测试,然后使用我的发行版证书辞职并创建一个zip文件,这是我发送到的苹果.相关的是:
codesign -f -vv -s "$DistributionIdentity" "$APPDIR"
我已经简要介绍了要遵循的步骤,以及使用下面的terrminal生成ipa时要传递的参数:
转到终端中包含MyApp.xcodeproject文件的文件夹
通过使用下面给出的命令,您将获得应用程序的所有目标
/usr/bin/xcodebuild -list
执行上述命令后,您将获得一个目标列表,您应该选择要生成.ipa的特定目标
/usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
上面的命令构建项目并创建.app文件.找到.app文件的路径是 ./build/Release-iphoneos/MyApp.app
在Build成功之后,执行以下命令,使用Developer Name和Provisioning Profile使用以下语法生成应用程序的.ipa:
/usr/bin/xcrun -sdk iphoneos PackageApplication -v “${TARGET}.app” -o “${OUTDIR}/${TARGET}.ipa” –sign “${IDENTITY}” –embed “${PROVISONING_PROFILE}”
上述语法中每个参数的说明:
${TARGET}.app == Target path (ex :/Users/XXXXXX/desktop/Application/build/Release-iphoneos/MyApp.app) ${OUTDIR} == Select the output directory(Where you want to save .ipa file) ${IDENTITY} == iPhone Developer: XXXXXXX (XXXXXXXXXX)(which can be obtained from Keychain access) ${PROVISONING_PROFILE} == Path to the provisioning profile(/Users/XXXXXX/Library/MobileDevice/Provisioning Profiles/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.mobileprovision”)
将在选定的输出目录" $ {OUTDIR} "中生成ipa
对于Xcode 7,您有一个更简单的解决方案.唯一的额外工作是您必须创建用于导出存档的配置plist文件.
(与Xcode 6相比,在结果中xcrun xcodebuild -help
,-exportFormat
并且-exportProvisioningProfile
不再提及选项;前者被删除,后者被取代-exportOptionsPlist
.)
步骤1,将目录更改为包含.xcodeproject或.xcworkspace文件的文件夹.
cd MyProjectFolder
第2步,使用Xcode或/usr/libexec/PlistBuddy exportOptions.plist
创建导出选项plist文件.顺便xcrun xcodebuild -help
说一句,会告诉你必须插入plist文件的键.
步骤3,按如下方式创建.xcarchive文件(实际上是文件夹)(build /目录将立即由Xcode自动创建),
xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive
第4步,导出为.ipa文件,这与Xcode6不同
xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist
现在,您在build /目录中获得了一个ipa文件.只需将其发送到Apple App Store即可.
顺便说一下,Xcode 7创建的ipa文件比Xcode 6大得多.
IPA格式:
xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
使用配置文件MyMobileApp分发配置文件将存档MyMobileApp.xcarchive作为IPA文件导出到路径MyMobileApp.ipa.
APP格式:
xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'
使用应用程序阳离子签名身份开发者ID应用程序:我的团队将存档MyMacApp.xcarchive作为PKG文件导出到路径MyMacApp.pkg.安装程序签名标识Developer ID Installer:My Team隐式用于对导出的包进行签名.
Xcodebuild手册页
转到项目根目录的文件夹,然后:
xcodebuild -project projectname -activetarget -activeconfiguration archive