Xcode 3.2 在 Build 菜单下提供了一个很棒的新功能,“Build and Archive”,它可以生成一个适合 Ad Hoc 分发的 .ipa 文件。您还可以打开管理器,转到“归档的应用程序”和“将应用程序提交到 iTunesConnect”。
有没有办法从命令行使用“构建和存档”(作为构建脚本的一部分)?我假设 xcodebuild
会以某种方式参与其中,但 man
页面似乎没有说明这一点。
更新 Michael Grinich 要求澄清;这就是你不能用命令行构建做的事情,你只能在“构建和存档”之后用 Xcode 的 Organizer 做的功能。
您可以单击“共享应用程序...”与 beta 测试人员共享您的 IPA。正如 Guillaume 在下面指出的那样,由于 Xcode 的一些魔力,这个 IPA 文件不需要 beta 测试人员需要安装的单独分发的 .mobileprovision 文件;这很神奇。没有命令行脚本可以做到这一点。例如,Arrix 的脚本(5 月 1 日提交)不符合该要求。更重要的是,在您对构建进行 beta 测试后,您可以单击“将应用程序提交到 iTunes Connect”以将完全相同的构建提交给 Apple,即您测试的二进制文件,而无需重新构建它。这在命令行中是不可能的,因为签署应用程序是构建过程的一部分;您可以为 Ad Hoc beta 测试签名,或者您可以签名它们以提交到 App Store,但不能同时进行。任何基于命令行构建的 IPA 都不能在手机上进行 beta 测试,然后直接提交给 Apple。
我很乐意有人来证明我错了:这两个功能在 Xcode GUI 中都很好用,并且不能从命令行复制。
xcodebuild
的一部分。创建 IPA 文件只需将应用程序放入名为“Payload”的目录中,压缩该目录并将其重命名为 MyAppName.ipa。
我发现了如何从命令行自动化构建和归档过程,我刚刚写了一个 blog article 来解释如何实现这一点。
您必须使用的命令是 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}"
您将在 the article 中找到所有详细信息。如果您有任何问题,请不要犹豫。
使用 Xcode 4.2,您可以使用 -scheme 标志来执行此操作:
xcodebuild -scheme <SchemeName> archive
执行此命令后,存档将显示在 Xcode 管理器中。
archive
操作不遵守您通过此调用提供的任何设置 — 这只是花费了我 小时!
xcode-select <path to Xcode.app>
确保您选择了正确的 Xcode 版本
-scheme <SchemeName>
”指定方案
用 Xcode 9 和 Swift 更新我的答案
档案
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace \
-scheme <schemeName> clean archive -configuration release \
-sdk iphoneos -archivePath <ProjectName>.xcarchive
IPA 导出(请注意导出选项 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
那些使用它在 CI/CD 工具(如 teamcity/jenkins)中构建项目的人,请确保您使用构建代理中安装的正确 Xcode 进行归档和导出。
您可以为此使用以下 2 个选项中的任何一个。
使用 xcodebuild 的完整路径,
/Applications/Xcode 9.3.1.app/Contents/Developer/usr/bin/xcodebuild
使用 xcode 选择,
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 测试的,对我来说工作正常。
xcodebuild -workspace <ProjectName>/<ProjectName>.xcworkspace -scheme <schemeName> clean archive -configuration release -sdk iphoneos -archivePath <ProjectName>.xcarchive
抛出错误:requires a provisioning profile with the Associated Domains feature. Select a provisioning profile for the "Release" build configuration in the project editor.
我一直在使用自己的构建脚本来生成用于临时分发的 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
该脚本还会增加版本号。如果不需要,您可以删除该部分。希望能帮助到你。
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 App Store 分发)。
-workspace
选项添加到 xcodebuild(以及工作区的路径)? man xcodebuild
声明:“要构建 Xcode 工作区,您必须同时传递 -workspace 和 -scheme 选项来定义构建”。
我们使用 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>Ä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 文件上传到我们的网络服务器。
这是 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>
要进行此设置,您必须将分发证书和配置文件导入指定用户的钥匙串。
$WORKSPACE
而不是 $PWD
来生成 APP_PATH
我发现这里的其他一些答案很难开始。 This article 为我做了。如其他答案中所述,某些路径可能需要是绝对的。
命令:
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"
对于 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 大得多。
-scheme
和 -configuration
选项指定了如何对 ipa 文件进行签名。
我已经简要说明了要遵循的步骤,以及使用下面的终端生成 ipa 时要传递的参数:
转到终端中包含 MyApp.xcodeproject 文件的文件夹通过使用下面给出的命令,您将获得应用程序的所有目标 /usr/bin/xcodebuild -list 执行上述命令后,您将获得目标列表其中你应该选择一个你需要生成的特定目标 .ipa /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release 上面的命令构建项目并创建一个.app文件。找到.app的路径文件为 ./build/Release-iphoneos/MyApp.app 构建成功后,然后执行以下命令,使用以下语法使用开发人员名称和配置文件生成应用程序的 .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”)
ipa 将在选定的输出目录“${OUTDIR}”生成
Xcode 8:
国际音标格式:
xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
使用供应配置文件 MyMobileApp Distribution Profile 将存档 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 -project projectname -activetarget -activeconfiguration archive
更进一步,使用 Xcode 7 通过命令行上传到 iTunesConnect! (假设您从已使用正确的发布配置文件和签名身份签名的 .ipa
开始。)
输入 altool
,即应用程序加载器的 CLI 界面(docs
,第 38 页)。隐藏在 Xcode.app 结构的深处,是一个方便的功能,可以让我们直接上传到 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。密码是可选的,如果您不使用命令,则会提示您输入密码。
如果在验证步骤期间应用程序有任何问题,控制台将打印出来。
如果您不想保存 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
,您可以按照 this SO answer 上的建议运行指向正确位置的符号链接:
ln -s /Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms /usr/local/itms
如何使用命令构建 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
Xcode 中需要 ExportOptions.plist。它允许您在创建 ipa 文件时指定一些选项。当您使用 Xcode 归档您的应用程序时,您可以在友好的 UI 中选择选项。
重要提示:ExportOptions.plist AppStore 中发布和开发的方法不同:
exportOptions_release ~ 方法 = 应用商店
发展
exportOptions_dev ~ 方法 = 开发
改进了文森特的回答,我编写了一个脚本来做到这一点:xcodearchive
它允许您通过命令行存档(生成 ipa)您的项目。把它想象成 xcodebuild
命令的姊妹,但用于归档。
代码在 github 上可用:http://github.com/gcerquant/xcodearchive
该脚本的一个选项是启用在时间戳存档中存档 dSYM 符号。没有理由不再保留这些符号,也无法象征您以后可能收到的崩溃日志。
试试 xctool,它是 Apple 的 xcodebuild 的替代品,可以更轻松地构建和测试 iOS 和 Mac 产品。它对持续集成特别有帮助。它有一些额外的功能:
运行与 Xcode.app 相同的测试。构建和测试结果的结构化输出。人性化的 ANSI 彩色输出。
No.3 非常有用。如果有人可以读取 xcodebuild 的控制台输出,我不知道,我不能,通常它给了我一行 5000 多个字符。比论文还难读。
xctool:https://github.com/facebook/xctool
如果您使用下一个工具: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}"
更新到 Xcode 8 后,我发现 Enterprise ipa generate by
/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。
所以我切换到xcodebuild -exportArchive
,一切恢复正常。
你的意思是验证/共享/提交选项?我认为这些是 Xcode 特有的,不适合命令行构建工具。
有了一些聪明,我敢打赌你可以制作一个脚本来为你做这件事。看起来它们只是使用 UUDI 和 plist 存储在 ~/Library/MobileDevice/Archived Applications/
中。我也无法想象对验证器进行逆向工程会那么难。
我感兴趣的自动化过程是将构建发送给 beta 测试人员。 (由于 App Store 提交很少发生,我不介意手动执行,特别是因为我经常需要添加新的描述文本。)通过使用 Xcode 的 CLI 执行伪 Build+Archive,我可以从每次代码提交触发自动构建,创建具有嵌入式配置文件的 IPA 文件,并将其通过电子邮件发送给测试人员。
xcodebuild
并制作 IPA 的自定义脚本一起使用。
打开终端并拖放您的项目文件夹:
cd /用户/用户名/桌面/演示/
一一执行以下命令:
将应用程序作为“demo.xcodeproj”构建到存档中
xcodebuild archive -project demo.xcodeproj -scheme demo -archivePath /Users/username/Desktop/demo.xcarchive
如果您的应用程序具有 Podfile fie as-"demo.xcworkspace"-
xcodebuild -workspace Project-Name.xcworkspace -scheme Scheme-Name -sdk iphoneos -configuration Release Provisioning_Profile=“Provision-Name” Development_Team=“Team-ID” archive -archivePath /Path/To/Output/AppName.xcarchive archive
IPA 导出构建命令
从这里下载 ExportOptions.plist 文件
xcodebuild -exportArchive -archivePath /Users/shilpa/Desktop/demo.xcarchive -exportPath /Users/shilpa/Desktop/demo.ipa -exportOptionsPlist /Users/shilpa/Downloads/ExportOptions.plist
RELEASE_BUILDDIR
需要是绝对路径。-o "${ipa_path}"
中的 ipa 文件路径必须是绝对路径。否则你可能会得到error: Unable to create '.../...ipa'
或者它会被忽略创建。该死的,浪费了我几个小时。