Как добавить несколько типов осложнений и отреагировать на них

С watchOS 7 теперь вы можете добавить в свое приложение несколько усложнений, открывая различные типы представлений для ваших данных. В то время как демонстрация на WWDC 2020 показала, как добавить несколько сложностей, в ней не было подробно описано, как обрабатывать взаимодействие с ними. Для удобства пользователей при нажатии на осложнение вы хотите, чтобы приложение открывалось в состоянии, соответствующем этому конкретному усложнению.
Эта статья покажет вам, как добавлять различные осложнения, обновлять их при изменении их описания, а также реагировать на нажатие на конкретный тип осложнений.
В нашем примере мы создадим простое приложение для часов с вкладками, показывающее заголовки трех публикаций. Вы сможете добавить любую из этих публикаций на циферблат, и при нажатии на него откроется приложение с правильной вкладкой.
Мы просто создадим одно семейство усложнений для этого примера - graphicRectangular, которое отлично подходит для текста. Поэтому при тестировании убедитесь, что вы используете циферблат, допускающий эту сложность. Infograph Modular подойдет и является моим предпочтительным тестовым циферблатом, поскольку он допускает несколько различных семейств усложнений. После того, как вы добавили одну семью, достаточно промыть и повторить, чтобы поддержать столько семей, сколько захотите.
Вот наше приложение в действии:

В этой статье я буду называть соответствующий код, который вам нужно будет добавить в существующий проект приложения для часов.
Настройка приложения для часов
Прежде чем мы перейдем к сложностям, нам нужно создать собственное приложение для часов.
В этом примере мы создадим простую статическую модель данных, совместно используемую приложением и усложнениями:
Чтобы просмотреть это в приложении, мы повторно используем ContentView по умолчанию, предоставленный новым шаблоном приложения для часов, просто добавив переменную состояния публикации и отобразив свойства:
Для вкладок мы будем повторно использовать этот единственный ContentView и использовать новый жизненный цикл приложения SwiftUI для добавления вкладок, передавая публикацию, чтобы сделать их отличными. В вашем App.swift файле измените WindowGroup, чтобы добавить вкладки с переменной @state, чтобы сохранить текущую выбранную вкладку. Модификаторы тегов каждого ContentView важны. Вот что сопоставляет состояние selectedTab каждому представлению:
На данный момент это все, что вам нужно для приложения. У вас будет три просмотра, которые вы можете пролистать, в каждом из которых будет отображаться название публикации и последний заголовок.
Создание осложнений
Если вы создали базовые осложнения, вы знаете, что ComplicationController - это то место, где происходит вся магия, раскрывающая ваши осложнения. По большей части это шаблон. Единственная часть, которую мы изменим, - это фактическая информация, отображаемая на усложнении. Мы также зарегистрируем различные типы сложности для каждой вкладки.
Функция getLocalizableSampleTemplate - это то, что будет представлено в предварительном просмотре для добавления нового усложнения. Важно отметить, что они кешируются и поэтому не могут быть обновлены для отображения реальных данных о сложности. Дескрипторы сложности - это то, что мы используем, чтобы придать уникальность каждому усложнению (что мы скоро обработаем), поэтому в этом шаблоне просто отображается текст-заполнитель для публикации и последний заголовок:
Функция createTemplate очень проста. Мы получим публикацию для идентификатора, выбранного для этой сложности, и отобразим название публикации и последний заголовок:
Пока ничего нового. Важным элементом, добавленным в watchOS 7, является функция getComplicationDescriptors. Это позволяет нам описать, какие сложности мы делаем доступными:
Что мы здесь делаем, так это создаем дескрипторы для наших вкладок данных. displayName - это то, что используется при редактировании циферблата для описания конкретного случая усложнения. Dictionary и NSUserActivity - это то, как мы определяем тип осложнения, на который пользователь нажал, когда мы повторно заходим в наше приложение, и мы рассмотрим его дальше.
Важно отметить, что существует ограничение на количество добавляемых дескрипторов. Хотя это не задокументировано, похоже, что в настоящее время ограничение составляет десять для сторонних приложений.
Ответ на нажатие на осложнения
Вернемся к коду нашего приложения. Нам нужно знать, когда возникает осложнение. Это достигается за счет регистрации onContinueUserActivity событий для вашего типа активности, который вы указали при создании дескрипторов:
Здесь мы добавляем onContinueUserActivity к нашему NavigationView и меняем переменную состояния selectedTab на идентификатор, переданный в userActivity, что изменит представление вкладки на соответствующую вкладку.
Обновление описаний осложнений
Хотя в этом примере это не обязательно, но если ваши сложности изменятся, вы захотите обновить дескрипторы и, возможно, временную шкалу для существующих осложнений. Для этого мы будем использовать новое scenePhase изменение, чтобы определять, когда наше приложение переходит в фоновый режим, и уведомлять watchOS о том, что мы что-то изменили:
Заключение
Несмотря на то, что это простой пример, я надеюсь, что описанные здесь методы позволят вам добавить поддержку множественных усложнений к вашим приложениям для часов, позволяя пользователям выбирать данные, которые им наиболее подходят, и отображать их на своих циферблатах.
Полный пример проекта доступен на GitHub.