Прочитать на английском

Поделиться через


Распространение в Центре приложений — обновления в приложении iOS

Важно!

Прекращение поддержки Центра приложений Visual Studio запланировано на 31 марта 2025 г. Хотя вы можете продолжать использовать Центр приложений Visual Studio, пока он не будет полностью выведен из эксплуатации, существует несколько рекомендуемых вариантов, на которые вы можете рассмотреть возможность миграции.

Узнайте больше о сроках поддержки и альтернативных вариантах.

Распространение в Центре приложений позволит пользователям установить новую версию приложения при распространении через Центр приложений. При наличии новой версии приложения пакет SDK предоставит пользователям диалоговое окно обновления, чтобы скачать или отложить новую версию. После обновления пакет SDK начнет обновлять приложение.

Примечание

При использовании обновлений из приложения следует учитывать несколько моментов.

  1. Если вы выпустили приложение в App Store, обновления из приложения будут отключены.
  2. Если вы запускаете автоматические тесты пользовательского интерфейса, включенные обновления в приложении заблокируют автоматические тесты пользовательского интерфейса, так как они будут пытаться пройти проверку подлинности в серверной части Центра приложений. Рекомендуется не включать распространение в Центре приложений для целевого объекта теста пользовательского интерфейса.

Примечание

4.0.0 В версии Центра приложений были введены критические изменения. Чтобы перенести Центр приложений с предыдущих версий, следуйте инструкциям в разделе Миграция в пакет SDK для Центра приложений 4.0.0 и более поздних версий.

Важно!

Пакет SDK центра приложений не поддерживает несколько оконных приложений, появившихся в iOS 13.

Добавление обновлений из приложения в приложение

Если вы не настроили пакет SDK в приложении, следуйте инструкциям в разделе Начало работы .

1. Добавление модуля распространения в Центре приложений

Пакет SDK центра приложений разработан с модульным подходом. Вам нужно интегрировать только модули интересующих вас служб.

Интеграция с помощью Cocoapods

Если вы интегрируете Центр приложений в приложение с помощью Cocoapods, добавьте в файл podfile следующую зависимость и запустите pod install.

pod 'AppCenter/Distribute'

Интеграция с помощью Carthage

  1. Добавьте в свою Cartfile зависимость следующую, чтобы включить распространение в Центре приложений.

    # 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 в раздел Linked Frameworks and Libraries в XCode.

  4. Перетащите AppCenterDistributeResources.bundle из AppCenterDistribute.framework в навигатор проектов XCode.

  5. Появится диалоговое окно, убедитесь, что установлен флажок целевого объекта приложения. Нажмите кнопку Готово.

Интеграция с помощью диспетчера пакетов Swift

  1. В меню Xcode выберите файл Swift Packages > Add Package Dependency (Добавить > зависимость пакета).
  2. В появившемся диалоговом окне введите URL-адрес репозитория: https://github.com/microsoft/appcenter-sdk-apple.git.
  3. В разделе Версия выберите До следующего основного и выберите параметр по умолчанию.
  4. Выберите AppCenterDistribute в столбце Package Product (Продукт пакета ).

Интеграция путем копирования двоичных файлов в проект

Если вы не хотите использовать Cocoapods, можно интегрировать модули, скопировав двоичные файлы в проект. Выполните инструкции, описанные ниже.

Примечание

Пакет SDK центра приложений XCframeworkподдерживает использование . Если вы хотите интегрировать XCframeworks в проект, скачайте AppCenter-SDK-Apple-XCFramework.zip со страницы выпусков и распакуйте его. Результирующее содержимое папки не зависит от платформы, а содержит XCframeworks для каждого модуля. Их можно интегрировать так же, как и обычные платформы, как описано ниже.

  1. Скачайте платформы пакета SDK центра приложений , предоставляемые в виде ZIP-файла.

  2. Распакуйте файл, и вы увидите папку AppCenter-SDK-Apple/iOS , содержащую разные платформы для каждой службы Центра приложений. Вызываемая платформа AppCenter является обязательной в проекте, так как она содержит код, совместно используемый различными модулями.

  3. [Необязательно] Создайте подкаталог для сторонних библиотек.

    • Рекомендуется, чтобы сторонние библиотеки обычно находятся в подкаталоге, который часто называется Vendor. Если проект не упорядочен с подкаталогом для библиотек, создайте подкаталог Vendor .
    • Создайте группу с именем Vendor в проекте Xcode, чтобы имитировать структуру файлов на диске.
  4. Откройте Finder и скопируйте распакованную папку AppCenter-SDK-Apple/iOS в папку проекта в нужном расположении.

  5. Добавьте платформу SDK в проект в Xcode:

    • Убедитесь, что отображается навигатор проекта (⌘+1).
    • Теперь перетащите AppCenter.framework, AppCenterDistribute.framework и AppCenterDistributeResources.bundle из Finder (те, которые находятся в папке Vendor ) в навигатор проекта Xcode. Для запуска пакета SDK требуется AppCenter.framework. Убедитесь, что он добавлен в проект, в противном случае другие модули не будут работать, и проект не будет успешно скомпилирован.
    • Появится диалоговое окно, убедитесь, что установлен флажок целевого объекта приложения. Нажмите кнопку Готово.

2. Запуск распространения в Центре приложений

Центр приложений использует только те модули, которые вызываются в приложении. При запуске пакета SDK необходимо явно вызывать каждый из них.

2.1. Добавление импорта для распространения в Центре приложений

Откройте файл AppDelegate.m проекта в Objective-C или AppDelegate.swift в Swift и добавьте следующие инструкции импорта:

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

2.2 Добавление start:withServices: метода

Добавьте Distribute в метод start:withServices: , чтобы запустить службу распространения в Центре приложений.

Вставьте следующую строку, чтобы запустить пакет SDK в классе AppDelegate.m проекта для Objective-C или AppDelegate.swift для Swift в методе didFinishLaunchingWithOptions .

[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 , нажав кнопку "+" рядом с элементом "Information Property List" (Список свойств информации) вверху. Если Xcode отображает файл Info.plist в качестве исходного кода, см. совет ниже.
  2. Измените тип ключа на Массив.
  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>

Использование частной группы рассылки

По умолчанию Для распространения используется общедоступная группа рассылки. Если вы хотите использовать частную группу рассылки, необходимо явно задать ее с помощью updateTrack свойства .

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

Примечание

Значение по умолчанию — UpdateTrack.public. Это свойство можно обновить только перед вызовом AppCenter.start метода . Изменения в отслеживании обновления не сохраняются при перезапуске процесса приложения, поэтому, если свойство не всегда обновляется до AppCenter.start вызова, оно будет общедоступным по умолчанию.

После этого вызова откроется окно браузера для проверки подлинности пользователя. Все последующие проверки обновления будут получать последний выпуск в закрытой дорожке.

Если пользователь находится на закрытом пути, это означает, что после успешной проверки подлинности он получит последний выпуск из любых частных групп рассылки, в которые он входит. Если пользователь находится на общедоступной дорожке, это означает, что он получит последний выпуск из любой общедоступной группы рассылки.

Отключение автоматической проверки обновлений

По умолчанию пакет SDK автоматически проверяет наличие новых выпусков:

  • При запуске приложения.
  • Когда приложение переходит в фоновый режим, затем снова на переднем плане.
  • При включении модуля "Распространение", если он был отключен ранее.

Если вы хотите проверка для новых выпусков вручную, можно отключить автоматический проверка для обновления. Для этого вызовите следующий метод перед запуском пакета SDK:

[MSACDistribute disableAutomaticCheckForUpdate];
Distribute.disableAutomaticCheckForUpdate()

Примечание

Этот метод необходимо вызвать перед вызовом AppCenter.start метода .

Затем можно использовать API, checkForUpdate описанный в следующем разделе.

Проверка наличия обновлений вручную

[MSACDistribute checkForUpdate];
Distribute.checkForUpdate()

При этом отправляется запрос в Центр приложений и отображается диалоговое окно обновления на случай, если доступен новый выпуск.

Примечание

Ручной проверка для вызова обновления работает даже при включенном автоматическом обновлении. Если еще одна проверка уже выполняется, то проверка обновления игнорируется вручную. Ручная проверка обновления не будет обрабатываться, если пользователь отложил обновления (если только последняя версия не является обязательным обновлением).

Настройка или локализация диалогового окна обновления в приложении

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 в приведенном выше методе, ваше приложение должно получить выбор пользователя и предоставить пакет SDK с результатом с помощью следующего API.

// 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 делегата. Это позволяет выполнять пользовательский код в таких сценариях.

Ниже приведены примеры, в которых показано, как отображать пользовательский интерфейс оповещений при отсутствии обновлений.

- (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)
  }

Включение или отключение распространения в Центре приложений во время выполнения

Вы можете включить и отключить распространение в Центре приложений во время выполнения. Если отключить его, пакет SDK не будет предоставлять функции обновления в приложении, но вы по-прежнему можете использовать службу распространения на портале Центра приложений.

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

Чтобы снова включить распространение в Центре приложений, используйте тот же API, но передайте YES/true в качестве параметра.

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

Состояние сохраняется в хранилище устройства при запуске приложений.

Примечание

Этот метод следует использовать только после Distribute запуска.

Проверка включения распространения в Центре приложений

Вы также можете проверка, включено ли распространение в Центре приложений:

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

Примечание

Этот метод следует использовать только после Distribute запуска. Он всегда возвращается false перед запуском.

Не инициализировать распространение Центра приложений во время разработки

Если вы работаете в закрытом режиме, при запуске приложения откроется пользовательский интерфейс или браузер в Центре приложений. Хотя это ожидаемое поведение для конечных пользователей, оно может привести к нарушению работы на этапе разработки приложения. Мы не рекомендуем инициализировать 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.
}

Как работают обновления из приложения?

Примечание

Чтобы обновления из приложения работали, сборку приложения следует скачать по ссылке. Он не будет работать, если установлен из интегрированной среды разработки или вручную.

Функция обновлений в приложении работает следующим образом:

  1. Эта функция будет работать ТОЛЬКО со сборками, которые распространяются с помощью службы распространения в Центре приложений . Он не будет работать, если подключен отладчик или включена функция интерактивного доступа iOS.

  2. После интеграции пакета SDK создайте версию выпуска приложения и отправьте ее в Центр приложений, пользователи в этой группе рассылки будут уведомлены о новом выпуске по электронной почте.

  3. Когда каждый пользователь открывает ссылку в своем сообщении электронной почты, приложение будет установлено на его устройстве. Важно, чтобы они использовали ссылку электронной почты для установки приложения . Центр приложений Распространение не поддерживает обновления в приложении для приложений, которые были установлены из других источников (например, скачивание приложения из вложения электронной почты). При скачивании приложения по ссылке пакет SDK сохраняет важные сведения из файлов cookie для проверка для последующего обновления, в противном случае пакет SDK не содержит этих сведений о ключах.

  4. Если приложение задает для дорожки закрытый режим, откроется браузер для проверки подлинности пользователя и включения обновлений из приложения. Браузер не будет открываться снова, пока сведения о проверке подлинности остаются действительными даже при переключении обратно на общедоступную дорожку и обратно в закрытый режим позже. Если проверка подлинности браузера прошла успешно, пользователь автоматически перенаправляется обратно в приложение. Если дорожка является общедоступной (по умолчанию), следующий шаг выполняется напрямую.

    • В iOS 9 и 10 экземпляр SFSafariViewController откроется в приложении для проверки подлинности пользователя. После успешной проверки подлинности он закроется автоматически.
    • В iOS 11 взаимодействие с пользователем аналогично iOS 9 и 10, но iOS 11 запрашивает у пользователя разрешение на доступ к данным для входа. Это диалоговое окно на уровне системы, и его нельзя настроить. Если пользователь отменит диалоговое окно, он может продолжать использовать тестируемую версию, но не получит обновления в приложении. При следующем запуске приложения им будет предложено снова получить доступ к данным для входа.
  5. В новом выпуске приложения отображается диалоговое окно обновления в приложении с запросом на обновление приложения, если оно:

    • более высокое значение или CFBundleShortVersionString
    • равное значение , CFBundleShortVersionString но более высокое значение CFBundleVersion.
    • версии одинаковы, но уникальный идентификатор сборки отличается.

Совет

При повторной отправке одного и того же IPA диалоговое окно НЕ будет отображаться, так как двоичные файлы идентичны. При отправке новой сборки с теми же свойствами версии отобразится диалоговое окно обновления. Причина заключается в том, что это другой двоичный файл.

Разделы справки тестировать обновления в приложении?

Необходимо отправить сборки выпусков (которые используют модуль Распространения пакета SDK центра приложений) на портал Центра приложений, чтобы тестировать обновления из приложения, увеличивая количество версий с каждым разом.

  1. Создайте приложение на портале Центра приложений, если вы еще этого не сделали.
  2. Создайте новую группу рассылки и присвойте ей имя, чтобы распознать, что она предназначена для тестирования функции обновления в приложении.
  3. Добавьте себя (или всех пользователей, которых вы хотите включить в тест функции обновления в приложении). Используйте для этого новый адрес электронной почты или адрес электронной почты, который не использовался для этого приложения в Центре приложений. Это гарантирует, что ваш опыт будет близок к опыту реальных тестировщиков.
  4. Создайте новую сборку приложения, которая включает распространение в Центре приложений и содержит логику установки, как описано ниже. Если группа является частной, не забудьте задать частную дорожку обновления в приложении перед началом использования свойства updateTrack.
  5. Нажмите кнопку Распространить новый выпуск на портале и отправьте сборку приложения.
  6. После завершения отправки нажмите кнопку Далее и выберите созданную группу рассылки в качестве назначения для этого дистрибутива приложения.
  7. Просмотрите раздел Распространение и распространите сборку в группе тестирования в приложении.
  8. Люди в этой группе получит приглашение стать тестировщиками приложения. Приняв приглашение, они могут скачать приложение с портала Центра приложений со своего мобильного устройства. После установки обновлений из приложения можно приступать к тестированию обновлений из приложения.
  9. Укажите имя версии (CFBundleShortVersionString) приложения.
  10. Создайте версию выпуска приложения и отправьте новую сборку приложения, как это было на предыдущем шаге, и передайте ее в созданную ранее группу рассылки . Участникам группы рассылки будет предложено ввести новую версию при следующем запуске приложения.

Совет

Ознакомьтесь со сведениями об использовании распространения в Центре приложений , чтобы получить более подробные сведения о группах рассылки и т. д. Несмотря на то, что можно использовать распространение Центра приложений для распространения новой версии приложения без добавления кода, добавление в код приложения распространения центра приложений приведет к более эффективному взаимодействию с тестировщиками и пользователями по мере того, как они получают возможность обновления в приложении.

Отключение переадресации вызовов методов делегата приложения в службы Центра приложений

Пакет SDK центра приложений использует swizzling для улучшения интеграции путем переадресации некоторых вызовов методов делегата приложения. Свертки методов — это способ изменения реализации методов во время выполнения. Если по какой-либо причине вы не хотите использовать swizzling (например, из-за определенной политики), вы можете отключить эту переадресацию для всех служб Центра приложений, выполнив следующие действия:

  1. Откройте файл Info.plist проекта.
  2. Добавьте AppCenterAppDelegateForwarderEnabled ключ и присвойте ей значение 0. Это отключает перенаправление делегатов приложений для всех служб Центра приложений.
  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)
}