App Center の配布 – Unity のアプリ内更新プログラム

重要

Visual Studio App Center は、2025 年 3 月 31 日に廃止される予定です。 完全に廃止されるまで Visual Studio App Center を引き続き使用できますが、移行を検討できる推奨される代替手段がいくつかあります。

詳細については、サポートタイムラインと代替手段に関するページを参照してください。

App Center ディストリビューションを使用すると、App Center を介して配布すると、ユーザー/テスト担当者は新しいバージョンのアプリをインストールできます。 有効にすると、SDK によって、最新の更新プログラムのインストールをダウンロードまたは延期するための更新ダイアログがユーザーに表示されます。 更新を選択すると、SDK によってアプリケーションの更新が開始されます。

重要

Distribute SDK for Unity は UWP をサポートしていません。 このページの手順では、Android と iOS についてのみ説明します。

警告

Google Play では、実行時に使用されていなくても、アプリ内更新コードは悪意のある動作と見なされます。 アプリを Google Play に送信する前に 、このセクション の指示どおりにこのコードを削除します。 アプリ内の更新コードを削除しないと、準拠していない状態になり、Google Play からアプリが削除される可能性があります。

注意

自動 UI テストを実行している場合、アプリ内更新を有効にすると、App Center バックエンドに対する認証が試行されるため、自動 UI テストはブロックされます。 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 がアタッチされたゲーム オブジェクトの [配布] セクションの [配布を使用する] チェック ボックスをオフにします。

プライベート配布グループを使用する

既定では、配布ではパブリック配布グループが使用されます。 プライベート配布グループを使用する場合は、Private に変更 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 の実装に関する注意事項:

例に示すように、 を呼び出す必要があります。コールバックから が返された場合は、 または Distribute.NotifyUpdateAction(UpdateAction.POSTPONE); を呼び出Distribute.NotifyUpdateAction(UpdateAction.UPDATE);true必要があります。

を呼び出 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 Distribute を再度有効にするには、同じ API を使用しますが、パラメーターとして を渡します true

Distribute.SetEnabledAsync(true);

この API は非同期です。詳細については、 App Center の非同期 API ガイドを参照してください。

他の API 呼び出し (など IsEnabledAsync) を一貫性のあるものにするために、この呼び出しを待機する必要はありません。

状態は、アプリケーションの起動間でデバイスのストレージに保持されます。

App Center の配布が有効になっているかどうかを確認する

App Center Distribute が有効になっている場合は、チェックすることもできます。

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() Distribute が閉じようとしたときに が呼び出されます。

アプリ内の更新のしくみ

注意

アプリ内の更新プログラムを機能させるには、アプリ ビルドをリンクからダウンロードする必要があります。 IDE からインストールされている場合、または手動でインストールされている場合は機能しません。

アプリ内更新機能は次のように機能します。

  1. この機能は、App Center Distribute サービスを使用して配布される RELEASE ビルド (既定) でのみ機能します。 iOS ガイド付きアクセス機能が有効になっている場合は機能しません。
  2. SDK を統合したら、アプリのリリース バージョンをビルドし、App Center にアップロードします。 配布グループ内のユーザーには、新しいリリースに関する通知が電子メールで送信されます。
  3. 各ユーザーがメールでリンクを開くと、アプリケーションがデバイスにインストールされます。 電子メール リンクを使用してインストールすることが重要です。サイドローディングはサポートされていません。 アプリケーションがリンクからダウンロードされると、SDK は Cookie から更新のために重要な情報をチェックに保存します。それ以外の場合、SDK にはそのキー情報がありません。
  4. アプリケーションによってトラックがプライベートに設定されている場合、ブラウザーが開き、ユーザーを認証し、アプリ内更新を有効にします。 パブリック トラックに切り替えても認証情報が有効なままで、後でもう一度プライベートに戻る場合でも、ブラウザーは再び開きません。 ブラウザー認証が成功すると、ユーザーは自動的にアプリケーションにリダイレクトされます。 トラックがパブリック (既定値) の場合は、次の手順が直接実行されます。
  5. アプリの新しいリリースでは、アプリ内更新ダイアログが表示され、次の場合にアプリケーションを更新するようユーザーに求められます。
    • iOS:
      • または の値が CFBundleShortVersionString 大きい
      • の値 CFBundleShortVersionString が 等しいが、 の CFBundleVersion値が大きい。
      • バージョンは同じですが、ビルドの一意識別子は異なります。
    • Android:
      • または の値が versionCode 大きい
      • の等しい値 versionCode ですが、 の値 versionNameは異なります。

ヒント

同じ.apk/.ipa を 2 回目にアップロードした場合、バイナリが同一の場合、ダイアログは表示されません。 iOS では、同じバージョンプロパティを持つ新しいビルドをアップロードすると、更新ダイアログが表示されます。 その理由は、別のバイナリであるためです。 Android では、両方のバージョン プロパティが同じ場合、バイナリは同じと見なされます。

操作方法アプリ内更新プログラムをテストしますか?

リリース ビルド (App Center SDK の配布モジュールを使用) を App Center Portal にアップロードしてアプリ内更新プログラムをテストし、毎回バージョン番号を増やす必要があります。

  1. まだ作成していない場合は、App Center ポータルでアプリを作成します。
  2. 新しい配布グループを作成し、名前を付けます。
  3. 自分自身 (またはアプリ内更新機能のテストに含めるすべてのユーザー) を追加します。 この手順では、このアプリでまだ使用されていない新しいメール アドレスまたは捨てメール アドレスを使用します。 これにより、実際のテスト担当者のエクスペリエンスに近いエクスペリエンスが保証されます。
  4. App Center Distribute を含み、以下で説明するようにセットアップ ロジックを含むアプリの新しいビルドを作成します。 グループがプライベートの場合は、 プロパティの使用を開始する前に、アプリ内のプライベート更新トラックをUpdateTrack設定することを忘れないでください。
  5. ポータルで [ 新しいリリースの配布 ] ボタンをクリックし、アプリのビルドをアップロードします。
  6. アップロードが完了したら、[次へ] をクリックし、以前にアプリ配布の [宛先] として作成した配布グループを選択します。
  7. [配布] を確認し、アプリ内テスト グループにビルドを配布します。
  8. そのグループのPeopleは、アプリのテスト担当者への招待を受け取ります。 招待を承諾すると、モバイル デバイスから App Center ポータルからアプリをダウンロードできます。 アプリ内更新プログラムがインストールされたら、アプリ内更新プログラムをテストする準備が整います。
  9. アプリのバージョンを上げます (CFBundleShortVersionString または CFBundleVersion iOS の場合は versionCode Android)。
  10. アプリのリリース バージョンをビルドし、前の手順と同様に新しいビルドをアップロードします。 前に作成した 配布グループに配布 します。 配布グループのメンバーは、次回アプリを起動すると、新しいバージョンの入力を求められます。

ヒント

配布グループなどに関する詳細な情報については、App Center の配布を利用する方法に関する情報をご覧ください。App Center Distribute を使用して、コードを追加せずに新しいバージョンのアプリを配布することは可能ですが、アプリのコードに App Center Distribute を追加すると、テスト担当者とユーザーがアプリ内更新エクスペリエンスを取得する際によりシームレスなエクスペリエンスが得られます。