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

重要

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

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

App Center 散發套件可讓您的使用者透過 App Center 發佈應用程式時,安裝新版本的應用程式。 當有新版本的應用程式可用時,SDK 會向用戶顯示更新對話框,以下載或延後新版本。 一旦他們選擇更新,SDK 就會開始更新您的應用程式。

注意

使用應用程式內更新時,需要考慮一些事項:

  1. 如果您已在 App Store 中發行您的應用程式,將會停用應用程式內更新。
  2. 如果您執行自動化 UI 測試,啟用的應用程式內更新將會封鎖自動化 UI 測試,因為它們會嘗試向 App Center 後端進行驗證。 建議您不要為您的UI測試目標啟用App Center散發。

注意

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 整合到應用程式,請將下列相依性新增至 Podfile 並執行 pod install

pod 'AppCenter/Distribute'

透過 Carthage 整合

  1. 將下列相依性新增至您的 Cartfile ,以包含App Center散發。

    # 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. 將檔案解壓縮,您會看到名為 AppCenter-SDK-Apple/iOS 的資料夾,其中包含每個 App Center 服務的不同架構。 專案中需要呼叫 AppCenter 的架構,因為它包含在不同模組之間共用的程序代碼。

  3. [選擇性]建立第三方連結庫的子目錄。

    • 最佳做法是,第三方連結庫通常位於子目錄中,通常稱為 Vendor。 如果您的專案未使用連結庫的子目錄進行組織,請立即建立 Vendor 子目錄。
    • 在 Xcode 專案內建立名為 Vendor 的群組,以模擬磁碟上的檔案結構。
  4. 開啟 Finder,並將解壓縮的 AppCenter-SDK-Apple/iOS 資料夾複製到您想要位置的項目資料夾。

  5. 將 SDK 架構新增至 Xcode 中的專案:

    • 請確定項目導覽器在 ⌘+1) (可見。
    • 現在,從 Finder 將 AppCenter.frameworkAppCenterDistribute.frameworkAppCenterDistributeResources.bundle 拖放 (Vendor 資料夾內的 AppCenter.framework) 到 Xcode 的專案導覽器中。 需要 AppCenter.framework 才能啟動 SDK。 請確定它已新增至您的專案,否則其他模組將無法運作,而且您的專案不會成功編譯。
    • 對話框隨即出現,請確定已核取您的應用程式目標。 然後按一下 [ 完成]。

2.啟動App Center發佈

App Center 只會使用您在應用程式中叫用的特定模組。 在啟動 SDK 時,您必須明確呼叫每一個。

2.1 新增 App Center 散發的匯入

在 Objective-C 或 Swift 的 AppDelegate.swift 檔案中開啟專案的 AppDelegate.m 檔案,並新增下列匯入語句:

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

2.2 新增 start:withServices: 方法

將 新增 Distribute 至您的 start:withServices: 方法,以啟動App Center散發服務。

插入下列程式代碼行,以在 方法中didFinishLaunchingWithOptions針對 Objective-C 的 AppDelegate.m 類別或 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 0URL 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:-method 都會重複。

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散發,請使用相同的API,但傳遞 YES/true 為參數。

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

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

注意

只有在啟動之後 Distribute ,才能使用這個方法。

檢查 App Center 散發是否已啟用

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

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

注意

這個方法只能在啟動之後 Distribute 使用,它一律會在 start 之前傳回 false

請勿在開發期間初始化 App Center 散發

如果處於私人模式,App Center 散發會在應用程式啟動時開啟其UI/瀏覽器。 雖然這是使用者的預期行為,但可能會在應用程式的開發階段對您造成干擾。 不建議初始化 Distribute 您的 DEBUG 設定。

#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散發 服務所散發的組建。 當調試程式附加或 iOS 引導式存取功能開啟時,將無法運作。

  2. 整合 SDK 之後,請建置應用程式的發行版本,並將其上傳至 App Center,該通訊群組中的使用者將會透過電子郵件收到新版本的通知。

  3. 當使用者在其電子郵件中開啟連結時,應用程式將會安裝在其裝置上。 請務必使用電子郵件連結來安裝應用程式 - App Center 散發不支援從其他來源安裝的應用程式更新 (例如,從電子郵件附件下載應用程式) 。 從鏈接下載應用程式時,SDK 會儲存 Cookie 中的重要資訊,以供稍後檢查更新,否則 SDK 沒有該密鑰資訊。

  4. 如果應用程式將追蹤設定為私人,瀏覽器將會開啟以驗證使用者並啟用應用程式內更新。 只要驗證信息維持有效狀態,即使切換回公用追蹤,稍後仍不會再次開啟瀏覽器。 如果瀏覽器驗證成功,用戶會自動重新導向回應用程式。 如果追蹤是公用 (,這是預設) ,則下一個步驟會直接發生。

    • 在 iOS 9 和 10 上,的 SFSafariViewController 實體會在應用程式內開啟,以驗證使用者。 驗證成功之後,它會自動關閉本身。
    • 在 iOS 11 上,用戶體驗類似於 iOS 9 和 10,但 iOS 11 會要求使用者有權存取登入資訊。 這是系統層級對話框,無法加以自定義。 如果使用者取消對話框,他們可以繼續使用其正在測試的版本,但不會取得應用程式內更新。 下次啟動應用程式時,系統會要求他們再次存取登入資訊。
  5. 應用程式的新版本會顯示應用程式內更新對話方塊,要求使用者更新您的應用程式是否為:

    • 或的值 CFBundleShortVersionString 較高
    • CFBundleShortVersionString 相等值,但的值 CFBundleVersion較高。
    • 版本相同,但組建唯一標識符不同。

提示

如果您第二次上傳相同的 ipa, 對話框將不會顯示為 二進位檔相同。 如果您上傳具有相同版本屬性 的新 組建,則會顯示更新對話方塊。 這是因為它是 不同的 二進位檔。

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

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

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

提示

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

停用對 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)
}