Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Центр приложений Visual Studio был прекращен 31 марта 2025 г., за исключением функций аналитики и диагностики, которые будут поддерживаться до 30 июня 2026 г. Подробнее.
Распространение в Центре приложений позволит пользователям устанавливать новую версию приложения при его распространении через Центр приложений. При наличии новой версии приложения пакет SDK предоставит пользователям диалоговое окно обновления, чтобы скачать или отложить новую версию. Когда они решат обновить, пакет SDK начнет обновлять ваше приложение.
Замечание
При использовании обновлений в приложении следует учитывать несколько действий.
- Если вы выпустили приложение в App Store, обновления в приложении будут отключены.
- Если вы выполняете автоматические тесты пользовательского интерфейса, включено обновление в приложении блокирует автоматические тесты пользовательского интерфейса, так как они будут пытаться пройти проверку подлинности в серверной части Центра приложений. Рекомендуется не включать функцию распространения в App Center для цели тестирования интерфейса.
Замечание
В версии 4.0.0
Центра приложений были введены критические изменения. Ознакомьтесь с разделом Миграция на SDK App Center 4.0.0 и выше для переноса Центра приложений с предыдущих версий.
Это важно
Пакет SDK центра приложений не поддерживает несколько приложений окон, появившихся в iOS 13.
Добавление обновлений приложения в приложение
Следуйте разделу "Начало работы ", если вы не настроили пакет SDK в приложении.
1. Добавление модуля распространения Центра приложений
Пакет SDK для Центра приложений разработан с модульным подходом. Необходимо интегрировать только модули интересующих вас служб.
Интеграция с помощью Cocoapods
Если вы интегрируете App Center в своё приложение с помощью CocoaPods, добавьте следующую зависимость в podfile и выполните команду pod install
.
pod 'AppCenter/Distribute'
Интеграция через Картадж
Добавьте следующую зависимость в
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
Выполните
carthage update
.Откройте вкладку "Общие параметры" целевого приложения. Перетащите файл AppCenterDistribute.framework из папки Carthage/Build/iOS в раздел "Связанные платформы и библиотеки " в XCode.
Перетащите AppCenterDistributeResources.bundle из AppCenterDistribute.framework в навигатор проекта XCode.
Откроется диалоговое окно, убедитесь, что выбран целевой объект вашего приложения. Затем нажмите кнопку "Готово".
Интеграция с помощью диспетчера пакетов Swift
- В меню Xcode выберите пункт "Файл > Swift Package > Add Package Dependency" (Добавить зависимость пакета).
- В появившемся диалоговом окне введите URL-адрес репозитория:
https://github.com/microsoft/appcenter-sdk-apple.git
- В версии нажмите кнопку "Далее основной" и выберите параметр по умолчанию.
- Выберите AppCenterDistribute в столбце "Продукт пакета ".
Интеграция путем копирования двоичных файлов в проект
Если вы не хотите использовать Cocoapods, вы можете интегрировать модули, скопировав двоичные файлы в проект. Выполните следующие действия.
Замечание
Пакет SDK для Центра приложений XCframework
поддерживает использование . Если вы хотите интегрировать XCframeworks в проект, скачайте AppCenter-SDK-Apple-XCFramework.zip на странице выпусков и распакуйте его. Результирующее содержимое папки не зависит от платформы, а содержит XCframeworks для каждого модуля. Они могут быть интегрированы так же, как и обычные платформы, как описано ниже.
Скачайте платформы ПАКЕТА SDK Центра приложений , предоставляемые в виде ZIP-файла.
Распакуйте файл и увидите папку AppCenter-SDK-Apple/iOS , содержащую разные платформы для каждой службы Центра приложений. Вызываемая платформа
AppCenter
требуется в проекте, так как она содержит код, общий доступ между различными модулями.[Необязательно] Создайте подкаталог для сторонних библиотек.
- Как рекомендуется, сторонние библиотеки обычно находятся внутри подкаталога, часто называемого Vendor. Если проект не упорядочен с подкаталогом библиотек, создайте подкаталог поставщика .
- Создайте группу с именем Vendor внутри проекта Xcode, чтобы имитировать структуру файлов на диске.
Откройте Finder и скопируйте распакованную папку AppCenter-SDK-Apple/iOS в папку проекта в нужном месте.
Добавьте платформу SDK в проект в Xcode:
- Убедитесь, что навигатор проекта отображается ([+1]).
- Теперь перетащите AppCenter.framework, AppCenterDistribute.framework и AppCenterDistributeResources.bundle из Finder (те, которые находятся в папке поставщика ), в навигатор проекта Xcode. Для запуска пакета SDK требуется AppCenter.framework. Убедитесь, что он добавлен в проект, в противном случае другие модули не будут работать, и проект не будет успешно скомпилирован.
- Откроется диалоговое окно, убедитесь, что выбран целевой объект вашего приложения. Затем нажмите кнопку "Готово".
2. Запустите функцию Distribute в App Center
Центр приложений использует только определенные модули, которые вы вызываете в приложении. При запуске пакета SDK необходимо явно вызвать каждый из них.
2.1. Добавьте импорт для App Center Distribute
Откройте файл AppDelegate.m проекта в файле Objective-C или AppDelegate.swift и добавьте следующие инструкции импорта:
@import AppCenter;
@import AppCenterDistribute;
import AppCenter
import AppCenterDistribute
2.2. Добавление start:withServices:
метода
Добавьте Distribute
в метод start:withServices:
, чтобы запустить службу Distribute App Center.
Вставьте следующую строку, чтобы запустить 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 проекта
- В файле Info.plist проекта добавьте новый ключ
URL types
, нажав кнопку "+" рядом с элементом "Список свойств сведений" в верхней части. Если Xcode отображает info.plist в качестве исходного кода, обратитесь к приведенным ниже подсказкам. - Измените тип ключа на Array.
- Добавьте новую запись в массив (
Item 0
) и измените тип на словарь. - В разделе
Item 0
добавьте ключURL Schemes
и измените тип на массив. - Под вашим ключом
URL Schemes
добавьте новую запись (Item 0
). - В разделе
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
метода.
Затем можно использовать 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)
}
Включить или отключить App Center Distribute в режиме выполнения
Вы можете включить и отключить App Center Distribute во время выполнения. Если отключить его, пакет SDK не будет предоставлять функции обновления в приложении, но вы по-прежнему можете использовать службу распространения на портале Центра приложений.
[MSACDistribute setEnabled:NO];
Distribute.enabled = false
Чтобы снова включить функцию 'App Center Distribute', используйте тот же API и передайте YES
/true
в качестве параметра.
[MSACDistribute setEnabled:YES];
Distribute.enabled = true
Состояние сохраняется в хранилище устройства во время запуска приложения.
Замечание
Этот метод должен использоваться только после того, как Distribute
был запущен.
Проверьте, включен ли App Center Distribute
Вы также можете проверить, включена ли рассылка в Центре приложений:
BOOL enabled = [MSACDistribute isEnabled];
var enabled = Distribute.enabled
Замечание
Этот метод должен использоваться только после Distribute
запуска, он всегда будет возвращать false
до запуска.
Не инициализировать App Center Distribute во время разработки.
В режиме инкогнито, Центр приложений Distribute откроет свой интерфейс или браузер при запуске приложения. Хотя это ожидаемое поведение для конечных пользователей, это может быть разрушительным для вас на этапе разработки приложения. Мы не рекомендуем инициализировать 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.
}
Как работают обновления в приложении?
Замечание
Чтобы обновления в приложении работали, сборка приложения должна быть загружена по ссылке. Он не будет работать, если он установлен из интегрированной среды разработки или вручную.
Функция обновления в приложении работает следующим образом:
Эта функция будет работать ТОЛЬКО с сборками, распределенными с помощью службы распространения Центра приложений . Он не будет работать, если отладчик подключен или включена функция интерактивного доступа iOS.
После интеграции пакета SDK создайте версию выпуска приложения и отправьте ее в Центр приложений, пользователи в этой группе рассылки будут получать уведомления о новом выпуске по электронной почте.
Когда каждый пользователь открывает ссылку по электронной почте, приложение будет установлено на своем устройстве. Важно, чтобы они использовали ссылку электронной почты для установки приложения . Центр приложений распространяет не поддерживает обновления в приложении для приложений, установленных из других источников (например, скачивание приложения из вложения электронной почты). При скачивании приложения из ссылки пакет SDK сохраняет важные сведения из файлов cookie, чтобы проверить наличие обновлений позже, в противном случае пакет SDK не содержит эти ключевые сведения.
Если приложение устанавливает для отслеживания частный режим, браузер откроется для проверки подлинности пользователя и включения обновлений в приложении. Браузер не откроется снова, пока информация об аутентификации остается действительной, даже при возврате на общедоступный режим и позднее обратно на частный. Если проверка подлинности браузера выполнена успешно, пользователь перенаправляется обратно в приложение. Если трек является общедоступным (по умолчанию), следующий шаг происходит напрямую.
- В iOS 9 и 10 экземпляр
SFSafariViewController
откроется в приложении для проверки подлинности пользователя. После успешной проверки подлинности он автоматически закроется. - В iOS 11 взаимодействие с пользователем аналогично iOS 9 и 10, но iOS 11 попросит пользователя предоставить пользователю разрешение на доступ к данным для входа. Это диалоговое окно уровня системы, и его нельзя настроить. Если пользователь отменяет диалоговое окно, он может продолжать использовать версию, которую они тестируют, но не будут получать обновления в приложении. При следующем запуске приложения им будет предложено получить доступ к сведениям для входа.
- В iOS 9 и 10 экземпляр
В новом выпуске приложения отображается диалоговое окно обновления в приложении с просьбой пользователей обновить приложение, если это:
- более высокое значение
CFBundleShortVersionString
или - равное значение
CFBundleShortVersionString
, но более высокое значениеCFBundleVersion
. - версии одинаковы, но уникальный идентификатор сборки отличается.
- более высокое значение
Подсказка
Если вы загрузите тот же ipa файл второй раз, диалоговое окно НЕ появится, так как двоичные файлы идентичны. При отправке новой сборки с теми же свойствами версии откроется диалоговое окно обновления. Причина этого заключается в том, что это другой двоичный файл.
Как протестировать обновления в приложении?
Вам необходимо загрузить релизные сборки (использующие распространение App Center SDK) на портал Центра приложений для тестирования обновлений внутри приложения, увеличивая номера версий каждый раз.
- Создайте приложение на портале Центра приложений, если вы еще не сделали этого.
- Создайте новую группу рассылки и назовите ее, чтобы узнать, что она предназначена для тестирования функции обновления в приложении.
- Добавьте себя (или всех пользователей, которые вы хотите включить в тест функции обновления в приложении). Используйте новый или временный электронный адрес для этого, который не использовался с тем приложением в Центре приложений. Это гарантирует, что ваш опыт близок к опыту реальных тестировщиков.
- Создайте новую сборку приложения, включающую распространение в Центре приложений и содержащую логику установки, как описано ниже. Если группа является частной, не забудьте задать частную дорожку обновления в приложении перед началом использования свойства updateTrack.
- Нажмите кнопку "Распространить новый выпуск " на портале и отправьте сборку приложения.
- После завершения отправки нажмите кнопку "Далее " и выберите группу рассылки , созданную в качестве назначения распространения приложения.
- Просмотрите распределение и распределите сборку в группу тестирования в приложении.
- Пользователи в этой группе получат приглашение, чтобы быть тестировщиками приложения. После принятия приглашения приложение можно скачать на портале Центра приложений с мобильного устройства. После установки обновлений в приложении можно протестировать обновления в приложении.
- Повышайте номер версии (
CFBundleShortVersionString
) вашего приложения. - Создайте версию выпуска приложения и отправьте новую сборку приложения, как вы сделали на предыдущем шаге, и распределите ее в созданную ранее группу рассылки . Членам группы рассылки будет предложено ввести новую версию при следующем запуске приложения.
Подсказка
Ознакомьтесь с информацией о том, как использовать распространение в Центре приложений для получения более подробных сведений о группах рассылки и т. д. Хотя вы можете использовать распространение в Центре приложений для распространения новой версии приложения без добавления кода, добавление приложения в код центра приложений приведет к более простому интерфейсу для тестировщиков и пользователей, так как они получают возможность обновления в приложении.
Выключите переадресацию вызовов методов делегата приложения к службам App Center.
Пакет SDK для Центра приложений использует вибрирование для улучшения интеграции путем переадресации некоторых вызовов методов делегата приложения. Метод swizzling — это способ изменить реализацию методов во время выполнения. Если по какой-либо причине вы не хотите использовать swizzling (например, из-за определенной политики), вы можете отключить эту переадресацию для всех служб Центра приложений, выполнив следующие действия:
- Откройте файл Info.plist проекта.
- Добавьте
AppCenterAppDelegateForwarderEnabled
ключ и задайте для параметра значение0
. Это отключает перенаправление делегата приложения для всех служб Центра приложений. - Добавьте обратный
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)
}