App Center の配布 – MAUI と Xamarin のアプリ内更新プログラム
重要
Visual Studio App Center は、2025 年 3 月 31 日に廃止される予定です。 完全に廃止されるまで Visual Studio App Center を引き続き使用できますが、移行を検討できる推奨される代替手段がいくつかあります。
App Center 配布を使用すると、App Center 経由で配布するときに、ユーザーは新しいバージョンのアプリをインストールできます。 利用可能な新しいバージョンのアプリでは、SDK によって、新しいバージョンをダウンロードまたは延期するための更新ダイアログがユーザーに表示されます。 更新を選択すると、SDK によってアプリケーションの更新が開始されます。
警告
Google Play では、実行時に使用されていなくても、アプリ内更新コードは悪意のある動作と見なされます。 アプリを Google Play に送信する前に、 このセクション の指示にしたがって、配布 SDK のバリエーションを使用します。 アプリ内の更新コードを削除しないと、準拠していない状態になり、Google Play からアプリが削除される可能性があります。
注意
自動 UI テストを実行している場合、アプリ内更新を有効にすると、App Center バックエンドに対する認証が試行されるため、自動 UI テストはブロックされます。 UI テストで App Center Distribute を有効にしないことをお勧めします。
アプリ内更新プログラムをアプリに追加する
まだアプリケーションで SDK を設定して開始していない場合は、「 はじめ に」セクションに従います。
1. App Center の配布モジュールを追加する
App Center SDK はモジュール形式のアプローチで設計されています。開発者は、関心のあるサービスのモジュールのみを統合する必要があります。
Visual Studio for Mac
- Visual Studio for Mac を開きます。
- [ファイルを開く] を>クリックし、ソリューションを選択します。
- ソリューション ナビゲーターで[ パッケージ ] セクションを右クリックし、[ NuGet パッケージの追加...] を選択します。
- App Center を検索し、App Center Distribute をインストールします。
- [ パッケージの追加] をクリックします。
Windows 用 Visual Studio
- Windows 用 Visual Studio を開きます。
- [ファイルを開く] を>クリックし、ソリューションを選択します。
- ソリューション ナビゲーターで、[ 参照 ] を右クリックし、[ NuGet パッケージの管理] を選択します。
- App Center を検索し、Microsoft.AppCenter.Distribute をインストールします。
パッケージ マネージャー コンソール
- Visual Studio でコンソールを開きます。 これを行うには、[ツール]>[NuGet パッケージ マネージャー パッケージ マネージャー> コンソール] の順に選択します。
- Visual Studio for Macで作業している場合は、NuGet パッケージ管理拡張機能がインストールされていることを確認します。 このためには、[ Visual Studio>拡張機能] を選択し、 NuGet を検索し、必要に応じてインストールします。
- コンソールで次のコマンドを入力します。
Install-Package Microsoft.AppCenter.Distribute
注意
ポータブル プロジェクト ( Xamarin.Forms など) で App Center SDK を使用する場合は、ポータブル、Android、iOS の各プロジェクトにパッケージをインストールする必要があります。 そのためには、各サブプロジェクトを開き、「Visual Studio for Mac」または「Visual Studio for Windows」セクションで説明されている対応する手順に従う必要があります。
注意
Android 10 以降では、バックグラウンドからの起動アクティビティに制限があります。 バックグラウンドからのアクティビティの開始に関する制限に関する記事を参照してください。
注意
Android 10 (Go エディション) で実行されているアプリは 、SYSTEM_ALERT_WINDOW アクセス許可を受け取ることができません。 Go デバイスでのSYSTEM_ALERT_WINDOWに関する記事を参照してください。
注意
Android 11 以降では、 ACTION_MANAGE_OVERLAY_PERMISSION
意図によって常にユーザーが最上位の [設定] 画面に移動し、ユーザーはアプリのアクセス許可を SYSTEM_ALERT_WINDOW
付与または取り消すことができます。 Android 11 でのアクセス許可の更新に関する記事を参照してください。
2. App Center の配布を開始する
「はじめに」ガイドの説明に従って を呼び出 AppCenter.Start(...)
して、App Center SDK を構成します。
iOS アプリケーションの場合は、 を AppDelegate.cs
開き、 の呼び出し の前に 次の行を LoadApplication
追加します。
Distribute.DontCheckForUpdatesInDebug();
この手順は、実行時にデバッグ構成が自動的に検出される Android では必要ありません。
Android 上のデバッグ ビルドに対してアプリ内更新を有効にするには、プロジェクトの MainActivity.cs ファイルの メソッドと の前LoadApplication
に、次のメソッドをOnCreate
呼び出します。
Distribute.SetEnabledForDebuggableBuild(true);
注意
このメソッドはデバッグ ビルドにのみ影響し、リリース ビルドには影響しません。
2.3 [iOS のみ] プロジェクトの Info.plist を変更する
App Center SDK では、サイドローディングを回避するためにアプリケーションにリダイレクトする URL がチェックされるため、ポータル経由で配布された更新プログラムを正しく処理するには、ファイルのInfo.plist
セクションで CFBundleURLTypes
を指定CFBundleURLSchemes
する必要があります。
注意
Info.plist
、または情報プロパティ リスト ファイルは、バンドルされた実行可能ファイルの重要な構成情報を含む構造化テキスト ファイルです。
詳細については、 Apple 開発者向けドキュメントを参照してください。
- または の新しいキー
URL types
CFBundleURLTypes
を Info.plist ファイルに追加します (Xcode で Info.plist がソース コードとして表示される場合)。 - 最初の子項目のキーを または
CFBundleURLSchemes
にURL Schemes
変更します。 - URL スキームとして「」と入力
appcenter-${APP_SECRET}
し、アプリのアプリ シークレットに置き換えます${APP_SECRET}
。
ヒント
Info.plist を正しく変更したことを確認する場合は、ソース コードとして開きます。 これには、 ではなく、アプリ シークレットを含む次の ${APP_SECRET}
エントリが含まれている必要があります。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>appcenter-${APP_SECRET}</string>
</array>
</dict>
</array>
Google Play ビルドのアプリ内更新プログラムを削除する
Google Play では、実行時に使用されていなくても、アプリ内更新コードは悪意のある動作と見なされます。 アプリ内の更新コードを削除しないと、準拠していない状態になり、Google Play からアプリが削除される可能性があります。 簡単にするために、App Center Distribute SDK のバージョンにスタブ API が用意されているため、依存関係のスワップのみが変更されます。
Xamarin.Android と共有プロジェクト用に という名前
GooglePlay
の新しいビルド構成を追加します。 プロジェクトのビルド構成が適切なソリューション構成に正しくマップされていることを確認します。 詳細については、Visual Studio またはVisual Studio for Macの手順に関するページを参照してください。任意のテキスト エディターで Xamarin.Android と共有プロジェクト' を
.csproj
開き、配布参照を条件付き項目グループに移動します。<ItemGroup Condition=" '$(Configuration)' != 'GooglePlay' "> <PackageReference Include="Microsoft.AppCenter.Distribute" Version="3.3.0" /> </ItemGroup> <ItemGroup Condition=" '$(Configuration)' == 'GooglePlay' "> <PackageReference Include="Microsoft.AppCenter.DistributePlay" Version="3.3.0" /> </ItemGroup>
注意
古い packages.config 形式を使用して NuGet 参照を管理している場合は、移行手順に従って PackageReference 形式 に移行できます。
変更を保存し、NuGet パッケージを復元します。
IDE の上部にあるコマンド バーで構成を変更できます。
プライベート配布グループを使用する
既定では、配布ではパブリック配布グループが使用されます。 プライベート配布グループを使用する場合は、プロパティを使用して UpdateTrack
明示的に設定する必要があります。
Distribute.UpdateTrack = UpdateTrack.Private;
注意
既定値は UpdateTrack.Public
です。 このプロパティは、メソッド呼び出しの AppCenter.Start
前にのみ更新できます。 更新トラックの変更は、アプリケーション プロセスの再起動時に保持されないため、呼び出しの前にプロパティが常に AppCenter.Start
更新されない場合は、既定でパブリックになります。
この呼び出しの後、ブラウザー ウィンドウが開き、ユーザーを認証します。 以降のすべての更新チェックでは、プライベート トラックの最新リリースが取得されます。更新トラックは、アプリの起動間で SDK に保持されません。
ユーザーが プライベート トラックにいる場合は、認証が成功した後、メンバーになっているすべてのプライベート配布グループから最新のリリースが取得されることを意味します。 ユーザーが パブリック トラックにいる場合は、すべてのパブリック配布グループから最新のリリースを取得することを意味します。
自動更新の自動チェックを無効にする
既定では、SDK は新しいリリースを自動的にチェックします。
- アプリケーションの起動時。
- アプリケーションがバックグラウンドになると、フォアグラウンドで再び実行されます。
- 以前に無効にした場合に、Distribute モジュールを有効にする場合。
新しいリリースを手動でチェックする場合は、更新プログラムの自動チェックを無効にすることができます。 これを行うには、SDK の開始前に次のメソッドを呼び出します。
Distribute.DisableAutomaticCheckForUpdate();
注意
このメソッドは、メソッド呼び出しの前に呼び出す AppCenter.Start
必要があります。
その後、次の CheckForUpdate
セクションで説明する API を使用できます。
手動で更新プログラムを確認する
Distribute.CheckForUpdate();
注意
自動更新が有効になっている場合でも、更新呼び出しの手動チェックが機能します。 別のチェックが既に実行されている場合、更新の手動チェックは無視されます。 更新プログラムの手動チェックは、ユーザーが更新プログラムを延期した場合 (最新バージョンが必須の更新プログラムでない限り) 処理されません。
アプリ内更新ダイアログをカスタマイズまたはローカライズする
1. テキストをカスタマイズまたはローカライズする
更新ダイアログに表示されるテキストをローカライズする場合は、独自のリソース文字列を簡単に指定できます。 このリソース ファイル内の iOS 用の文字列ファイルと、このリソース ファイル内の Android 用の文字列ファイルを確認します。 同じ文字列名/キーを使用し、独自のアプリ リソース ファイルのダイアログに反映されるローカライズされた値を指定します。
2. 更新ダイアログをカスタマイズする
コールバックを実装することで、既定の更新ダイアログの外観を ReleaseAvailable
カスタマイズできます。 次の例に示すように、 を呼び出す AppCenter.Start
前にコールバックを登録する必要があります。
// In this example OnReleaseAvailable is a method name in same class
Distribute.ReleaseAvailable = OnReleaseAvailable;
AppCenter.Start(...);
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;
// custom dialog
var title = "Version " + versionName + " available!";
Task answer;
// On mandatory update, user can't postpone
if (releaseDetails.MandatoryUpdate)
{
answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install");
}
else
{
answer = Current.MainPage.DisplayAlert(title, releaseNotes, "Download and Install", "Maybe tomorrow...");
}
answer.ContinueWith((task) =>
{
// If mandatory or if answer was positive
if (releaseDetails.MandatoryUpdate || (task as Task<bool>).Result)
{
// Notify SDK that user selected update
Distribute.NotifyUpdateAction(UpdateAction.Update);
}
else
{
// Notify SDK that user selected postpone (for 1 day)
// This method call is ignored by the SDK if the update is mandatory
Distribute.NotifyUpdateAction(UpdateAction.Postpone);
}
});
// Return true if you're using your own dialog, false otherwise
return true;
}
Xamarin.Android の実装に関する注意事項:
例に示すように、 を呼び出すか、コールバックが を返す場合は を呼び出Distribute.NotifyUpdateAction(UpdateAction.UPDATE);
Distribute.NotifyUpdateAction(UpdateAction.POSTPONE);
す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.");
}
実行時に App Center の配布を有効または無効にする
実行時に App Center の配布を有効または無効にすることができます。 無効にした場合、SDK はアプリ内更新機能を提供しませんが、App Center ポータルで [サービスの配布] を引き続き使用できます。
Distribute.SetEnabledAsync(false);
App Center の配布を再度有効にするには、同じ API を使用しますが、パラメーターとして を渡します true
。
Distribute.SetEnabledAsync(true);
他の API 呼び出し (など IsEnabledAsync
) の整合性を保つには、この呼び出しを待機する必要はありません。
状態は、アプリケーションの起動間でデバイスのストレージに保持されます。
注意
このメソッドは、開始後 Distribute
にのみ使用する必要があります。
App Center の配布が有効になっているかどうかを確認する
App Center の配布が有効になっているかどうかをチェックすることもできます。
bool enabled = await Distribute.IsEnabledAsync();
注意
このメソッドは、開始後 Distribute
にのみ使用する必要があります。常に開始前にが返 false
されます。
アプリが更新のために閉じる直前にクリーンを実行します (iOS のみ)
次の例に示すように、コールバックを登録します。
// In this example, OnWillExitApp is a method name in same class
Distribute.WillExitApp = OnWillExitApp;
void OnWillExitApp()
{
// Perform clean up here
}
これで、 OnWillExitApp()
Distribute が閉じようとしているときにが呼び出されます。
アプリ内更新のしくみ
注意
アプリ内更新プログラムを機能させるには、アプリ ビルドをリンクからダウンロードする必要があります。 IDE からインストールされている場合、または手動でインストールされている場合は機能しません。
アプリ内更新機能は次のように機能します。
この機能は、App Center Distribute サービスを使用して配布される RELEASE ビルド (既定) でのみ機能します。 iOS ガイド付きアクセス機能が有効になっている場合は機能しません。
SDK を統合し、アプリのリリース バージョンをビルドし、App Center にアップロードすると、その配布グループ内のユーザーにメールで新しいリリースの通知が送信されます。
各ユーザーがメールでリンクを開くと、アプリケーションがデバイスにインストールされます。 電子メール リンクを使用してインストールすることが重要です。サイドローディングはサポートされていません。 アプリケーションがリンクからダウンロードされると、SDK は重要な情報を Cookie から後で更新のためにチェックに保存します。それ以外の場合、SDK にはその重要な情報がありません。
アプリケーションがトラックをプライベートに設定すると、ブラウザーが開いてユーザーを認証し、アプリ内更新を有効にします。 パブリック トラックに切り替えても認証情報が有効なままで、後でもう一度プライベートに戻る場合でも、ブラウザーは再び開きません。 ブラウザー認証が成功すると、ユーザーは自動的にアプリケーションにリダイレクトされます。 トラックがパブリック (既定値) の場合、次の手順は直接行われます。
- iOS 9 と 10 では、 の
SFSafariViewController
インスタンスがアプリ内で開き、ユーザーを認証します。 認証が成功すると、自動的に閉じられます。 - iOS 11 では、ユーザー エクスペリエンスは iOS 10 に似ていますが、iOS 11 はログイン情報にアクセスするためのアクセス許可をユーザーに求めます。 これはシステム レベルのダイアログであり、カスタマイズすることはできません。 ユーザーがダイアログをキャンセルした場合、テスト中のバージョンを引き続き使用できますが、アプリ内更新プログラムは取得されません。 次回アプリを起動すると、ログイン情報に再度アクセスするように求められます。
- iOS 9 と 10 では、 の
アプリの新しいリリースでは、アプリ内更新ダイアログが表示され、次の場合にアプリケーションを更新するようユーザーに求められます。
iOS:
- または の値が
CFBundleShortVersionString
大きい - の値が等しい
CFBundleShortVersionString
が、 の値がCFBundleVersion
大きい。 - バージョンは同じですが、ビルドの一意の識別子は異なります。
- または の値が
Android:
- または の値が
versionCode
大きい - の等しい値
versionCode
ですが、 の値versionName
は異なります。
- または の値が
ヒント
同じ apk/ipa を 2 回目にアップロードした場合、バイナリが同一の場合、ダイアログは表示 されません 。 iOS では、同じバージョンプロパティを持つ 新しい ビルドをアップロードすると、更新ダイアログが表示されます。 その理由は、 それが別 のバイナリであるためです。 Android では、両方のバージョン プロパティが同じ場合、バイナリは同じと見なされます。
アプリ内更新プログラム操作方法テストしますか?
リリース ビルド (App Center SDK の配布モジュールを使用) を App Center Portal にアップロードしてアプリ内更新プログラムをテストし、毎回バージョン番号を増やす必要があります。
- まだ作成していない場合は、App Center ポータルでアプリを作成します。
- 新しい配布グループを作成して名前を付け、アプリ内更新機能をテストするためのものとして認識できるようにします。
- 自分自身 (またはアプリ内更新機能のテストに含めるすべてのユーザー) を追加します。 これには、App Center でそのアプリに使用されなかった新しいメール アドレスまたは捨てメール アドレスを使用します。 これにより、実際のテスト担当者のエクスペリエンスに近いエクスペリエンスが保証されます。
- App Center Distribute を含み、以下で説明するようにセットアップ ロジックを含むアプリの新しいビルドを作成します。 グループがプライベートの場合は、 プロパティの使用を開始する前に、アプリ内のプライベート更新トラックを
UpdateTrack
設定することを忘れないでください。 - ポータルで [ 新しいリリースの配布 ] ボタンをクリックし、アプリのビルドをアップロードします。
- アップロードが完了したら、[次へ] をクリックし、そのアプリ配布の [宛先] として作成した配布グループを選択します。
- [配布] を確認し、アプリ内テスト グループにビルドを配布します。
- そのグループのPeopleは、アプリのテスト担当者への招待を受け取ります。 招待を承諾すると、モバイル デバイスから App Center ポータルからアプリをダウンロードできます。 アプリ内更新プログラムがインストールされたら、アプリ内更新プログラムをテストする準備が整います。
- アプリのバージョンを更新する (
CFBundleShortVersionString
またはCFBundleVersion
iOS の場合はversionCode
Android の場合) - アプリのリリース バージョンをビルドし、前の手順で行ったようにアプリの新しいビルドをアップロードし、前に作成した 配布グループに配布 します。 配布グループのメンバーは、次回アプリを起動すると、新しいバージョンの入力を求められます。
ヒント
配布グループなどに関する詳細な情報については、App Center の配布を利用する方法に関する情報をご覧ください。App Center Distribute を使用して、コードを追加せずに新しいバージョンのアプリを配布することは可能ですが、アプリのコードに App Center Distribute を追加すると、テスト担当者とユーザーがアプリ内更新エクスペリエンスを取得する際によりシームレスなエクスペリエンスが得られます。
App Center サービスへのアプリケーション デリゲートのメソッドの自動転送を無効にする
App Center では、swizzling を使用して、アプリケーション デリゲートのメソッドを App Center サービスに自動的に転送し、SDK の統合を向上させます。 他のサード パーティ製ライブラリまたはアプリケーション デリゲート自体と競合する可能性があります。 この場合は、次の手順に従って、すべての App Center サービスの App Center アプリケーション デリゲート転送を無効にすることができます。
- プロジェクトの Info.plist ファイルを開きます。
- キーを追加
AppCenterAppDelegateForwarderEnabled
し、値を に0
設定します。 これにより、すべての App Center サービスのアプリケーション デリゲート転送が無効になります。 - ファイルにコールバックを追加
OpenUrl
しますAppDelegate.cs
。
public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
{
Distribute.OpenUrl(url);
return true;
}