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

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 中引進的 windows 應用程式。

將應用程式內更新新增至您的應用程式

如果您尚未在您的應用程式中設定 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 檔案從 Carthage/Build/iOS 資料夾拖放至 XCode 中的 [連結的架構 和程式庫 ] 區段。

  4. AppCenterDistributeResourcesAppCenterDistribute 拖曳至 XCode 的 Project Navigator。

  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 服務的不同 framework。 專案中需要呼叫的架構, AppCenter 因為它包含不同模組之間共用的程式碼。

  3. 參數建立協力廠商程式庫的子目錄。

    • 最佳做法是,協力廠商程式庫通常會在子目錄中,通常稱為「 廠商」。 如果您的專案未以程式庫的子目錄進行組織,請立即建立 廠商 子目錄。
    • 在您的 Xcode 專案內建立名為「 廠商 」的群組,以模仿磁片上的檔案結構。
  4. 開啟 Finder,然後將解壓縮的 AppCenter-SDK-Apple/iOS 資料夾複製到您的專案資料夾中您要的位置。

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

    • 確定 (⌘ + 1) 可以看見 Project 的導覽器。
    • 現在,請將 AppCenter 從 [工具組] 中的 []、[ AppCenterDistribute] 和 [ AppCenterDistributeResources ]) 拖曳 至 [Xcode 的 Project Navigator] (。 需要 AppCenter ,才能啟動 SDK。 請確定已將其新增至您的專案,否則其他模組將無法運作,而且您的專案將無法成功編譯。
    • 將會出現一個對話方塊,請確定已核取您的應用程式目標。 然後按一下 [ 完成]。

2. 啟動 App Center 散發

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

2.1 新增 App Center 散發的匯入

在 Swift 中開啟專案的 AppDelegate 檔案,或在 swift 中開啟 AppDelegate 檔案,並新增下列 import 語句:

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

2.2 新增 start:withServices: 方法

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

在專案的 AppDelegate 類別中插入下列程式程式碼,以在方法中針對 Swift 或 AppDelegate 的 swift 類別啟動 SDK。 didFinishLaunchingWithOptions

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

請確定您已 {Your App Secret} 在上述程式碼範例中,使用您的應用程式密碼來取代。 如果您尚未在您的應用程式中設定 SDK,請參閱 [ 開始 使用] 區段。

2.3 修改專案的 資訊。 plist

  1. 在專案的 plist 檔案中, URL types 按一下頂端的 [資訊屬性清單] 旁的 [+] 按鈕,以加入的新索引鍵。 如果 Xcode 以原始程式碼顯示 plist ,請參閱下面的秘訣。
  2. 將金鑰類型變更為陣列。
  3. 將新專案加入至陣列 (Item 0) ,並將類型變更為字典。
  4. Item 0 [加入] 索引 URL Schemes 鍵,然後將類型變更為 [陣列]。
  5. 在您的 URL Schemes 金鑰下,新增 () 的專案 Item 0
  6. 在底下 URL Schemes > Item 0 ,將值變更為, appcenter-{APP_SECRET} 並取代為 {APP_SECRET} 應用程式的應用程式密碼。

提示

如果您想要確認是否已正確修改 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 訊息給 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 會叫用 from 委派回呼。 這可讓您在這類案例中執行自訂程式碼。

以下範例示範如何在找不到更新時顯示警示 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 ,在開始之前,它一定會傳回 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 會使用 swizzling 來改善其整合,其方式是將應用程式委派的一些方法呼叫轉送至其中。 方法 swizzling 是在執行時間變更方法的執行方式。 如果基於任何原因而不想使用 swizzling (例如因為特定原則) ,您可以遵循下列步驟來停用所有 App Center 服務的轉送:

  1. 開啟專案的 plist 檔案。
  2. 加入索引 AppCenterAppDelegateForwarderEnabled 鍵,並將值設定為 0 。 這會停用所有 App Center 服務的應用程式委派轉送。
  3. openURL在專案的檔案中新增回呼 AppDelegate
- (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)
}