次の方法で共有


App Center の配布 - iOS アプリ内更新プログラム

重要

Visual Studio App Center は、2026 年 6 月 30 日まで引き続きサポートされる分析機能と診断機能を除き、2025 年 3 月 31 日に廃止されました。 詳細を参照してください。

App Center Distribute を使用すると、App Center 経由で配布するときに、ユーザーが新しいバージョンのアプリをインストールできるようになります。 新しいバージョンのアプリが利用可能になると、SDK によって更新ダイアログがユーザーに表示され、新しいバージョンがダウンロードされるか延期されます。 更新を選択すると、SDK によってアプリケーションの更新が開始されます。

アプリ内更新プログラムを使用する場合は、いくつかの点を考慮する必要があります。

  1. App Store でアプリをリリースした場合、アプリ内更新プログラムは無効になります。
  2. 自動 UI テストを実行している場合、アプリ内更新を有効にすると、App Center バックエンドに対する認証が試行されるため、自動 UI テストがブロックされます。 UI テスト ターゲットに対して App Center Distribute を有効にしないことをお勧めします。

4.0.0 バージョンの App Center では、破壊的変更が導入されました。 App Center SDK 4.0.0 以降に移行するセクションに従って、App Center を以前のバージョンから移行します。

重要

App Center SDK では、iOS 13 で導入された複数のウィンドウ アプリはサポートされていません。

アプリ内の更新プログラムをアプリに追加する

アプリケーションで SDK を構成していない場合は、「 はじめ に」セクションに従います。

1. App Center の配布モジュールを追加する

App Center SDK はモジュール方式のアプローチで設計されています。必要なのは、関心のあるサービスのモジュールを統合することだけです。

Cocoapods による統合

Cocoapods を使用して App Center をアプリに統合する場合は、ポッドファイルに次の依存関係を追加し、 pod install実行します。

pod 'AppCenter/Distribute'

Carthage による統合

  1. 次の依存関係を Cartfile に追加して、App Center Distribute を含めます。

    # Use the following line to get the latest version of App Center
    github "microsoft/appcenter-sdk-apple"
    
    # Use the following line to get the specific version of App Center
    github "microsoft/appcenter-sdk-apple" ~> X.X.X
    
  2. carthage update を実行します。

  3. アプリケーション ターゲットの [全般 設定] タブを開きます。 AppCenterDistribute.framework ファイルを Carthage/Build/iOS フォルダーから XCode の [リンクされたフレームワークとライブラリ ] セクションにドラッグ アンド ドロップします。

  4. AppCenterDistributeResources.bundleAppCenterDistribute.framework から XCode のプロジェクト ナビゲーターにドラッグ アンド ドロップします。

  5. ダイアログが表示され、アプリのターゲットがオンになっていることを確認します。 [完了] をクリックします。

Swift パッケージ マネージャーを使用した統合

  1. Xcode メニューから、[ ファイル] > [Swift パッケージ] > [パッケージ依存関係の追加] をクリックします。
  2. 表示されたダイアログで、リポジトリ URL https://github.com/microsoft/appcenter-sdk-apple.gitを入力します。
  3. [ バージョン] で、[ 次のメジャーまで ] を選択し、既定のオプションを選択します。
  4. [パッケージ製品] 列で AppCenterDistribute を選択します。

バイナリをプロジェクトにコピーして統合する

Cocoapods を使用しない場合は、バイナリをプロジェクトにコピーしてモジュールを統合できます。 次の手順に従います。

App Center SDK では、 XCframeworkの使用がサポートされています。 XCframeworks をプロジェクトに統合する場合は、リリース ページから AppCenter-SDK-Apple-XCFramework.zip をダウンロードして解凍します。 結果のフォルダーの内容はプラットフォーム固有ではなく、モジュールごとに XCframeworks が含まれます。 これらは、以下で説明するように、通常のフレームワークと同じ方法で統合できます。

  1. zip ファイルとして提供されている App Center SDK フレームワークをダウンロードします。

  2. ファイルを解凍すると、App Center サービスごとに異なるフレームワークを含む AppCenter-SDK-Apple/iOS という名前のフォルダーが表示されます。 AppCenterというフレームワークは、異なるモジュール間で共有されるコードを含むプロジェクトで必要です。

  3. [省略可能]サード パーティ製ライブラリのサブディレクトリを作成します。

    • ベスト プラクティスとして、サード パーティ製ライブラリは通常、サブディレクトリ内にあり、多くの場合、 Vendor と呼ばれます。 プロジェクトがライブラリのサブディレクトリで編成されていない場合は、ここで Vendor サブディレクトリを作成します。
    • Xcode プロジェクト内に Vendor というグループを作成して、ディスク上のファイル構造を模倣します。
  4. Finder を開き、解凍した AppCenter-SDK-Apple/iOS フォルダーを目的の場所にあるプロジェクトのフォルダーにコピーします。

  5. Xcode のプロジェクトに SDK フレームワークを追加します。

    • プロジェクト ナビゲーターが表示されていることを確認します (⌘+1)。
    • ここで、Finder (Vendor フォルダー内のもの) から Xcode のプロジェクト ナビゲーターに AppCenter.frameworkAppCenterDistribute.frameworkAppCenterDistributeResources.bundle をドラッグ アンド ドロップします。 SDK を起動するには、AppCenter.framework が必要です。 プロジェクトに追加されていることを確認します。そうでない場合は、他のモジュールが機能せず、プロジェクトが正常にコンパイルされません。
    • ダイアログが表示され、アプリのターゲットがオンになっていることを確認します。 [完了] をクリックします。

2. App Center の配布を開始する

App Center では、アプリケーションで呼び出す特定のモジュールのみが使用されます。 SDK を起動するときは、それぞれを明示的に呼び出す必要があります。

2.1 App Center Distribute のインポートを追加する

プロジェクトの AppDelegate.m ファイルを Swift の Objective-C または AppDelegate.swift ファイルで開き、次の import ステートメントを追加します。

@import AppCenter;
@import AppCenterDistribute;
import AppCenter
import AppCenterDistribute

2.2 start:withServices: メソッドを追加する

Distributestart:withServices: メソッドに追加して、App Center Distribute サービスを開始します。

次の行を挿入して、didFinishLaunchingWithOptions メソッドのプロジェクトの AppDelegate.m クラス (Objective-C の場合は AppDelegate.swift クラス、Swift の場合は AppDelegate.swift クラス) で SDK を開始します。

[MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACDistribute class]]];
AppCenter.start(withAppSecret: "{Your App Secret}", services: [Distribute.self])

上記のコード サンプルの {Your App Secret} をアプリ シークレットに置き換えたかどうかを確認します。 アプリケーションで SDK を構成していない場合は、「 はじめ に」セクションも確認してください。

2.3 プロジェクトの Info.plist を変更する

  1. プロジェクトの Info.plist ファイルで、上部の [情報プロパティ リスト] の横にある [+] ボタンをクリックして、 URL types の新しいキーを追加します。 Xcode で Info.plist がソース コードとして表示される場合は、以下のヒントを参照してください。
  2. キーの種類を Array に変更します。
  3. 配列 (Item 0) に新しいエントリを追加し、型を Dictionary に変更します。
  4. Item 0で、URL Schemes キーを追加し、型を Array に変更します。
  5. URL Schemes キーの下に新しいエントリ (Item 0) を追加します。
  6. [ URL Schemes>Item 0] で値を [ 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>

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

既定では、配布ではパブリック配布グループが使用されます。 プライベート配布グループを使用する場合は、 updateTrack プロパティを使用して明示的に設定する必要があります。

MSACDistribute.updateTrack = MSACUpdateTrackPrivate;
Distribute.updateTrack = .private

既定値は UpdateTrack.public です。 このプロパティは、 AppCenter.start メソッド呼び出しの前にのみ更新できます。 更新トラックへの変更は、アプリケーション プロセスの再起動時には保持されないため、 AppCenter.start 呼び出しの前にプロパティが常に更新されない場合、既定ではパブリックになります。

この呼び出しの後、ブラウザー ウィンドウが開き、ユーザーが認証されます。 以降のすべての更新チェックでは、プライベート トラックの最新リリースが取得されます。

ユーザーが プライベート トラックにいる場合は、認証が成功した後、メンバーになっているすべてのプライベート配布グループから最新のリリースが取得されることを意味します。 ユーザーが パブリック トラックに乗っている場合は、すべてのパブリック配布グループから最新のリリースを取得することを意味します。

更新プログラムの自動チェックを無効にする

既定では、SDK は新しいリリースを自動的にチェックします。

  • アプリケーションの起動時。
  • アプリケーションがバックグラウンドに入ると、フォアグラウンドで再び実行されます。
  • 以前に無効にされている場合は、配布モジュールを有効にする場合。

新しいリリースを手動で確認する場合は、更新プログラムの自動チェックを無効にすることができます。 これを行うには、SDK の開始前に次のメソッドを呼び出します。

[MSACDistribute disableAutomaticCheckForUpdate];
Distribute.disableAutomaticCheckForUpdate()

このメソッドは、 AppCenter.start メソッド呼び出しの前に呼び出す必要があります。

その後、次のセクションで説明する checkForUpdate API を使用できます。

更新プログラムを手動で確認する

[MSACDistribute checkForUpdate];
Distribute.checkForUpdate()

これにより、新しいリリースが利用可能な場合に備えて、App Center に要求が送信され、更新ダイアログが表示されます。

自動更新が有効になっている場合でも、更新呼び出しの手動チェックが機能します。 別のチェックが既に行われている場合、更新プログラムの手動チェックは無視されます。 ユーザーが更新プログラムを延期した場合(最新バージョンが必須の更新プログラムでない限り)、更新プログラムの手動チェックは処理されません。

アプリ内更新ダイアログをカスタマイズまたはローカライズする

1. テキストをカスタマイズまたはローカライズする

更新ダイアログに表示されるテキストをローカライズする場合は、独自のリソース文字列を簡単に指定できます。 この文字列ファイルを見てください。 同じ文字列名/キーを使用し、独自のアプリ文字列ファイルのダイアログに反映されるローカライズされた値を指定します。

2. 更新ダイアログをカスタマイズする

DistributeDelegate プロトコルを実装することで、既定の更新ダイアログの外観をカスタマイズできます。 次の例に示すように、SDK を開始する前にデリゲートを登録する必要があります。

[MSACDistribute setDelegate:self];
Distribute.delegate = self;

SDK ダイアログをカスタムダイアログに置き換えるデリゲート実装の例を次に示します。

- (BOOL)distribute:(MSACDistribute *)distribute releaseAvailableWithDetails:(MSACReleaseDetails *)details {

  // Your code to present your UI to the user, e.g. an UIAlertController.
  UIAlertController *alertController = [UIAlertController
      alertControllerWithTitle:@"Update available."
                       message:@"Do you want to update?"
                preferredStyle:UIAlertControllerStyleAlert];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Update"
                                         style:UIAlertActionStyleCancel
                                       handler:^(UIAlertAction *action) {
                                         [MSACDistribute notifyUpdateAction:MSACUpdateActionUpdate];
                                       }]];

  [alertController
      addAction:[UIAlertAction actionWithTitle:@"Postpone"
                                         style:UIAlertActionStyleDefault
                                       handler:^(UIAlertAction *action) {
                                         [MSACDistribute notifyUpdateAction:MSACUpdateActionPostpone];
                                       }]];

  // Show the alert controller.
  [self.window.rootViewController presentViewController:alertController animated:YES completion:nil];
  return YES;
}
func distribute(_ distribute: Distribute, releaseAvailableWith details: ReleaseDetails) -> Bool {

  // Your code to present your UI to the user, e.g. an UIAlertController.
  let alertController = UIAlertController(title: "Update available.",
                                        message: "Do you want to update?",
                                 preferredStyle:.alert)

  alertController.addAction(UIAlertAction(title: "Update", style: .cancel) {_ in
    Distribute.notify(.update)
  })

  alertController.addAction(UIAlertAction(title: "Postpone", style: .default) {_ in
    Distribute.notify(.postpone)
  })

  // Show the alert controller.
  self.window?.rootViewController?.present(alertController, animated: true)
  return true;
}

上記のメソッドで YES/true を返した場合、アプリはユーザーの選択を取得し、次の API を使用して結果を SDK にメッセージする必要があります。

// Depending on the user's choice, call notifyUpdateAction: with the right value.
[MSACDistribute notifyUpdateAction:MSACUpdateActionUpdate];
[MSACDistribute notifyUpdateAction:MSACUpdateActionPostpone];
// Depending on the user's choice, call notify() with the right value.
Distribute.notify(.update);
Distribute.notify(.postpone);

上記のメソッドを呼び出さない場合、アプリがフォアグラウンドに入るたびに、 releaseAvailableWithDetails: メソッドが繰り返されます。

3. 更新プログラムが見つからない場合はコードを実行する

SDK が更新プログラムをチェックし、現在使用されている更新プログラムよりも新しい更新プログラムが見つからない場合は、デリゲート コールバックからのdistributeNoReleaseAvailable:MSACDistributeDelegate呼び出されます。 これにより、このようなシナリオでカスタム コードを実行できます。

更新プログラムが見つからないときにアラート UI を表示する方法を示す例を次に示します。

- (void)distributeNoReleaseAvailable:(MSACDistribute *)distribute {
  UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
                                                                 message:NSLocalizedString(@"No updates available", nil)
                                                          preferredStyle:UIAlertControllerStyleAlert];
  [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleDefault handler:nil]];
  [self.window.rootViewController presentViewController:alert animated:YES completion:nil];
}
  func distributeNoReleaseAvailable(_ distribute: Distribute) {
    let alert = UIAlertController(title: nil, message: "No updates available", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
    self.window?.rootViewController?.present(alert, animated: true)
  }

実行時に App Center の配布を有効または無効にする

実行時に App Center の配布を有効または無効にすることができます。 無効にした場合、SDK はアプリ内更新機能を提供しませんが、App Center ポータルでサービスの配布を引き続き使用できます。

[MSACDistribute setEnabled:NO];
Distribute.enabled = false

App Center Distribute を再度有効にするには、同じ API を使用しますが、パラメーターとして YES/true を渡します。

[MSACDistribute setEnabled:YES];
Distribute.enabled = true

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

このメソッドは、 Distribute が開始された後にのみ使用する必要があります。

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

App Center Distribute が有効になっているかどうかを確認することもできます。

BOOL enabled = [MSACDistribute isEnabled];
var enabled = Distribute.enabled

このメソッドは、 Distribute が開始された後にのみ使用する必要があり、常に開始前に false 返されます。

開発中に App Center Distribute を初期化しない

プライベート モードの場合、App Center Distribute はアプリケーションの起動時に UI/ブラウザーを開きます。 これはエンド ユーザーにとって予期される動作ですが、アプリケーションの開発段階で混乱を招く可能性があります。 DEBUGの構成でDistributeを初期化することはお勧めしません。

#if DEBUG
    [MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACAnalytics class], [MSACCrashes class]]];
#else
    [MSACAppCenter start:@"{Your App Secret}" withServices:@[[MSACAnalytics class], [MSACCrashes class], [MSACDistribute class]]];
#endif
#if DEBUG
    AppCenter.start(withAppSecret: "{Your App Secret}", services: [Analytics.self, Crashes.self])
#else
    AppCenter.start(withAppSecret: "{Your App Secret}", services: [Analytics.self, Crashes.self, Distribute.self])
#endif

アプリケーションが更新のために閉じる直前にクリーンアップを実行する

次の例に示すように、 DistributeDelegate プロトコルを実装し、デリゲートを登録します。

[MSACDistribute setDelegate:self];
Distribute.delegate = self;

distributeWillExitApp: デリゲート メソッドは、更新プログラムのインストールでアプリが終了する直前に呼び出されます。

- (void)distributeWillExitApp:(MSACDistribute *)distribute {
  // Perform the required clean up here.
}
func distributeWillExitApp(_ distribute: Distribute) {
  // Perform the required clean up here.
}

アプリ内更新のしくみ

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

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

  1. この機能は、 App Center Distribute サービスを使用して配布されるビルドでのみ機能します。 デバッガーがアタッチされている場合、または iOS ガイド付きアクセス機能が有効になっている場合は機能しません。

  2. SDK を統合し、アプリのリリース バージョンをビルドして App Center にアップロードすると、その配布グループ内のユーザーに電子メールで新しいリリースの通知が送信されます。

  3. 各ユーザーがメールでリンクを開くと、アプリケーションがデバイスにインストールされます。 電子メール リンクを使用してアプリをインストールすることが重要です。App Center Distribute では、他のソースからインストールされたアプリ (電子メールの添付ファイルからアプリをダウンロードするなど) のアプリ内更新プログラムはサポートされません。 アプリケーションがリンクからダウンロードされると、SDK は後で更新プログラムを確認するために Cookie から重要な情報を保存します。それ以外の場合、SDK にはその重要な情報がありません。

  4. アプリケーションがトラックをプライベートに設定すると、ブラウザーが開いてユーザーを認証し、アプリ内更新を有効にします。 パブリック トラックに戻り、後で再度プライベートに戻っても、認証情報が有効なままである限り、ブラウザーは再び開きません。 ブラウザー認証が成功すると、ユーザーは自動的にアプリケーションにリダイレクトされます。 トラックがパブリック (既定) の場合は、次の手順が直接実行されます。

    • iOS 9 および 10 では、 SFSafariViewController のインスタンスがアプリ内で開き、ユーザーを認証します。 認証が成功すると、自動的に閉じられます。
    • iOS 11 では、ユーザー エクスペリエンスは iOS 9 と 10 に似ていますが、iOS 11 はログイン情報にアクセスするためのアクセス許可をユーザーに求めます。 これはシステム レベルのダイアログであり、カスタマイズすることはできません。 ユーザーがダイアログをキャンセルした場合、テストしているバージョンを引き続き使用できますが、アプリ内更新プログラムは取得されません。 次回アプリを起動すると、ログイン情報に再度アクセスするように求められます。
  5. アプリの新しいリリースでは、アプリ内更新ダイアログが表示され、次の場合にアプリケーションを更新するようユーザーに求められます。

    • より高い値の CFBundleShortVersionString または
    • CFBundleShortVersionStringの値が等しいが、CFBundleVersionの値が大きい。
    • バージョンは同じですが、ビルドの一意の識別子が異なります。

ヒント

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

アプリ内更新プログラムをテストする方法

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

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

ヒント

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

アプリケーション デリゲートのメソッド呼び出しの App Center サービスへの転送を無効にする

App Center SDK では、スウィズリングを使用して、アプリケーション デリゲートのメソッド呼び出しの一部を転送することで統合を改善します。 メソッド スウィズリングは、実行時にメソッドの実装を変更する方法です。 何らかの理由でスウィズリングを使用したくない場合 (たとえば、特定のポリシーのため) は、次の手順に従って、すべての App Center サービスでこの転送を無効にすることができます。

  1. プロジェクトの Info.plist ファイルを開きます。
  2. キー AppCenterAppDelegateForwarderEnabled 追加し、値を 0 に設定します。 これにより、すべての App Center サービスのアプリケーション デリゲート転送が無効になります。
  3. プロジェクトのAppDelegate ファイルにopenURLコールバックを追加します。
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

  // Pass the url to MSACDistribute.
  return [MSACDistribute openURL:url];
}
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

  // Pass the URL to App Center Distribute.
  return Distribute.open(url)
}