Узнайте, как настроить ярлыки и виджеты контекстного меню

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

Раньше это было сложно, поскольку для открытия быстрых действий требовалось касание с усилием, а для удаления приложений требовалось обычное нажатие, чтобы вызвать эффект покачивания. Теперь, когда больше нет 3D-касания, доступ к быстрым действиям стал более плавным и быстрым, чем когда-либо прежде.

Быстрые действия на главном экране обеспечивают удобный способ перехода к определенной части приложений путем настройки контекстных меню, которые можно просмотреть, нажав и удерживая значок запуска приложения. В iOS 13 быстрые действия теперь неявно включают в себя действия «Удалить», «Изменить порядок» и «Поделиться приложением» в каждом меню быстрых действий.

Более того, мы можем еще больше улучшить взаимодействие с пользователем, отображая виджет с меню быстрых действий. Расширение виджета полезно для отображения полезной информации (например, заголовков, денег в бумажнике или цен на акции) для пользователя, а также дает возможность быть добавленным на экран «Сегодняшний виджет».

Наша цель

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

Кроме того, мы интегрируем виджет вместе с нашим меню действий, которое довольно часто встречается в приложениях iOS 13.

Меню быстрых действий

Меню быстрых действий может быть двух типов - статическое или динамическое.

Статические никогда не меняются и определяются в Info.plist файле под UIApplicationShortcutItems - ключом, который содержит массив словарей для пунктов меню. С другой стороны, действия динамического меню используются, когда действия в меню зависят от пользователя или сеанса, например, отображение наиболее посещаемых или последних посещенных экранов.

Давайте посмотрим, как каждый из этих типов быстрых действий реализован в приложении для iOS. Чтобы приступить к работе, создайте новый проект Xcode.

Статические быстрые действия

Статические быстрые действия определены в файле Info.plist следующим образом:

Для каждого элемента в UIApplicationShortcutItems массиве словарей должны быть определены свои собственные свойства UIApplicationShortcutItemTitle и UIApplicationShortcutItemType.

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

Кроме того, мы можем сохранять данные для каждого элемента в UIApplicationShortcutItemUserInfo словаре. Значения userInfo должны соответствовать протоколу NSSecureCoding.

На следующем рисунке показан пример статических быстрых действий из Info.plist, которые мы определили выше:

Динамические быстрые действия

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

Здесь мы можем создать UIApplicationShortcutItem для каждого пункта контекстного меню и установить для массива свойство UIApplication shortcutItems, как показано ниже:

func applicationWillResignActive(_ application: UIApplication) {
application.shortcutItems = [
UIApplicationShortcutItem(
type: "DynamicAction",
localizedTitle: "Name",
localizedSubtitle: nil,
icon: UIApplicationShortcutIcon(type: .contact),
userInfo: nil
)]
}

Ответ на выбор быстрого действия

При нажатии элемента в контекстном меню быстрых действий происходит одно из следующих действий:

  • Если приложение не было запущено - вызывается метод didFinishLaunchingWithOptions внутри класса AppDelegate. Мы можем обрабатывать действие пункта меню, извлекая shortcutItem из launchOptions словаря с помощью ключа UIApplication.LaunchOptionsKey.shortcutItem.
  • Если приложение уже было запущено - в iOS 13 SceneDelegate выполняет всю тяжелую работу. Таким образом, нажатие shortcutItem запускает следующий метод класса SceneDelegate:
func windowScene(_ windowScene: UIWindowScene, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void){
//Handle actions based on shortcutItem.type
}

Для iOS 12 и более ранних версий срабатывает эквивалентный метод AppDelegate.

Интеграция сегодняшнего расширения виджетов

Виджеты обеспечивают быстрый доступ к приложению, предоставляя определенные виды отображения в реальном времени за пределами основного приложения. Мы добавим в наше приложение расширение Today's Widget, чтобы показать это в меню быстрых действий.

Чтобы настроить расширение, нажмите +, чтобы добавить новую цель в свой Xcode, и выберите сегодняшнее расширение. Это создаст соответствующие файлы для расширения (ViewController, раскадровку и файл Info.plist).

Затем добавьте тип URL в цель вашего основного приложения. Мы будем использовать эту схему URL для запуска приложения из виджета.

В нашем файле TodayViewController.swift мы заменили UILabel на UIButton. Чтобы запустить содержащееся приложение из виджета, нам нужно открыть URL-адрес при нажатии кнопки, как показано ниже:

import UIKit
import NotificationCenter
class TodayViewController: UIViewController, NCWidgetProviding {
override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func onButtonTap(_ sender: Any) {
        self.extensionContext?.open(URL(string: "iOS13QuickActions://")!)
    }
   
    func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
        completionHandler(NCUpdateResult.newData)
    }   
}

Мы даже можем включить возможность групп приложений в Xcode, чтобы обеспечить совместное использование данных в виджете и приложении iOS.

В свою очередь, при долгом нажатии на значок мы получаем от нашего приложения следующий результат:

Заключение

В меню быстрых действий отображается действие Поделиться приложением только для приложений, доступных в App Store. Кроме того, мы увидели, как сегодняшнее расширение и меню быстрых действий обеспечивают быстрый доступ к содержимому приложения. Вы можете скачать полный исходный код из Репозитория Github.