App Center 散發 – Unity 應用程式內更新

重要

Visual Studio App Center 已排定於 2025 年 3 月 31 日淘汰。 雖然您可以繼續使用 Visual Studio App Center,直到它完全淘汰為止,但有數個建議您考慮移轉至的建議替代方案。

深入瞭解支持時程表和替代方案。

App Center 散發套件可讓您的使用者/測試人員在透過App Center發佈應用程式後安裝新版本的應用程式。 啟用之後,SDK 會向使用者呈現更新對話方塊,以下載或延後安裝最新的更新。 一旦他們選擇更新,SDK 就會開始更新您的應用程式。

重要

適用於 Unity 的散發 SDK 不支援 UWP。 此頁面中的指示僅涵蓋Android和iOS。

警告

Google Play 會將應用程式內更新程式代碼視為惡意行為,即使它未在運行時間使用也一樣。 將您的應用程式提交至Google Play之前,請先依照 本節 中的指示移除此程序代碼。 無法移除應用程式內更新程式代碼可能會導致Google Play中的應用程式不符合規範和移除。

注意

如果您執行自動化 UI 測試,啟用的應用程式內更新將會封鎖您的自動化 UI 測試,因為它們會嘗試對 App Center 後端進行驗證。 建議您停用 UI 測試的應用程式內更新。

將應用程式內更新新增至您的應用程式

新增 App Center 散發模組

App Center SDK 是使用模組化方法所設計,開發人員只需要整合他們感興趣的服務模組。

如果您尚未在應用程式中設定並啟動 SDK,請遵循 Unity 使用者入門 檔。 請務必匯入 App Center 散發套件。 名稱格式應為 AppCenterDistribute-v{version}.unitypackage

注意

Android 10 或更高版本具有從背景啟動活動的限制。 請參閱關於 從背景啟動活動的限制一文。

注意

在 Android 10 (Go 版本上執行的應用程式) 無法接收 SYSTEM_ALERT_WINDOW 許可權。 請參閱 Go 裝置上SYSTEM_ALERT_WINDOW的文章。

注意

從 Android 11 開始, ACTION_MANAGE_OVERLAY_PERMISSION 意圖一律會將使用者帶入最上層的 [設定] 畫面,讓使用者可以授與或撤銷 SYSTEM_ALERT_WINDOW 應用程式的許可權。 請參閱 Android 11 中許可權更新的文章。

拿掉 Google Play 組建的應用程式內更新

Google Play 會將應用程式內更新程式代碼視為惡意行為,即使它未在運行時間使用也一樣。 將您的應用程式提交至Google Play之前,請先移除此程序代碼。 無法移除應用程式內更新程式代碼可能會導致Google Play中的應用程式不符合規範和移除。 若要移除應用程式內更新機器碼,請在附加 AppCenterBehavior 遊戲物件的 [散發] 區段底下取消核取 [使用散發] 複選框。

使用私人通訊群組

根據預設,散發會使用公用通訊群組。 如果您想要使用私人通訊群組,您必須變更 UpdateTrack 為 [私人]。 若要這樣做,請在附加 AppCenterBehavior 的遊戲物件上,選擇 [更新追蹤] 下拉式清單中的 [私人]。

使用私人播放軌時,瀏覽器視窗將會開啟以驗證使用者。 所有後續的更新檢查都會在私人追蹤上取得最新版本。

如果使用者在 私人追蹤上,這表示在成功驗證之後,他們將會從他們所屬的任何私人通訊群組取得最新版本。 如果使用者在 公開播放軌上,表示他們會從任何公用通訊群組取得最新版本。

停用更新的自動檢查

根據預設,SDK 會自動檢查新版本:

  • 應用程式啟動時。
  • 當應用程式進入背景時,再次在前景中。
  • 如果先前停用,則啟用散發模組時。

如果您想要手動檢查新版本,您可以停用更新的自動檢查。

若要這樣做,請在附加 AppCenterBehavior 的遊戲物件上,取消核取 [散發] 區段底下的 [自動檢查更新] 複選框。

然後,您可以使用 CheckForUpdate 下一節所述的 API。

手動檢查更新

Distribute.CheckForUpdate();

這會將要求傳送至 App Center,並在有新版本可用時顯示更新對話方塊。

注意

即使啟用自動更新,更新呼叫的手動檢查仍可運作。 如果已經完成另一個檢查,則會忽略更新的手動檢查。 如果使用者已延後更新 (,除非最新版本是強制更新) ,否則不會處理更新的手動檢查。

自訂或當地語系化應用程式內更新對話方塊

1.自定義或本地化文字

如果您想要將更新對話框中顯示的文字本地化,您可以提供自己的資源字串。 查看 此 iOS 資源檔中的 iOS 字串檔案 ,以及 此 Android 資源檔案中適用於 Android 的字串檔案。 使用相同的字串名稱/索引鍵,並指定要反映在您自己的應用程式資源檔中對話框的當地語系化值。

2.自定義更新對話框

您可以實 ReleaseAvailable 作回呼來自定義預設更新對話框的外觀。

警告

您需要在應用程式載入的第一個場景中,於 Awake 的方法 MonoBehaviour 中註冊回呼,以避免遺漏任何發行回呼調用。

// In this example, OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;

以下是以自訂邏輯取代 SDK 對話框的回呼實作:

bool OnReleaseAvailable(ReleaseDetails releaseDetails)
{
    // Look at releaseDetails public properties to get version information, release notes text or release notes URL
    string versionName = releaseDetails.ShortVersion;
    string versionCodeOrBuildNumber = releaseDetails.Version;
    string releaseNotes = releaseDetails.ReleaseNotes;
    Uri releaseNotesUrl = releaseDetails.ReleaseNotesUrl;

    // (Do something with the values if you want)

    // On mandatory update, user can't postpone
    if (releaseDetails.MandatoryUpdate)
    {
        // Force user to update (you should probably show some custom UI here)
        Distribute.NotifyUpdateAction(UpdateAction.Update);
    }
    else
    {
        // Allow user to update or postpone (you should probably show some custom UI here)
        // "GetUserUpdateAction()" isn't part of the SDK; it just represents a way of getting user response.
        // This blocks the thread while awaiting the user's response! This example shouldn't be used literally
        UpdateAction updateAction = GetUserUpdateAction();
        Distribute.NotifyUpdateAction(updateAction);
    }
    // Return true if you're using your own UI to get user response, false otherwise
    return true;
}

Android 的實作注意事項:

如範例所示,如果回呼傳true回 ,您必須呼叫 Distribute.NotifyUpdateAction(UpdateAction.UPDATE);Distribute.NotifyUpdateAction(UpdateAction.POSTPONE);

如果您未呼叫 NotifyUpdateAction,則回呼會在每次活動變更時重複。

如果活動在通知 SDK 使用者動作之前發生變更,則可以使用相同的版本再次呼叫回呼。

需要此行為才能涵蓋下列案例:

  • 您的應用程式會傳送至背景 (,例如按 HOME) 然後在不同的活動中繼續。
  • 您的活動會由另一個活動涵蓋,而不需要離開應用程式 (,例如按下某些通知) 。
  • 類似上述案例。

在此情況下,裝載對話框的活動可能會取代,而不需用戶互動。 因此,SDK 會再次呼叫接聽程式,以便還原自定義對話方塊。

3.如果找不到更新,請執行程序代碼

如果 SDK 檢查是否有更新,而且找不到比目前使用的更新還新的任何可用更新, NoReleaseAvailable 則會叫用回呼。 這可讓您在這類案例中執行自定義程式碼。 您需要先註冊回呼,再呼叫 AppCenter.Start ,如下列範例所示:

// In this example OnNoReleaseAvailable is a method name in same class
Distribute.NoReleaseAvailable = OnNoReleaseAvailable;
AppCenter.Start(...);
void OnNoReleaseAvailable()
{
    AppCenterLog.Info(LogTag, "No release available callback invoked.");
}

## Enable or disable App Center Distribute at runtime

You can enable and disable App Center Distribute at runtime. If you disable it, the SDK won't provide any in-app update functionality but you can still use the Distribute service in the App Center portal.

To disable the Distribute service, use the following code:

```csharp
Distribute.SetEnabledAsync(false);

若要再次啟用App Center散發,請使用相同的API,但傳遞 true 為參數。

Distribute.SetEnabledAsync(true);

此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。

您不需要等候此呼叫,才能 (進行其他 API 呼叫,例如 IsEnabledAsync) 一致。

狀態會保存在應用程式啟動的裝置記憶體中。

檢查 App Center 散發是否已啟用

您也可以檢查 App Center 散發是否已啟用:

Distribute.IsEnabledAsync();

此 API 是異步的,您可以在 我們的 App Center 異步 API 指南中深入瞭解。

啟用偵錯組建的應用程式內更新

根據預設,應用程式內更新只會針對發行組建啟用。

若要在 Android 和 iOS 上啟用偵錯組建的應用程式內更新,請在附加 AppCenterBehavior 的遊戲物件上,核取 [偵錯中啟用散發] 複選框。

App Center 行為

在 Unity 中,可偵錯組建是已核取 [開發組建 ] 選項的組建。

在應用程式關閉以進行更新之前,立即執行清除

注意

此回呼僅適用於 iOS。

註冊回呼,如下列範例所示:

// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
    // Perform clean up here
}

如此一來, OnWillExitApp() 當散發即將關閉時,將會叫用 。

應用程式內更新的運作方式

注意

若要讓應用程式內更新運作,應該從鏈接下載應用程式組建。 如果從 IDE 安裝或手動安裝,它將無法運作。

應用程式內更新功能的運作方式如下:

  1. 此功能預設僅適用於使用App Center散發服務散發的發行組建 () 。 如果開啟 iOS 引導式存取功能,它將無法運作。
  2. 整合 SDK 之後,請建置應用程式的發行版本,並將其上傳至 App Center。 通訊群組中的用戶會透過電子郵件收到有關新版本的通知。
  3. 當使用者在其電子郵件中開啟連結時,應用程式將會安裝在其裝置上。 請務必使用電子郵件連結來安裝 - 我們不支援側載。 從鏈接下載應用程式時,SDK 會儲存 Cookie 中的重要資訊,以供稍後檢查更新,否則 SDK 沒有該密鑰資訊。
  4. 如果應用程式將追蹤設定為私人,瀏覽器將會開啟以驗證使用者並啟用應用程式內更新。 只要驗證信息維持有效狀態,即使切換回公用追蹤,稍後仍不會再次開啟瀏覽器。 如果瀏覽器驗證成功,用戶會自動重新導向回應用程式。 如果追蹤是公用 (,這是預設) ,則下一個步驟會直接發生。
  5. 應用程式的新版本會顯示應用程式內更新對話方塊,要求使用者更新您的應用程式是否為:
    • iOS:
      • 或的值 CFBundleShortVersionString 較高
      • CFBundleShortVersionString 相等值,但的值 CFBundleVersion較高。
      • 版本相同,但組建唯一標識符不同。
    • Android:
      • 或的值 versionCode 較高
      • versionCode 相等值 versionName,但的值不同。

提示

如果您第二次上傳相同的.apk/.ipa,對話框將不會顯示為二進位檔相同。 在 iOS 上,如果您上傳具有相同版本屬性的新組建,則會顯示更新對話方塊。 這是因為它是不同的二進位檔。 在Android上,如果兩個版本屬性都相同,二進位檔會被視為相同。

如何? 測試應用程式內更新嗎?

您必須上傳發行組建 (,以使用App Center SDK的散發模組) 至 App Center 入口網站,以測試應用程式內更新,每次增加版本號碼。

  1. 如果您還沒有,請在 App Center 入口網站中建立您的應用程式。
  2. 建立新的通訊群組,併為其命名。
  3. 將自己新增 (或您想要包含在應用程式內更新功能測試的所有人員) 。 針對此步驟使用新的或擲回電子郵件位址,其中一個尚未與此應用程式搭配使用。 這可確保您的體驗接近實際測試人員的體驗。
  4. 建立應用程式的新組建,其中包含 App Center散發 ,並包含設定邏輯,如下所示。 如果群組是私人的,請記得先設定私人應用程式內更新追蹤,再開始使用 UpdateTrack 屬性
  5. 按兩下入口網站中的 [ 散發新版本 ] 按鈕,並上傳應用程式的組建。
  6. 上傳完成後,按 [下一步],然後選取您先前建立為該應用程式散發目的地的通訊群組
  7. 檢閱散發,並將組建散發至應用程式內測試群組。
  8. 該群組中的 人員 將會收到成為應用程式測試人員的邀請。 接受邀請之後,他們可以從App Center入口網站從其行動裝置下載應用程式。 安裝應用程式內更新之後,您就可以開始測試應用程式內更新。
  9. 針對 Android) ,將應用程式版本 (CFBundleShortVersionString CFBundleVersion iOS versionCode 版本提升。
  10. 建置應用程式的發行版本,並上傳您在上一個步驟中所做的新組建。 散發至您稍早建立的 通訊群組 。 下次應用程式啟動時,系統會提示通訊群組的成員輸入新版本。

提示

如需有關通訊群組等詳細資訊,請參閱如何使用App Center散發的相關信息。雖然您可以使用App Center散發散發來散發新版本的應用程式,但不新增任何程式代碼,但將App Center散發新增至應用程式程式代碼將會導致測試人員和使用者取得應用程式內更新體驗時,產生更順暢的體驗。