共用方式為


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

這很重要

Visual Studio App Center 於 2025 年 3 月 31 日淘汰,但分析和診斷功能除外,這些功能將持續支援到 2026 年 6 月 30 日。 瞭解更多資訊。

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

備註

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

  1. 如果您已在 App Store 中發行您的應用程式,將會停用應用程式內更新。
  2. 如果您正在執行自動化UI測試,啟用的應用程式內更新將會封鎖您的自動化UI測試,因為它們會嘗試對App Center後端進行驗證。 建議您不要為 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 整合到應用程式,請將下列相依性新增至 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,並將它解壓縮。 產生的資料夾內容不是針對特定平臺,而是包含每個模組的 XCframework。 它們可以和一般架構一樣整合,如下所述。

  1. 下載以 zip 檔案的形式提供的 App Center SDK 架構。

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

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

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

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

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

2.啟動 App Center 發佈

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

2.1 新增對 App Center Distribute 的引入

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

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

2.2 新增 start:withServices: 方法

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

在方法中插入下列程式代碼行,以在專案的 AppDelegate.m 類別中,針對 Objective-C 或適用於 Swift 的 AppDelegate.swift 類別啟動 didFinishLaunchingWithOptions 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 鍵值,並將類型變更為陣列。
  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>

使用私人發佈群組

根據預設,Distribute 會使用公開散發群組。 如果您想要使用私人通訊群組,您必須透過 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 發佈是否啟用:

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

備註

這個方法只能在 Distribute 已啟動後使用,開始之前它總是會傳回 false

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

如果處於私人模式,App Center Distribute 會在應用程式啟動時開啟其 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 Distribute 服務所發佈的版本。 附加調試程式或開啟 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 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)
}