命令行中的 Xcode“构建和存档”

Posted

技术标签:

【中文标题】命令行中的 Xcode“构建和存档”【英文标题】:Xcode "Build and Archive" from command line 【发布时间】:2011-02-09 12:42:01 【问题描述】:

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。 @Michael,“构建和存档”还启用了管理器功能,当您手动制作 IPA 文件时无法使用这些功能。 我的评论有点长,所以发布为answer。 虽然 vdaubry 的第一个/接受的答案会起作用,但对于较新版本的 Xcode,Reid 的答案要简单得多。 【参考方案1】:

我发现了如何从命令行自动化构建和存档过程,我刚刚写了一个 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 中找到所有详细信息。如果您有任何问题,请不要犹豫。

【讨论】:

一段时间对我来说不是很明显,但RELEASE_BUILDDIR 需要是绝对路径。 另外请注意,如果您希望保留构建 .app 时使用的相同签名/配置文件,则不需要 --sign 或 --embed 选项。这将是您在发布配置的代码签名构建设置中设置的任何内容。 注意-o "$ipa_path"中的ipa文件路径必须是绝对路径。否则你可能会得到error: Unable to create '.../...ipa' 或者它会被默默地忽略创建。该死的浪费了我几个小时。 谁能告诉我 大括号的作用?我假设他们会处理空白,但我可能是错的。 Xcode 8.3 Beta 1 完全删除 PackageApplication 命令。不要再次使用它并按照下面的建议使用“xcodebuild -scheme archive”。【参考方案2】:

在 Xcode 4.2 中,您可以使用 -scheme 标志来执行此操作:

xcodebuild -scheme <SchemeName> archive

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

【讨论】:

是的,好多了!为了使它工作,我做了以下: cd 到您的项目文件夹,然后运行“xcodebuild -scheme MyProjectName archive”(因为通常,您有一个与您的项目名称同名的方案) 请注意,archive 操作不遵守您通过此调用提供的任何设置,除了工作区和方案 - 这只是花费了我 小时! Xcode 4.4 中运行良好,我确信在 4.3 中也很好。确保您使用xcode-select &lt;path to Xcode.app&gt; 选择了正确的 Xcode 版本 另外,您必须使用“-scheme &lt;SchemeName&gt;”指定方案 这对于创建存档来说很好,但是 xcrun 中的 PackageApplication 实际上会创建 .ipa 文件。您需要此文件通过 TestFlight 之类的方式分发给 beta 测试人员【参考方案3】:

使用 Xcode 9 和 Swift 更新我的答案

存档

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

IPA 导出请注意导出选项列表

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-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 测试的,对我来说工作正常。

【讨论】:

它在 Xcode6.1.1 上完美运行。我选择从终端构建我的应用程序,因为当我尝试从管理器构建 AdHoc 分发时,Xcode6 给我一个“您的帐户已经有一个有效的证书”错误。 如果您有一个 WatchKit 应用程序,那么 ipa 中有一个名为 WatchKitSupport 的新文件夹以及一个 Symbols 文件夹(可能是可选的)。你知道是否有办法让 exportArcive 也导出这些? xcodebuild -workspace &lt;ProjectName&gt;/&lt;ProjectName&gt;.xcworkspace -scheme &lt;schemeName&gt; clean archive -configuration release -sdk iphoneos -archivePath &lt;ProjectName&gt;.xcarchive 抛出错误:requires a provisioning profile with the Associated Domains feature. Select a provisioning profile for the "Release" build configuration in the project editor. exportProvisioningProfile 不再是有效选项 @MohammadRezaKoohkan 在旧答案中我保留它以显示参考,您可以在我的答案开头看到有效的导出选项【参考方案4】:

我一直在使用自己的构建脚本来生成用于临时分发的 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

脚本还会增加版本号。如果不需要,您可以删除该部分。希望对您有所帮助。

【讨论】:

这是一个很好的解决方案,尽管您的代码在没有 cmets 的情况下有点难以阅读。你能多写一些关于正在发生的事情吗? xcode 从哪里获得“APPNAME.ipa”名称?从包装-> 产品名称? 这个脚本对于 WatchKit 应用程序来说是不够的。有谁知道watchkit app的ipa文件的新规范吗? 使用 watch kit 看到与 @RPM 相同的问题。有什么解决办法吗? @RPM 查看 WatchKit 内容。我自己没试过,但看起来很彻底matrixprojects.net/p/watchkit-command-line-builds【参考方案5】:

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 分发)。

【讨论】:

在使用 xcode 工作区并且与 cocopods 不兼容时不起作用 您是否尝试将-workspace 选项添加到xcodebuild(以及工作区的路径)? man xcodebuild 声明:“要构建 Xcode 工作区,您必须同时传递 -workspace 和 -scheme 选项来定义构建”。 添加了 -workspace 选项后,这对我来说非常有用——我只需要获取第一个命令创建的存档的路径,这样我就可以将它输入到第二个命令中。您可以使用 -archivePath 选项指定创建存档的位置,但我更喜欢它的默认位置。这帮助我弄清楚了如何获得该路径:***.com/a/9024901/813247【参考方案6】:

我们使用 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 文件上传到我们的网络服务器。

这是 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>

要进行此设置,您必须将分发证书和配置文件导入指定用户的钥匙串。

【讨论】:

您也可以使用 Apple 的 Plistbuddy 命令更改 plist 文件,例如: /usr/libexec/PlistBuddy -c "Set :CFBundleVersion 1.2.3.4" /path/to/info.plist 。而不是玩 SED :) 感谢您的信息。我对 sed 比 plistbuddy 更有经验,所以我选择 sed :) 我推荐$WORKSPACE而不是$PWD来生成APP_PATH【参考方案7】:

我发现这里的其他一些答案很难开始。 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"

【讨论】:

【参考方案8】:

您实际上可以像 XCode 那样退出构建,这样您就可以测试和发布相同的二进制文件。例如,在我的脚本(类似于上面的那些)中,我构建了作为 AdHoc 构建签名的发布版本,然后我将其存档为 IPA 以进行测试,然后使用我的分发证书辞职并创建一个 zip 文件,这是我发送给苹果。相关行是:

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

【讨论】:

【参考方案9】:

对于 Xcode 7,您有一个更简单的解决方案。唯一的额外工作是您必须创建一个配置 plist 文件来导出存档。

(与Xcode 6相比,xcrun xcodebuild -help-exportFormat-exportProvisioningProfile选项的结果中不再提及;前者被删除,后者被-exportOptionsPlist取代。)

第一步,将目录切换到包含 .xcodeproject 或 .xcworkspace 文件的文件夹。

cd MyProjectFolder

第 2 步,使用 Xcode 或 /usr/libexec/PlistBuddy exportOptions.plist 创建导出选项 plist 文件。顺便说一句,xcrun xcodebuild -help 会告诉你必须在 plist 文件中插入哪些键。

第三步,创建.xcarchive文件(其实是文件夹)如下(build/目录现在Xcode会自动创建),

xcrun xcodebuild -scheme MyApp -configuration Release archive -archivePath build/MyApp.xcarchive

第四步,像这样导出为.ipa文件,和Xcode6不同

xcrun xcodebuild -exportArchive -exportPath build/ -archivePath build/MyApp.xcarchive/ -exportOptionsPlist exportOptions.plist

现在,您在 build/ 目录中获得了一个 ipa 文件。只需将其发送到 Apple App Store。

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

【讨论】:

如何使用这种方法指定配置文件。我尝试了exportProvisioningProfile,但它说不能与exportOptionsPlist一起使用......并且无法在我能找到的plist中指定配置文件......它似乎只采用与那个同名的最旧的配置文件构建它(这与我想要的相反,真的) 项目设置,包含在名为“project.pbxproj”的文件中,具有签名设置,因此-scheme-configuration 选项指定了如何对ipa 文件进行签名。 当你说“把它发送给 Apple”时,这个过程是什么,因为这超出了正常的存档步骤? 有两种方式“发送给Apple”,登录itunesconnect.apple.com,或者使用Xcode->Open Developer Tool->Application Loader。 @mix3d 我最终找到了一个完全自动化的解决方案,为此我创建了一个新的答案!【参考方案10】:

我已经简要说明了要遵循的步骤,以及使用下面的终端生成 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”中生成

【讨论】:

我看到此错误“指定的应用程序不存在或不是捆绑目录” xcrun PackageApplication 已弃用。【参考方案11】:

Xcode 8:


国际音标格式:

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

将存档 MyMobileApp.xcarchive 作为 IPA 文件导出到路径 MyMobileApp.ipa,使用 配置文件 MyMobileApp 分发配置文件。

APP格式:

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

使用应用程序将存档 MyMacApp.xcarchive 作为 PKG 文件导出到路径 MyMacApp.pkg 阳离子签名身份开发人员 ID 应用程序:我的团队。安装程序签名身份 开发者 ID 安装程序:我的团队隐式用于对导出的包进行签名。

Xcodebuild man page

【讨论】:

【参考方案12】:

转到您的项目根目录所在的文件夹,然后:

xcodebuild -project projectname -activetarget -activeconfiguration archive

【讨论】:

这似乎不起作用。 “归档”构建操作在 XCode 3.2.2(最终版)中不可用。【参考方案13】:

更进一步,使用 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

【讨论】:

【参考方案14】:

如何用命令构建iOS项目?

Clean : codebuild 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中发布和开发的方法不同AppStore:

exportOptions_release ~ 方法 = 应用商店

发展

exportOptions_dev ~ 方法 = 开发

【讨论】:

【参考方案15】:

改进了文森特的回答,我写了一个脚本来做到这一点:xcodearchive 它允许您通过命令行归档(生成 ipa)您的项目。 可以把它想象成 xcodebuild 命令的姊妹,但用于归档。

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

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

【讨论】:

@KunalBalani 不,我不希望它能够正确处理工作区。看一下代码,适应它不需要太多工作。欢迎请求请求!【参考方案16】:

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

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

No.3 非常有用。我不知道是否有人可以读取 xcodebuild 的控制台输出,但我不能,通常它给了我一行 5000 多个字符。比论文还难读。

xctool: https://github.com/facebook/xctool

【讨论】:

【参考方案17】:

如果您使用下一个工具: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"

source

【讨论】:

【参考方案18】:

更新到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,一切恢复正常。

【讨论】:

【参考方案19】:

您的意思是验证/共享/提交选项?我认为这些是 Xcode 特有的,不适合命令行构建工具。

我敢打赌,你可以编写一个脚本来为你做这件事。看起来它们只是用 UUDI 和 plist 存储在 ~/Library/MobileDevice/Archived Applications/ 中。我也无法想象对验证器进行逆向工程会那么难。

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

【讨论】:

我澄清了我的问题。当你在上面说“我可以”时,你的意思是你今天真的可以做到吗? 是的。我将Hudson Continuous Integration 与运行xcodebuild 并制作IPA 的自定义脚本一起使用。 对不起,我迟到了,但 TestFlight 有一个超级简单的上传 API,你应该看看【参考方案20】:

打开终端并拖放您的项目文件夹:

cd /Users/用户名/Desktop/demo/

一一执行以下命令:

将应用程序作为“demo.xcodeproj”构建到存档中

xcodebuild archive -project demo.xcodeproj -scheme demo -archivePath /Users/username/Desktop/demo.xcarchive

如果你的应用有 Podfile 文件为-"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 导出构建命令

从Here 下载 ExportOptions.plist 文件

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

【讨论】:

以上是关于命令行中的 Xcode“构建和存档”的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行中捕获 OCUnit 的测试失败/成功?

elinks-命令行中的浏览器

Ruby 命令行:如何通过命令行中的文本发送 CTRL-C 命令?

这个 curl 命令行中的“OPEN”是啥意思?

命令行中的关键字导出?

命令行中的 PHP 服务器名称