0

Виджеты для iPhone

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

В статье мы расскажем, что представляют собой виджеты и в чем их плюсы, подробно объясним и покажем, как их находить, устанавливать и добавлять. Как всегда, все подробно проиллюстрируем (на примере iPhone 8+).

Инструкция подходит для устройств

  • iPhone 11/11 Pro/11 Pro Max;
  • iPhone X/Xs/Xs Max;
  • iPhone Xr;
  • iPhone 7/7Plus;
  • iPhone 8/8 Plus;
  • iPhone 6/6s/6S Plus/6 Plus;
  • iPhone 5/5S.
  • Что такое виджеты?;
  • Какие типы виджетов существуют?;
  • Как добавить,включить,удалить виджеты на айфоне?;
  • Как настраивать и редактировать виджеты?;
  • Выводы

Что такое виджеты?

Виджеты — это небольшие «окошки» основных программ, которые есть на айфоне, находятся они на крайнем экране Вашего девайса, слева от главного экрана. Каждый виджет связан со своей программой и взаимодействует с нею.

Преимущества виджетов в том, что они позволяют использовать определенные функции своей программы без необходимости ее специально открывать. Например, Вы можете посмотреть актуальное на данный момент расписание электричек прямо в виджете на экране, не тратя время на то, чтобы искать и открывать программу (пример — на рисунке 1). Или Вы узнаете прогноз погоды на сегодня из виджета, не открывая само приложение «Погода» (рисунок 2).

Рисунок 1. Виджет отображает актуальную на данный момент информацию из приложения о расписании электричек

Рисунок 2. С помощью виджета можно сэкономить время, не переходя в приложение

Если в системе Андроид виджеты можно располагать где угодно — на разных экранах рабочих столов и рядом с приложениями, — в Apple все несколько серьезнее. Область работы виджетов ограничена панелью уведомлений. Попасть в виджеты Вы сможете с главного экрана, просто проведя по нему пальцем вправо (см. рисунки и видео).

Рисунок 3. После разблокировки iPhone, на главном экране проведите пальцем вправо

Рисунок 4. Свайпнув вправо, Вы попали в область виджетов.

Какие типы виджетов существуют?

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

В виджеты можно добавить:

  • коммуникативные программы — Сообщения, Телефон, Контакты, FaceTime, мессенджеры.
  • Календарь, Заметки, Напоминания
  • Файлы, Почту, Карты, Баланс кошельков WebMoney — все необходимое для быстрого решения рабочих задач
  • Развлекательное и информативное — Музыку, Подкасты, ТВ, News, Погоду
  • а также — Фото, Акции, Советы, Напоминания и другие важные для Вас приложения, которые через виджеты будут всегда показывать Вам основные данные, не открывая саму программу

Как добавить или включить виджеты на айфоне?

Добавить виджет можно не абсолютно любой программы, а той, для которой разработчики Apple предусмотрели данную опцию (добавить виджет). Программы, доступные для создания их виджета, указаны в списке при добавлении.

Как происходит процесс добавления виджета?

  • На экране блокировки или экране Домой свайпните вправо, вы попадете на экран виджетов.

Рисунок 5. Чтобы добавить виджеты и перейти в их окно, смахните вправо с экрана Домой (или с экрана блокировки)

  • Оказавшись на экране виджетов, листайте вниз до самого конца, пока не дойдёте до кнопки «Изменить».

Рисунок 6. Оказавшись на экране виджетов, листайте вниз до самого конца, до кнопки «Изменить».

  • Дойдя до кнопки «Изменить», жмите на неё.

Рисунок 7. Нажимаем кнопку «Изменить»

Перед Вами откроется список виджетов. Вверху списка будут представлены те, что уже установлены (перед ними стоят красные кружки со знаком «минус» — нажав на кружок, виджет можно удалить). Внизу списка с зелёными кружками со значками «плюс» — те, которые доступны для установки. Соответственно, чтобы установить виджет, нажимаем плюс. Для подтверждения действия нажимаем «Готово».

Рисунок 8. Удалить виджет — нажимаем «минус», добавить — жмём «плюс». Нажимаем кнопку «Готово» для подтверждения действия.

Как настраивать и редактировать виджеты на iPhone?

Вы можете редактировать расположение виджетов — менять их местами на экране, расставляя в соответствии со своими предпочтениями. Сделать это так же просто:

  • Повторяем шаги из предыдущих советов по установке виджета (смахиваем на главном экране вправо — попадаем в экран виджетов — листаем вниз до кнопки «Изменить» — нажимаем её — пропадаем в список виджетов со знаками «плюс» и «минус»).
  • Справа от каждого названия виджета Вы увидите прозрачную кнопку с тремя серыми линиями (см. рисунок):

Рисунок 9. Кнопка с тремя линиями справа — чтобы менять порядок виджетов.

Нажимайте и удерживайте эту кнопку, и перетаскивайте виджет вверх или вниз через список с остальными (на рисунке: мы нажали кнопку у виджета Shazam, и, удерживая, тащим его вниз под виджет «Фото»)

Рисунок 10. Удерживая кнопку, перетаскиваем виджет.

Результат: после наших действий виджет оказался в желаемом месте. Для подтверждения только что проделанных изменений жмём кнопку «Готово». Теперь в крайнем левом окне этот виджет среди других будет отображаться в той очередности, куда Вы его определили (как в нашем примере — виджет Shazam будет стоять после «Фото»).

Рисунок 11. Виджет поменял положение

Рисунок 12. В окне виджет также поменял положение, переместившись из верхней части под «Фото».

Выводы

Как мы видим, виджеты от Apple являются по-настоящему функциональной опцией, позволяющей владельцу видеть основную информацию важных приложений, экономя Ваше время и заряд батареи. Добавлять их на экран, удалять и редактировать — простой механизм, обычно не представляющий сложности даже начинающим пользователям. Главное — определиться, виджеты каких программ для Вас наиболее актуальны. Но это уже дело практики, при желании, их всегда легко удалить или поменять местами.

Желаем удачи в работе и качественного отдыха после неё, а также функционального использования Ваших устройств в любых жизненных ситуациях!

Календарные приложения Apple выполняют базовые функции: планирование встреч и мероприятий, а также управление графиком. Для всех, кто новичок в пользовании iPhone, этого более чем достаточно для старта. Однако в App Store предлагается множество альтернатив, которые способны удовлетворить любой вкус. Нужно ли вам организовать себя, членов своей семьи, свой бизнес или что-либо еще — вы найдете приложение именно для себя. Какое приложение вы выберите, зависит от того, что для вас важнее.Представляем список фаворитов. Испытайте их на себе, и выберите именно то, которое удовлетворит все ваши требования. Поверьте, здесь такое найдется.1. Fantastical 2 — для любителей быстрой организации

Благодаря быстрому двунаправленному интерфейсу, Fantastical 2 позволяет быстро делать записи через обычный текст, а также быстро находить их. Кроме того, есть встроенная поддержка для напоминаний и экранное управление. Если вы хотите организовываться быстро, Fantastical именно то, что нужно.$4.99 — 2. Sunrise Calendar — для активных пользователейSunrise Calendar отслеживает все ваши календарные записи параллельно с чекинами в Foursquare, апдейтами статусов в Twitter и пр. Sunrise также встраивается в бизнес-приложения вроде Trello. Если хотите смесь из работы и игры, выбирайте Sunrise.Бесплатно – 3. Pocket Informant — для фанатов функциональностиPocket Informant можно назвать швейцарским раскладным ножом среди календарных приложений. Приложение упаковано практически всеми функциями, которые вы только можете представить, и даже теми, которые не можете. Если вы хотите все и сразу – качайте Pocket Informant.Бесплатно с IAP — 4. Calendars 5 — для любителей составлять спискиCalendars 5 включает в себя все, что вы можете захотеть в календаре, при этом предлагая удобный просмотр списков и управление задачами. Если вы хотите иметь нечто, отличное от строк и таблиц, попробуйте Calendars 5.$2.99 – 5. Agenda Calendar 4 — для любителей сенсорных экрановПриложение Agenda Calendar 4 сделано полностью для работы на дисплее. Оно предлагает множество стилей и встраивается везде, где только можно себе представить. Если вы любите работать с сенсорным экраном, скачайте Agenda Calendar 4.$1.99 – 6. Tempo Calendar — для ценителей деталейTempo – это маленький календарь, который предлагает все: от статуса авиарейса до информации о клиенте, которая вам может понадобиться перед встречей. Чем больше вы рассказываете Tempo, тем больше он изучает. Если для вас важны детали, выбирайте Tempo.Бесплатно — 7. Week Calendar — для тех, кто оценивает с первого взглядаWeek Calendar напакован большим количеством стилей, которые могут удовлетворить любой вкус. В приложении есть возможность выбирать иконки, дублировать мероприятия и прочее. Но если вы не из тех, кому достаточно информации с первого взгляда, этого приложения вам может не хватить.$1.99 – 8. Super Calendar — для любителей собственных настроекSuper Calendar позволяет вам настраивать практически любую конфигурацию того, как ваш календарь будет выглядеть. От настройки фона до выбора типа шрифта и размеров. Если вас привлекает идея того, что у вас будет уникальный календарь, Super Calendar создан специально для вас.$4.99 —

03.06.2020&nbsp iOS и MacOS

По умолчанию, при смахивании вправо на домашнем экране или экране блокировки iPhone открывается экран «Сегодня» с виджетами: некоторые из них могут быть полезны, некоторые — не очень, а некоторые пользователи и вовсе предпочитают отключить виджеты iPhone, особенно на экране блокировки. Сами виджеты «появляются» как часть устанавливаемых приложений, имеющих такую функциональность. Разумеется, присутствуют и стандартные: Предложения Siri, Экранное время, Погода, Музыка и другие.

В этой инструкции подробно о возможностях настройки виджетов на экране iPhone, о том, как их можно добавлять и убирать при необходимости, а также о возможности полного отключения виджетов iPhone на экране блокировки (что может быть полезным с точки зрения конфиденциальности).

  • Настройка виджетов на домашнем экране (добавление и удаление)
  • Как отключить виджеты на экране блокировки iPhone
  • Видео инструкция

Настройка виджетов на домашнем экране

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

  1. Перейдите на экран виджетов свайпом слева направо.
  2. Внизу списка виджетов нажмите кнопку «Изменить».
  3. Вы увидите список доступных виджетов: в верхней части — включенные на вашем iPhone в настоящий момент, в нижней — те, которые возможно включить.
  4. Убрать или добавить виджеты вы можете, нажимая соответствующие кнопки «Плюс» и «Минус» (после этого также потребуется нажать «Удалить».
  5. Для изменения порядка виджетов используйте перемещение строки с помощью трех полосок в правой части.
  6. По окончании изменений просто нажмите «Готово» в правом верхнем углу.
  7. Ещё один способ добавить виджет приложения, которое имеет такую функциональность — долгое удержание иконки приложения на домашнем экране, затем — выбор пункта «Добавить виджет».

По мере установки новых приложений (или удаления старых) список доступных виджетов может изменяться — появляться новые и исчезать старые. Если удалить все виджеты в настройках, экран слева от домашнего экрана никуда не исчезнет — на нем все так же останется кнопка «Изменить» и строка поиска. Полностью убрать его не получится.

Как отключить виджеты на экране блокировки iPhone

Виджеты на экране блокировки могут быть удобны, но не всегда безопасны, если iPhone окажется в чьих-то руках. При необходимости вы можете отключить отображение виджетов на экране блокировки:

  1. Зайдите в Настройки — Touch ID и код-пароль, введите ваш пароль.
  2. Пролистайте внизу до раздела «Доступ с блокировкой экрана».
  3. Отключите пункт «Сегодня». При необходимости можно отключить и другие элементы, чтобы они не отображались на заблокированном экране.

После проделанных действий виджеты экрана «Сегодня» перестанут показываться на экране блокировки.

Видео инструкция

В этом году для iOS-разработчиков появилось сразу несколько интересных возможностей посадить батарейку айфона улучшить пользовательский опыт, одна из таких — новые виджеты. Пока мы все находимся в ожидании выхода релизной версии ОС, хотел бы поделиться опытом написания виджета для приложения «Кошелёк» и рассказать, с какими возможностями и ограничениями наша команда столкнулась на бета-версиях Xcode.
Начнем с определения — виджетами называются представления, показывающие актуальную информацию без запуска основного мобильного приложения и всегда находящиеся под рукой у пользователя. Возможность их использовать уже есть в iOS (Today Extension), начиная с iOS 8, но мой сугубо личный опыт их использования довольно печален — под них хоть и выделен специальный рабочий стол с виджетами, но я всё равно редко туда попадаю, привычка не выработалась.
Как итог, в iOS 14 мы видим перерождение виджетов, глубже интегрированных в экосистему, и более удобных для пользователя (в теории).
Работа с картами лояльности — одна из основных функций нашего приложения «Кошелёк». Периодически в отзывах в App Store появляются предложения от пользователей о возможности добавления виджета в Today. Пользователи, находясь у кассы, хотели бы как можно быстрее показать карту, получить скидку и убежать по своим делам, ведь промедление на любой квант времени вызывает те самые укоризненные взгляды в очереди. В нашем случае виджет может сэкономить несколько пользовательских действий для открытия карты, таким образом сделав операцию оплаты товара на кассе более быстрой. Магазины тоже будут благодарны — меньше очередей на кассе.
В этом году Apple неожиданно для всех выпустила релиз iOS практически сразу после презентации, оставив разработчикам сутки на доработки своих приложений на Xcode GM, но мы оказались готовы к релизу, так как свой вариант виджета наша iOS-команда стала делать еще на бета-версиях Xcode. Сейчас виджет находится на ревью в App Store. Обновление устройств до новой iOS по статистике происходит довольно быстро; скорее всего, пользователи пойдут проверять, у каких приложений виджеты уже есть, найдут наш и будут счастливы.
В дальнейшем мы хотели бы добавить еще больше актуальной информации — например, баланс, штрихкод, последние непрочитанные сообщения от партнёров и уведомления (например, что пользователям необходимо совершить действие — подтвердить или активировать карту). На текущий момент результат выглядит следующим образом:

Добавление виджета в проект

Как и другие подобные дополнительные возможности, виджет добавляется как расширение (extension) к основному проекту. После добавления Xcode любезно генерирует код виджета и других основных классов. Вот тут нас ждала первая интересная особенность — для нашего проекта этот код не компилировался, так как в одном из файлов автоматически подставлялся префикс в названиях класса (да-да, те самые Obj-C префиксы!), а в генерируемых файлах — нет. Как говорится, не боги горшки обжигают, видимо, разные команды внутри Apple не договорились между собой. Будем надеяться, что к релизной версии исправят. Для того, чтобы настроить префикс своего проекта, в File Inspector основного таргета приложения заполните поле Class Prefix.
Для тех, кто следил за новинками WWDC, не секрет, что реализация виджетов возможна только с использованием SwiftUI. Интересный момент, что таким образом Apple форсит обновление на свои технологии: даже если основное приложение написано с использованием UIKit, то тут, будьте любезны, только SwiftUI. С другой стороны, это хорошая возможность попробовать новый фреймворк для написания фичи, в этом случае он удобно вписывается в процесс — никаких изменений состояния, никакой навигации, требуется только задекларировать статичный UI. То есть вместе с новым фреймворком появились и новые ограничения, потому как старые виджеты в Today могут содержать больше логики и анимацию.

Me using SwiftUI pic.twitter.com/2rUNWyx3s5

— Daniel Storm ‍ (@DanielStormApps) August 20, 2020
Одно из основных нововведений SwiftUI — возможность предпросмотра без запуска на симуляторе или девайсе (preview). Классная вещь, но, к сожалению, на больших проектах (в нашем — ~400K строк кода) работает крайне медленно даже на топовых макбуках, быстрее запустить на девайсе. Альтернатива такому способу — иметь под рукой пустой проект или плейграунд для быстрого прототипирования.
Возможность для дебага также есть с помощью выделенной Xcode схемы. На симуляторе отладка работает нестабильно даже к версии Xcode 12 beta 6, поэтому лучше пожертвовать один из тестовых девайсов, обновить до iOS 14 и тестировать на нем. Будьте готовы, что эта часть и на релизных версиях будет работать не как ожидается.

Интерфейс

На выбор пользователю даются разные типы (WidgetFamily) виджетов трёх размеров — small, medium, large.
Для регистрации необходимо явно указать поддерживаемые:
struct CardListWidget: Widget { public var body: some WidgetConfiguration { IntentConfiguration(kind: «CardListWidgetKind”, intent: DynamicMultiSelectionIntent.self, provider: CardListProvider()) { entry in CardListEntryView(entry: entry) } .configurationDisplayName(«Быстрый доступ») .description(«Карты, которые вы используете чаще всего») .supportedFamilies() } }
Мы с командой решили остановиться на small и medium — выводить одну любимую карту для маленького виджета или 4 для medium.
Добавление виджета на рабочий стол происходит из центра управления, там пользователь выбирает необходимый ему вид:
Цвет кнопки «Добавить виджет» кастомизируем с помощью Assets.xcassets -> AccentColor, имя виджета с описанием тоже (пример кода выше).
Если уперлись в ограничение по количеству поддерживаемых видов, то можно расширить его с помощью WidgetBundle:
@main struct WalletBundle: WidgetBundle { @WidgetBundleBuilder var body: some Widget { CardListWidget() MySecondWidget() } }
Так как виджет показывает слепок некоторого состояния, то единственная возможность для пользовательского интерактива — это переход в основное приложение по нажатию на какой-то элемент или весь виджет. Никакой анимации, навигации и переходов на другие view. Но есть возможность прокинуть диплинку в основное приложение. При этом для small виджета зоной нажатия является вся область, и в этом случае используем widgetURL(_:) метод. Для medium и big доступны нажатия по view, и в этом нам поможет структура из SwiftUI.
Link(destination: card.url) { CardView(card: card) }
Финальный вид виджета двух размеров получился следующим:
При проектировании интерфейса виджета могут помочь следующие правила и требования (согласно гайдлайнам Apple):

  1. Сфокусируйте виджет на одной идее и проблеме, не пытайтесь повторить всю функциональность приложения.
  2. В зависимости от размера выводите больше информации, а не просто масштабируйте контент.
  3. Выводите динамическую информацию, которая может меняться в течение дня. Крайности в виде полностью статической информации и информации, меняющейся ежеминутно, не приветствуются.
  4. Виджет должен давать актуальную информацию пользователям, а не быть еще одним способом открыть приложение.

Внешний вид настроили. Следующий шаг — выбрать, какие карты и каким образом показывать пользователю. Карт может быть явно больше четырёх. Рассмотрим несколько вариантов:

  1. Дать возможность пользователю выбирать карты. Кто, как не он, знает, какие карты важнее!
  2. Показывать последние использованные карты.
  3. Сделать более умный алгоритм, ориентируясь, например, на время и день недели и статистику (если пользователь по будням вечером ходит во фруктовую лавку у дома, а на выходных ездит в гипермаркет, то можно помочь пользователю в этом моменте и показывать нужную карту)

В рамках прототипа остановились на первом варианте, чтобы заодно попробовать возможность настраивать параметры прямо на виджете. Не нужно делать специальный экран внутри приложения. Правда, настолько ли пользователи, как говорится, experienced, чтобы найти эти настройки?

Пользовательские настройки виджета

Настройки формируются с помощью интентов (привет Андроид-разработчикам) — при создании нового виджета файл интента добавляется в проект автоматически. Кодогенератор подготовит класс-наследник от INIntent, который является частью фреймворка SiriKit. В параметрах интента стоит магическая опция «Intent is eligible for widgets». Доступны несколько типов параметров, можно настраивать свои подтипы. Так как данные в нашем случае — это динамический список, то еще устанавливаем пункт «Options are provided dynamically».
Для разных типов виджета настраиваем максимальное количество элементов в списке — для small 1, для medium 4.
Этот тип интента используется виджетом как источник данных.
Далее настроенный класс интента необходимо поставить в конфигурацию IntentConfiguration.
struct CardListWidget: Widget { public var body: some WidgetConfiguration { IntentConfiguration(kind: WidgetConstants.widgetKind, intent: DynamicMultiSelectionIntent.self, provider: CardListProvider()) { entry in CardListEntryView(entry: entry) } .configurationDisplayName(«Быстрый доступ») .description(«Карты, которые вы используете чаще всего.») .supportedFamilies() } }
В случае, если пользовательские настройки не требуются, то есть альтернатива в виде класса StaticConfiguration, которая работает без указания интента.
Изменяемыми на экране настроек являются title и description.
Название у виджета должно помещаться на одну строку, иначе оно обрезается. При этом допустимая длина для экрана добавления и настроек виджета отличаются.
Примеры максимальной длины названия для некоторых устройств:
iPhone 11 Pro Max 28 для настроек 21 для меню добавления iPhone 11 Pro 25 для настроек 19 для меню добавления iPhone SE 24 для настроек 19 для меню добавления
Описание является многострочным. В случае очень длинного текста в настройках контент можно проскролить. А вот на экране добавления сначала сжимается превью у виджета, а потом с версткой происходит что-то страшное.
Также можно изменить цвет фона и значения параметров WidgetBackground и AccentColor — по умолчанию они уже лежат в Assets. При необходимости их можно переименовать в конфигурации виджета в Build Settings у группы Asset Catalog Compiler — Options в полях Widget Background Color Name и Global Accent Color Name соответственно.

Некоторые параметры могут быть скрыты (или показаны) в зависимости от выбранного значения в другом параметре через настройку Relationship.
Стоит отметить, что UI для редактирования параметра зависит от его типа. К примеру, если укажем Boolean, то мы увидим UISwitch, а если Integer, то тут у нас уже выбор из двух вариантов: ввод через UITextfield или пошаговое изменение через UIStepper.

Взаимодействие с основным приложением.

Связку настроили, осталось определить, откуда сам интент возьмет реальные данные. Мостик с основным приложением в этом случае — файл в общей группе (App Groups). Основное приложение пишет, виджет — читает.
Для получения URL к общей группе используется следующий метод:
FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: «group.ru.yourcompany.yourawesomeapp”)
Сохраняем всех кандидатов, так как они будут использоваться пользователем в настройках как словарь для выбора.
Далее операционная система должна узнать, что данные обновились, для этого вызываем:
WidgetCenter.shared.reloadAllTimelines() // Или WidgetCenter.shared.reloadTimelines(ofKind: «kind»)
Так как вызов метода будет перезагружать контент виджета и весь таймлайн, используйте его, когда данные действительно обновились, чтобы лишний раз не нагружать систему.

Обновление данных

В целях бережного отношения к батарейке пользовательского девайса Apple продумали механизм обновления данных на виджете с использованием timeline — механизма генерации слепков (snapshot). Напрямую разработчик не обновляет и не управляет view, но зато предоставляет расписание, руководствуясь которым, операционная система нарежет снапшотов в бэкграунде.
Обновление происходит по следующим событиям:

  1. Вызов используемого ранее WidgetCenter.shared.reloadAllTimelines()
  2. При добавлении виджета пользователем на рабочий стол
  3. При редактировании настроек.

Также в распоряжении разработчика три вида политик по обновлению таймлайнов (TimelineReloadPolicy):
atEnd — обновление после показа последнего cнапшота
never — обновление только в случае принудительного вызова
after(_:) — обновление через определенный промежуток времени.
В нашем случае достаточно попросить систему сделать один снепшот до момента, пока данные карт не обновились в основном приложении:
struct CardListProvider: IntentTimelineProvider { public typealias Intent = DynamicMultiSelectionIntent public typealias Entry = CardListEntry public func placeholder(in context: Context) -> Self.Entry { return CardListEntry(date: Date(), cards: testData) } public func getSnapshot(for configuration: Self.Intent, in context: Self.Context, completion: @escaping (Self.Entry) -> Void) { let entry = CardListEntry(date: Date(), cards: testData) completion(entry) } public func getTimeline(for configuration: Self.Intent, in context: Self.Context, completion: @escaping (Timeline<Self.Entry>) -> Void) { let cards: ? = configuration.cards?.compactMap { card in let id = card.identifier let storedCards = SharedStorage.widgetRepository.restore() return storedCards.first(where: { widgetCard in widgetCard.id == id }) } let entry = CardListEntry(date: Date(), cards: cards ?? ) let timeline = Timeline(entries: , policy: .never) completion(timeline) } } struct CardListEntry: TimelineEntry { public let date: Date public let cards: }

Более гибкий вариант пригодился бы при использовании автоматического алгоритма подбора карточек в зависимости от дня недели и времени.
Отдельно стоит отметить показ виджета, если он находится в стэке из виджетов (Smart Stack). В этом случае для управления приоритетами мы можем воспользоваться двумя вариантами: Siri Suggestions или через установку значения relevance у TimelineEntry с типом TimelineEntryRelevance. TimelineEntryRelevance содержит два параметра:
score — приоритет текущего снапшота относительно других снапшотов;
duration — время, пока виджет остается актуальным и система может поставить его на верхнюю позицию в стэке.
Оба способа, а также возможности конфигурации виджета, были подробно рассмотрены на сессии WWDC.
Также необходимо рассказать о том, как поддерживать актуальное отображение даты и времени. Так как мы не можем регулярно обновлять содержимое виджета, то для компонента Text было добавлено несколько стилей. При использовании стиля система автоматически обновляет содержимое компонента, пока виджет находится на экране. Возможно, в будущем такой же подход распространится и на другие SwiftUI компоненты.
Text поддерживает следующие стили:
relative — разница времени между текущей и заданной датами. Тут стоит отметить: если дата указана в будущем, то начинается обратный отсчет, а после показывается дата от момента достижения нуля. Такое же поведение будет и для следующих двух стилей;
offset — аналогично предыдущему, но есть индикация в виде префикса с ±;
timer — аналог таймера;
date — отображение даты;
time — отображение времени.
Кроме этого, есть возможность отобразить промежуток времени между датами, просто указав интервал.
let components = DateComponents(minute: 10, second: 0) let futureDate = Calendar.current.date(byAdding: components, to: Date())! VStack { Text(futureDate, style: .relative) .multilineTextAlignment(.center) Text(futureDate, style: .offset) .multilineTextAlignment(.center) Text(futureDate, style: .timer) .multilineTextAlignment(.center) Text(Date(), style: .date) .multilineTextAlignment(.center) Text(Date(), style: .time) .multilineTextAlignment(.center) Text(Date() … futureDate) .multilineTextAlignment(.center) }

Превью виджета

При первом отображении виджет будет открыт в режиме превью, для этого нам необходимо вернуть TimeLineEntry в методе placeholder(in:). В нашем случае это выглядит так:
func placeholder(in context: Context) -> Self.Entry { return CardListEntry(date: Date(), cards: testData) }
После чего к view применяется модификатор redacted(reason:) с параметром placeholder. При этом элементы на виджете отображаются размытыми.
Мы можем отказаться от этого эффекта у части элементов, использовав unredacted() модификатор.
Также в документации сказано, что вызов метода placeholder(in:) происходит синхронно и результат должен вернуться максимально быстро, в отличие от getSnapshot(in:completion:) и getTimeline(in:completion:)

Скругление элементов

В гайдлайнах рекомендуется согласовать скругление у элементов со скруглением виджета, для этого в iOS 14 была добавлена структура ContainerRelativeShape, которая позволяет применить к view форму контейнера.
.clipShape(ContainerRelativeShape())

Поддержка Objective-C

В случае необходимости добавить в виджет код на Objective-C (например, у нас на нем написана генерация изображений штрихкодов) всё происходит стандартным способом через добавление Objective-C bridging header. Единственная проблема, с которой мы столкнулись — при сборке Xcode перестал видеть автогенерируемые файлы интентов, поэтому мы также добавили их в bridging header:
#import «DynamicCardSelectionIntent.h» #import «CardSelectionIntent.h» #import «DynamicMultiSelectionIntent.h»

Размер приложения

Тестирование проводилось на Xcode 12 beta 6
Без виджета: 61.6 Мб
С виджетом: 62.2 Мб
Резюмирую основные моменты, которые рассмотрели в статье:

  1. Виджеты — отличная возможность пощупать SwiftUI на практике. Добавляйте их в проект, даже если минимальная поддерживаемая версия ниже iOS 14.
  2. WidgetBundle используется для увеличения числа доступных виджетов, вот отличный пример как много различных виджетов имеет приложение ApolloReddit.
  3. Для добавления пользовательских настроек на самом виджете поможет IntentConfiguration или StaticConfiguration, если пользовательские настройки не нужны.
  4. Общая папка на файловой системе в общей группе App Groups поможет синхронизировать данные с основным приложением.
  5. На выбор разработчику предоставляется несколько политик обновления таймлайна (atEnd, never, after(_:)).

На этом тернистый путь разработки виджета на бета-версиях Xcode можно считать завершенным, остался один простой шаг — пройти ревью в App Store.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *