Xcode“Build and archive”;从命令行

Xcode 3.2在Build菜单下提供了一个很棒的新功能,“Build and Archive”,它可以生成一个适合Ad Hoc分发的。ipa文件。你也可以打开管理器,选择“存档应用程序”和“向iTunesConnect提交应用程序”。

有没有办法从命令行(作为构建脚本的一部分)使用“构建和存档”?我假设xcodebuild会以某种方式涉及,但man页似乎没有说任何关于这一点。

Michael Grinich要求澄清;以下是你不能用命令行构建的功能,这些功能你只能在“构建和存档”之后用Xcode的管理器实现。

  1. 您可以点击“共享应用程序…”与测试者共享您的IPA。正如Guillaume在下面指出的,由于一些Xcode魔法,这个IPA文件不需要beta测试者需要安装一个单独分布的.mobileprovision文件;这是不可思议的。没有命令行脚本可以做到这一点。例如,Arrix的脚本(5月1日提交)就不符合这一要求。
  2. 更重要的是,在你测试了一个版本后,你可以点击“Submit Application to iTunes Connect”,向苹果提交你测试过的相同版本,无需重新构建。这在命令行中是不可能的,因为为应用签名是构建过程的一部分;你可以为Ad Hoc beta测试签名,也可以为提交到App Store签名,但不能同时签名。任何基于命令行构建的IPA都不能在手机上进行beta测试,然后直接提交给苹果。

我希望有人能来证明我是错的:这两个功能在Xcode GUI中都很好用,不能从命令行复制。

345176 次浏览

进入你的项目根目录,然后:

xcodebuild -project projectname -activetarget -activeconfiguration archive

我一直在使用自己的构建脚本为临时分发生成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特有的,不适合命令行构建工具。

如果有点聪明的话,我打赌你可以编写一个脚本来为你做这件事。看起来它们只是用一个UUDI和一个plist存储在~/Library/MobileDevice/Archived Applications/中。我也无法想象反向工程验证器会有那么难。

我感兴趣的自动化过程是将构建版本发送给beta测试人员。(因为App Store很少提交,所以我不介意手动完成,特别是因为我经常需要添加新的描述文本。)通过使用Xcode的CLI执行伪Build+Archive,我可以从每次代码提交中触发自动构建,创建带有嵌入式配置文件的IPA文件,并将其通过电子邮件发送给测试人员。

我发现了如何从命令行自动化构建和归档过程,我只是写了一个博客文章来解释如何实现这一点。

你必须使用的命令是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一样重新编译,这样你就可以测试和发布相同的二进制代码。例如,在我的脚本中(类似于上面的脚本),我以AdHoc构建的形式构建了我的发布版本,然后我将其归档为IPA进行测试,然后使用我的分发证书并创建一个zip文件,这是我发送给苹果的文件。相关的台词是:

codesign -f -vv -s "$DistributionIdentity" "$APPDIR"

我发现这里的其他一些答案很难展开。这篇文章为我做了。有些路径可能需要是绝对的,正如在其他答案中提到的那样。

命令:

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 4.2中,你可以使用-scheme标志来做到这一点:

xcodebuild -scheme <SchemeName> archive

执行此命令后,档案文件将显示在Xcode管理器中。

为了改进Vincent的回答,我写了一个脚本:xcodearchive
它允许您通过命令行存档(生成ipa)您的项目。 可以把它想象成xcodebuild命令的姐妹,但用于存档

代码可在github: http://github.com/gcerquant/xcodearchive

< p > < br > 该脚本的一个选项是启用dSYM符号在时间戳存档中的存档。没有理由不再保留这些符号,也没有理由不再符号以后可能收到的崩溃日志

我们使用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="<a href=\"itms-services:\/\/?action=download-manifest\&url=https:\/\/xxx.xxx.xxx\/iPadApp-$VERSION.$REVISION-$DATE.plist\">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/\(<h3>Aktuelle Version<\/h3>\)\(.*\)\(<h3>&Auml;ltere Versionen<\/h3>.<ul>.<li>\)/\1\
${ITUNES_LINK}\
\3\2<\/li>\
<li>/g;p;}' | sed -e "s/\${ITUNES_LINK}/$ITUNES_LINK/" > index.html

然后Jenkins将ipa、plist和html文件上传到我们的web服务器。

这是plist模板:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://xxx.xxx.xxx/iPadApp-${VERSION}.${REVISION}-${DATE}.ipa</string>
</dict>
<dict>
<key>kind</key>
<string>full-size-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://xxx.xxx.xxx/iPadApp.png</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>needs-shine</key>
<true/>
<key>url</key>
<string>https://xxx.xxx.xxx/iPadApp_sm.png</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>xxx.xxx.xxx.iPadApp</string>
<key>bundle-version</key>
<string>${VERSION}</string>
<key>kind</key>
<string>software</string>
<key>subtitle</key>
<string>iPad2-App</string>
<key>title</key>
<string>iPadApp</string>
</dict>
</dict>
</array>
</dict>
</plist>

要设置此设置,必须将分发证书和配置配置文件导入到指定用户的keychain中。

尝试xctool,它是苹果xcodebuild的替代品,可以更容易地构建和测试iOS和Mac产品。它对持续集成特别有帮助。它有一些额外的功能:

  1. 运行与Xcode.app相同的测试。
  2. 构建和测试结果的结构化输出。
  3. 人性化的,ansi彩色输出。

3号非常有用。我不知道是否有人能读懂xcodebuild的控制台输出,我不能,通常它给了我一行5000+字符。比论文还难读。

< p > xctool: https://github.com/facebook/xctool < / p >

我已经给出了一个简单的步骤描述,并在使用下面的终端生成ipa时传递参数:

  1. 转到包含MyApp的文件夹。Xcodeproject文件在终端

  2. 通过使用下面给出的命令,您将获得应用程序的所有目标

    /usr/bin/xcodebuild -list
    
  3. After the above command is executed, you will get a list of targets of which you should select a specific target you need to generate .ipa

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
    
  4. The above command builds the project and creates a .app file.The path to locate the .app file is ./build/Release-iphoneos/MyApp.app

  5. After Build gets succeeded then execute the following command to generate .ipa of the application using Developer Name and Provisioning Profile using the syntax below:

    /usr/bin/xcrun -sdk iphoneos PackageApplication -v “${TARGET}.app” -o “${OUTDIR}/${TARGET}.ipa” –sign “${IDENTITY}” –embed “${PROVISONING_PROFILE}”
    

Explanation of each Parameter in the above syntax:

${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”)
  1. ipa将在选定的输出目录"$ {OUTDIR}"中生成

xcodebuild工具可以使用-exportArchive标记构建和导出存档产品(从Xcode 5开始)。导出步骤以前只能通过Xcode Organizer UI实现。

首先存档你的应用:

xcodebuild -scheme <scheme name> archive

给定$ARCHIVE_PATH (.xcarchive文件的路径),使用以下方法之一从存档中导出应用程序:

iOS .ipa文件:

xcodebuild -exportArchive -exportFormat ipa -archivePath "$ARCHIVE_PATH" -exportPath "myApp.ipa" -exportProvisioningProfile "My App Provisioning profile"

Mac .app文件:

xcodebuild -exportArchive -exportFormat app -archivePath "$ARCHIVE_PATH" -exportPath "myApp.app" -exportSigningIdentity "Developer ID Application: My Software Company"

在这两个命令中,-exportProvisioningProfile-exportSigningIdentity参数是可选的。man xcodebuild获取语义的详细信息。在这些例子中,iOS版本的配置文件指定了AdHoc分发配置文件,Mac应用程序的签名标识指定了作为第三方应用程序导出的开发者ID(即不通过Mac应用程序商店分发)。

用Xcode 9和Swift更新我的答案

存档

xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace \
-scheme <schemeName> clean archive -configuration release \
-sdk iphoneos -archivePath <ProjectName>.xcarchive

异丙醇出口 (请注意导出选项plist)

xcodebuild -exportArchive -archivePath  <ProjectName>.xcarchive \
-exportOptionsPlist  <ProjectName>/exportOptions.plist \
-exportPath  <ProjectName>.ipa

对于那些不知道exportOptions.plist的人, https://blog.bitrise.io/post/new-export-options-plist-in-xcode-9 < / p >

那些在CI/CD工具(如teamcity/jenkins)中使用此工具构建项目的人,请确保您在构建代理中安装了正确的Xcode用于存档和导出。

您可以使用以下两个选项中的任何一个。

  1. 使用xcodebuild的完整路径,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
  1. 使用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测试的,对我来说工作很好。

如果你使用下一个工具:https://github.com/nomad/shenzhen

那么这个任务就很简单了:

which ipa 1>/dev/null 2>&1 || echo 'no shenzhen. to install use: sudo gem install shenzhen --no-ri --no-rdoc'
ipa build --verbose --scheme "${schemeName}"

< a href = " https://stackoverflow.com/a/19459781/751932 " > < / >来源

对于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/ directory将由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/ directory中获得一个ipa文件。只要把它发送到苹果应用商店。

顺便说一下,Xcode 7创建的ipa文件比Xcode 6大得多。

更进一步,用Xcode 7通过命令行上传到iTunesConnect ! (假设你从一个.ipa开始,它已经用正确的发布配置文件和签名标识进行了签名。)

输入altool,应用程序加载器的CLI界面(docs,第38页)。 隐藏在Xcode的深处。应用的结构,是一个方便的功能,让我们直接上传到ItunesConnect

/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
简单地运行$ altool --upload-app -f file -u username [-p password]将你新创建的.ipa直接上传到Apple。 密码是可选的,如果您不使用该命令,将提示您输入密码。< / p >

如果在验证步骤中应用程序有任何问题,控制台将把它们打印出来。

如果你不想保存路径的位置,你可能不得不将路径导出到altool

export PATH=$PATH:/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/

这就是它!只需登录iTunesConnect.com,选择你的新版本测试testflight。

如果你得到一个Exception while launching iTunesTransporter: Transporter not found at path: /usr/local/itms/bin/iTMSTransporter. You should reinstall the application的错误,你可以按照这个SO答案的建议,运行一个符号链接到正确的位置:

ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms

更新到Xcode 8后,我发现企业ipa生成由

/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}"

命令无法启动,因为一些签名问题。日志 表示“警告:PackageApplication已弃用,请使用 xcodebuild -exportArchive。< / p >

所以我切换到xcodebuild -exportArchive,一切恢复正常。

Xcode 8:


音标格式:

xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'

导出MyMobileApp存档文件。xcarchive作为一个IPA文件到路径MyMobileApp。Ipa使用 配置文件MyMobileApp分发配置文件

应用格式:

xcodebuild -exportArchive -exportFormat APP -archivePath MyMacApp.xcarchive -exportPath MyMacApp.pkg -exportSigningIdentity 'Developer ID Application: My Team'

导出MyMacApp归档文件。xcarchive作为PKG文件保存到MyMacApp路径下。PKG使用的应用程序 阳离子签名身份开发人员ID应用:我的团队。安装程序签名标识 开发人员ID Installer: My Team隐式用于对导出的包进行签名

Xcodebuild man page

如何用命令构建iOS项目?

Clean : xcodebuild clean -workspace work-space-name.xcworkspace -scheme scheme-name

,,

Archive : xcodebuild archive -workspace work-space-name.xcworkspace -scheme "scheme-name" -configuration Release -archivePath IPA-name.xcarchive

,,

Export : xcodebuild -exportArchive -archivePath IPA-name.xcarchive -exportPath IPA-name.ipa -exportOptionsPlist exportOptions.plist

**什么是ExportOptions.plist?**

ExportOptions。plist在Xcode中是必需的。它允许您在创建ipa文件时指定一些选项。当你使用Xcode存档应用程序时,你可以在友好的UI中选择这些选项。

重要的: ExportOptions中的发布和开发方法不同。plist < br > < br > 应用商店:< / >强

exportOptions_release ~ method = app-store
. exportOptions_release ~ method = app-store

发展 < br >

exportOptions_dev ~ method = development

开放式终端&拖放你的项目文件夹:

cd /用户/用户名/桌面/演示/

依次执行以下命令:

将应用程序构建为-"demo. xcodeproject;进入档案

Xcodebuild存档项目演示。xcodeproj -scheme demo -archivePath /Users/username/Desktop/demo.xcarchive

如果你的应用程序有Podfile fie as-"demo.xcworkspace"

xcodebuild -workspace项目名称。xcworkspace -scheme Scheme-Name -sdk iphoneos -configuration Release provision - profile = " Provision-Name " Development_Team= " Team-ID " archive -archivePath /Path/To/Output/AppName。xcarchive存档

IPA导出构建命令

下载ExportOptions。在这里中的plist文件

xcodebuild -exportArchive -archivePath /Users/shilpa/Desktop/demo。xcarchive -exportPath /Users/shilpa/Desktop/demo。ipa -exportOptionsPlist /Users/shilpa/Downloads/ExportOptions.plist