通过命令行进行Xcode“构建和存档”

我是研究僧i 提交于 2020-02-28 01:01:43

Xcode 3.2在“生成”菜单的“生成和存档”下提供了一个很棒的新功能,该功能生成一个适用于Ad Hoc分发的.ipa文件。 您也可以打开管理器,转到“存档的应用程序”,然后“将应用程序提交到iTunesConnect”。

有没有一种方法可以从命令行使用“构建和存档”(作为构建脚本的一部分)? 我以为xcodebuild会以某种方式参与其中,但是man页似乎没有对此发表任何评论。

更新 Michael Grinich要求澄清; 这就是您完全无法使用命令行构建的功能,这些功能只有在“构建并存档”之后才能使用Xcode的Organizer进行。

  1. 您可以单击“共享应用程序...”与Beta测试人员共享IPA。 正如Guillaume在下面指出的那样,由于Xcode的神奇之处,此IPA文件不需要Beta测试人员需要安装的单独分发的.mobileprovision文件。 太神奇了。 没有命令行脚本可以做到这一点。 例如,Arrix的脚本(5月1日提交)不符合该要求。
  2. 更重要的是,在对Beta版本进行Beta测试之后,您可以单击“将应用程序提交到iTunes Connect”以将完全相同的版本提交给Apple(您测试过的二进制文件),而无需重新构建。 在命令行中这是不可能的,因为对应用程序进行签名是构建过程的一部分。 您可以签名进行Ad hoc beta测试,也可以签名以提交到App Store,但不能同时签名。 无法在手机上对基于命令行的IPA进行Beta测试,然后直接提交给Apple。

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


#1楼

我们使用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

然后,詹金斯将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>

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


#2楼

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

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

3号非常有用。 如果有人能阅读xcodebuild的控制台输出,我也不知道,通常它给了我一行5000多个字符。 比论文更难读。

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


#3楼

我在下面给出了要执行的步骤的简要说明,以及在以下使用Terminal生成ipa时要传递的参数:

  1. 转到终端中包含MyApp.xcodeproject文件的文件夹

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

    /usr/bin/xcodebuild -list
  3. 执行上述命令后,您将获得一个目标列表,您应该选择一个目标来生成.ipa。

    /usr/bin/xcodebuild -target $TARGET -sdk iphoneos -configuration Release
  4. 上面的命令将构建项目并创建一个.app文件。找到该.app文件的路径是./build/Release-iphoneos/MyApp.app

  5. Build成功后,执行以下命令以使用开发人员名称和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”)
  1. 将在选定的输出目录“ $ {OUTDIR} ”中生成ipa

#4楼

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


#5楼

使用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/new-export-options-plist-in-xcode-9


那些使用此工具在teamcity / jenkins等CI / CD工具中构建项目的人,请确保使用正确的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进行了测试,对我来说工作正常。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!