发布生成

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。

详细了解支持时间线和替代方案。

将应用程序二进制包上传到 App Center 进行分发。 App Center 支持 Android、iOS、macOS、Windows 和自定义操作系统应用的包分发。 可以将发布分发给单个测试人员或测试人员组。 对于 iOS 和 Android 应用程序,还可以发布到 Google Play、App Store 和 Intune 等应用商店。 请参阅 发布到消费者和企业应用商店

在此页上,可以了解如何生成用于发布的二进制文件,以及如何使用门户、命令行接口 (CLI) 以及应用程序编程接口 (API) 将其上传到组。

还可以使用 Azure DevOps 或 Jenkins:

生成应用程序二进制包

首先,必须将应用程序打包到二进制文件中以供发布。 可以手动创建此文件,也可以使用 App Center Build。 可以将生成配置为在分支的生成配置中自动分发。

以下部分介绍了如何为 App Center 支持的所有应用类型创建分发文件。

注意

如果要上传 (.zip、.ipa 和其他) 存档,则应用的总未压缩大小必须小于 4GB。

Android

对于 Android,必须生成已签名的应用捆绑包或 APK 文件。 有关此过程的完整详细信息,请参阅 有关准备发布应用的官方 Google 文档

  1. 确保已 更新清单 并具有正确 配置的 Gradle 内部版本
  2. 在 Android Studio 中,选择 “生成>生成签名捆绑包/APK ”,然后按照向导中的步骤生成应用捆绑包或 APK。

Android Studio 将生成的应用捆绑包放在 project-name/module-name/build/outputs/bundle/ 中,将 APK 放在 project-name/module-name/build/outputs/apk/中。

注意

(AAB) 分发 Android 应用程序捆绑包时,App Center 会生成通用 APK,使用生成的签名密钥对其进行签名,并将其分发到设备。

iOS

对于 iOS,必须为应用程序生成 IPA 包。 有关此过程的完整详细信息,请参阅 官方 Apple 文档

  1. 在预配配置文件中为所有硬件设备注册 UDID
  2. 在 Xcode 中,转到 “产品>存档” 以存档应用。
  3. 使用适当的预配配置文件导出存档。

macOS

对于 macOS,必须生成应用包。 App Center 支持发布 .app.zip、.pkg 或 .dmg 类型的应用包。 有关此过程的完整详细信息,请参阅 官方 Apple macOS 文档

  1. 在 Apple 开发人员帐户中注册单个设备注册多个设备
  2. 在 Xcode 中,转到 “产品>存档” 以存档应用。
  3. 使用适当的预配配置文件导出存档。

Windows

App Center 支持发布类型.appx为 、、.appxbundle、、.msi.msix.appxupload.msixbundle.msixupload.zip的 Windows 应用包。 有关如何以 AppX 或 MSIX 格式打包应用的完整详细信息,请参阅 官方 Microsoft UWP 文档

自定义操作系统

使用 .zip 格式的自定义操作系统存档应用版本。

分发包

注意

包含要下载的文件的所有 install.appcenter.ms URL 均可公开访问。

若要使用 App Center 分发包,请转到 App Center,转到应用,然后转到 “分发> ”并选择“ 新版本”。 完成向导中的步骤。 分发新版本

在第一步中,选择 “发布 ”区域以浏览要上传的文件,或将文件拖放到该区域。 根据应用的操作系统和文件扩展名,App Center 可能会要求你输入版本的版本和内部版本号。 输入信息,然后选择“ 下一步”。

你可以以纯文本或 Markdown 格式将发行说明包含在发布过程中。 选择“下一步”。

可以将发布面向多个 通讯组 或测试人员。 App Center 使此版本可供这些测试人员和属于所选组的用户使用。 选择“下一步”。

设置发布目标

发布 iOS 应用时,可以 自动预配测试人员的设备。 选择“下一步”。

查看发布。 如果应用使用 分发 SDK,则可以将 App Center 配置为强制发布。 当 App Center 分发发布时,它会向目标中设置的所有测试人员发送新版本的电子邮件通知。 可以在“审阅”选项卡中选择不通知测试人员。最后,选择“ 分发 ”,将文件发布到测试人员。

使用 App Center 命令行接口进行分发

警告

需要使用 App Center CLI 2.7 或更高版本才能使用此功能。

使用 appcenter distribute releaseApp Center CLI 中的 命令分发发布。 以下示例命令将名为 ~/releases/my_app-23.ipa 的文件分发到 拥有David的应用My-AppBeta testers

appcenter distribute release --app David/My-App --file ~/releases/my_app-23.ipa --group "Beta testers"

使用 API 进行分发

可以调用 App Center API 来分发发布。 以下方法旨在描述最小工作方法,许多任务可以进一步自定义或自动化。

可在此处查看示例实现: https://github.com/microsoft/appcenter-Xamarin.UITest-Demo/blob/main/ac-distribute.sh

先决条件

  • 要上传和分发的应用包。
  • 获取 API 令牌。 API 令牌用于对所有 App Center API 调用进行身份验证。
  • 通讯组名称 (可选,如果缺少或无效,上传仍将完成)
  • {owner_name}确定要为其分发发布的应用的 和 {app_name} 。 这些标识符用于 API 调用的 URL 中。 对于用户拥有的应用,App Center 中的 URL 可能如下所示: https://appcenter.ms/users/Example-User/apps/Example-App。 此处, {owner_name}Example-User ,而 {app_name}Example-App。 对于组织拥有的应用,URL 可能是 https://appcenter.ms/orgs/Example-Org/apps/Example-App{owner_name} 而 将是 Example-Org
上传新版本

使用以下顺序 API 调用上传新版本:

  1. 创建新的发布上传:要调用的终结点为 POST /v0.1/apps/{owner_name}/{app_name}/uploads/releases

        OWNER_NAME="Example-Org"
        APP_NAME="Example-App"
        API_TOKEN="Example-Token"
    
        curl -X POST "https://api.appcenter.ms/v0.1/apps/$OWNER_NAME/$APP_NAME/uploads/releases" -H  "accept: application/json" -H  "X-API-Token: $API_TOKEN" -H  "Content-Type: application/json" -H "Content-Length: 0"
    

    响应将如下所示,并 {VARIABLE_NAME} 替换每个用途的唯一数据:

         {
             "id": "{ID}",
             "package_asset_id": "{PACKAGE_ASSET_ID}",
             "upload_domain": "https://file.appcenter.ms",
             "token": "{TOKEN}",
             "url_encoded_token": "{URL_ENCODED_TOKEN}"
         }
    
  2. 从上一步的响应中复制参数,因为下一步将使用其中的大部分参数,包括 package_asset_idupload_domain & url_encoded_token

    确定应用包的大小(以字节为单位)。 建议使用 等 wc -c ExampleApp.ipa 命令来获取准确的字节计数。

    MIME Type根据应用为 content_type 设置 :

    • Android .apk 使用供应商类型 application/vnd.android.package-archive
    • Android .aab 使用供应商类型 application/x-authorware-bin
    • iOS 使用常规类型 application/octet-stream

    最后一个命令应如下所示:

    FILE_NAME="ExampleApp.apk"
    FILE_SIZE_BYTES=$(wc -c $RELEASE_FILE_LOCATION | awk '{print $1}')
    APP_TYPE='application/vnd.android.package-archive' # iOS uses `application/octet-stream` instead.
    
    METADATA_URL="https://file.appcenter.ms/upload/set_metadata/$PACKAGE_ASSET_ID?file_name=$FILE_NAME&file_size=$FILE_SIZE_BYTES&token=$URL_ENCODED_TOKEN&content_type=$APP_TYPE"
    
     curl -s -d POST -H "Content-Type: application/json" -H "Accept: application/json" -H "X-API-Token: $API_TOKEN" "$METADATA_URL"
    

    返回的输出应如下所示:

     {
         "error":false,
         "id":"{PACKAGE_ASSET_ID}",
         "chunk_size":4194304,
         "resume_restart":false,
         "chunk_list":[1,2,3,4,5],
         "blob_partitions":1,
         "status_code":"Success"
     }
    
  3. chunk_size使用无法自定义的值,可以将应用上传拆分为连续区块,以便上传到分发。 例如,可以使用如下所示的 split 实用工具:

    split -b $CHUNK_SIZE $RELEASE_FILE_LOCATION temp/split
    

    此命令在名为 splitaasplitab等的temp目录中生成顺序文件。 每个文件在限制内 chunk_size 被拆分。

  4. 接下来,需要使用相应的块上传拆分应用包的每个区块:

    BLOCK_NUMBER=0
    
    for i in temp/*
    do
        BLOCK_NUMBER=$(($BLOCK_NUMBER + 1))
        CONTENT_LENGTH=$(wc -c "$i" | awk '{print $1}')
    
        UPLOAD_CHUNK_URL="https://file.appcenter.ms/upload/upload_chunk/$PACKAGE_ASSET_ID?token=$URL_ENCODED_TOKEN&block_number=$BLOCK_NUMBER"
    
        curl -X POST $UPLOAD_CHUNK_URL --data-binary "@$i" -H "Content-Length: $CONTENT_LENGTH" -H "Content-Type: $CONTENT_TYPE"
    done
    
  5. 上传完成后,将上传资源的状态更新为 uploadFinished

    FINISHED_URL="https://file.appcenter.ms/upload/finished/$PACKAGE_ASSET_ID?token=$URL_ENCODED_TOKEN"
    curl -d POST -H "Content-Type: application/json" -H "Accept: application/json" -H "X-API-Token: $API_TOKEN" "$FINISHED_URL"
    
    COMMIT_URL="https://api.appcenter.ms/v0.1/apps/$OWNER_NAME/$APP_NAME/uploads/releases/$ID"
    curl -H "Content-Type: application/json" -H "Accept: application/json" -H "X-API-Token: $API_TOKEN" \
    --data '{"upload_status": "uploadFinished","id": "$ID"}' \
    -X PATCH \
    $COMMIT_URL
    
  6. 上传后,在上传标记为已完成之前会有一段短暂的延迟。 轮询此状态以获取 $RELEASE_ID 下一步的 :

    RELEASE_STATUS_URL="https://api.appcenter.ms/v0.1/apps/$OWNER_NAME/$APP_NAME/uploads/releases/$UPLOAD_ID"
    POLL_RESULT=$(curl -s -H "Content-Type: application/json" -H "Accept: application/json" -H "X-API-Token: $API_TOKEN" $RELEASE_STATUS_URL)
    RELEASE_ID=$(echo $POLL_RESULT | jq -r '.release_distinct_id')
    
    if [[ $RELEASE_ID == null ]];
    then
       echo "Failed to find release from appcenter"
       exit 1
    fi
    
  7. 最后,释放生成。 要调用的终结点是 PATCH /v0.1/apps/{owner_name}/{app_name}/releases/{release_id}

    DISTRIBUTE_URL="https://api.appcenter.ms/v0.1/apps/$OWNER_NAME/$APP_NAME/releases/$RELEASE_ID"
    
    curl -H "Content-Type: application/json" -H "Accept: application/json" -H "X-API-Token: $API_TOKEN" \
    --data '{"destinations": [{ "name": "'"$DISTRIBUTION_GROUP"'"}] }' \    
    -X PATCH \
    $DISTRIBUTE_URL
    
分发发布

将上传的版本分发给测试人员、组或商店,以查看 App Center 门户中的版本。 这三个终结点是:

组的示例:

    curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "X-API-Token: $API_TOKEN" -d "{ \"id\": "$DISTRIBUTION_GROUP_ID", \"mandatory_update\": false, \"notify_testers\": false}" 

可以在该组的设置页上找到通讯组 ID。

对于更复杂的方案,此处引用了分发到多个目标的请求: PATCH /v0.1/apps/{owner_name}/{app_name}/releases/{release_id}

Re-Release 生成

若要将内部版本发布到另一个通讯组,请在 App Center 中的任意位置转到 “分发 > 版本 ”,然后选择要再次分发的版本。 此时会打开发布详细信息页。 选择屏幕右上角的“ 分发 ”按钮,然后选择目标以启动重新发布过程。 按照向导中的步骤操作,最后选择“ 分发 ”,将发布发送给组/测试人员或应用商店。

强制汇报

强制发布以强制所有用户运行同一版本的应用。 执行此操作时,App Center 将在所有测试人员设备上安装所选更新。

仅当应用使用 App Center 分发 SDK 时,才能强制发布。 通过在分发版本的评审阶段选中 “强制更新 ”复选框,使发布成为强制发布,或者可以使用 API。

可以通过打开 [你的应用] > 分发>组>版本,在 App Center 中查看强制发布。 强制版本由红点指示。

成功发布后,测试人员可以通过电子邮件、登录 App Center 或直接链接访问发布。

可以在专用目标的发布页上找到指向特定版本的链接。 “安装”按钮

注意

可通过单击下载按钮在发布页上下载 android 应用程序捆绑包 (AAB) 。 如果需要可安装的 APK 文件格式,请使用设备上的安装门户 (https://install.appcenter.ms) 。 可以在“下载”按钮旁边的生成的 QR 码下方找到该链接。

可以在公共组中的“发布”选项卡上找到指向公共目标的特定版本的链接。 公共深层链接