Обновления SiriKit в iOS 11

SiriKit появился в iOS 10 с рядом доменов обслуживания (включая тренировки, резервирование поездки и вызовы). Ознакомьтесь с разделом SiriKit о концепциях SiriKit и о том, как реализовать SiriKit в приложении.

Демонстрация списка задач Siri

SiriKit в iOS 11 добавляет следующие новые и обновленные домены намерений:

  • Списки и заметки — новые! Предоставляет API для приложений для обработки задач и заметок.
  • Визуальные коды — новые! Siri может отображать QR-коды для совместного использования контактных данных или участия в транзакциях с оплатой.
  • Платежи — добавлены намерения поиска и передачи для взаимодействия с оплатой.
  • Бронирование поездки — добавлена отмена поездки и намерения обратной связи.

Другие новые возможности:

  • Альтернативные имена приложений— предоставляет псевдонимы, которые помогают клиентам сообщать Siri о назначении приложения, предлагая альтернативные имена и произношения.
  • Запуск тренировки — обеспечивает возможность запуска тренировки в фоновом режиме.

Ниже описаны некоторые из этих функций. Дополнительные сведения о других см. в документации apple SiriKit.

Списки и заметки

Новый домен списков и заметок предоставляет API для приложений для обработки задач и заметок с помощью голосовых запросов Siri.

Задачи

  • Укажите заголовок и состояние завершения.
  • При необходимости включите крайний срок и расположение.

Примечания

  • Укажите заголовок и поле содержимого.

Задачи и заметки можно упорядочить в группы.

Обработка запроса SiriKit

Обработайте запрос SiriKit, выполнив следующие действия:

  1. Разрешение — проверка параметров и запрос дополнительных сведений от пользователя (при необходимости).
  2. Подтвердите — окончательная проверка и проверка того, что запрос можно обработать.
  3. Дескриптор — выполнение операции (обновление данных или выполнение сетевых операций).

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

Разрешение и подтверждение методов

Эти необязательные методы позволяют коду выполнять проверку, выбирать значения по умолчанию или запрашивать дополнительные сведения от пользователя.

Например, для IINCreateTaskListIntent интерфейса требуется HandleCreateTaskListметод. Существует четыре необязательных метода, которые обеспечивают больше контроля над взаимодействием Siri:

  • ResolveTitle — проверяет название, задает заголовок по умолчанию (при необходимости) или сигнализирует о том, что данные не требуются.
  • ResolveTaskTitles — проверяет список задач, произнесенных пользователем.
  • ResolveGroupName — проверяет имя группы, выбирает группу по умолчанию или сигнализирует о том, что данные не требуются.
  • ConfirmCreateTaskList — проверяет, может ли код выполнять запрошенную операцию, но не выполняет ее (только Handle* методы должны изменять данные).

Обработка намерения

В списках и домене заметок есть шесть намерений, три для задач и три для заметок. Методы, которые необходимо реализовать для обработки этих намерений:

  • Для задач:
    • HandleAddTasks
    • HandleCreateTaskList
    • HandleSetTaskAttribute
  • Примечания:
    • HandleCreateNote
    • HandleAppendToNote
    • HandleSearchForNotebookItems

Каждый метод имеет определенный тип намерения, переданный ему, который содержит все сведения Siri, проанализированные из запроса пользователя (и, возможно, обновлены в Resolve* методах).Confirm* Приложение должно анализировать предоставленные данные, а затем выполнять некоторые действия для хранения или обработки данных, а также возвращать результат, который Siri говорит и показывает пользователю.

Коды ответов

Обязательные Handle* и необязательные Confirm* методы указывают код ответа, задав значение объекта, передаваемого в обработчик завершения. Ответы приходят из INCreateTaskListIntentResponseCode перечисления:

  • Ready — возвращается во время этапа подтверждения (т. е. из Confirm* метода, но не из Handle* метода).
  • InProgress — используется для длительных задач (таких как операция сети или сервера).
  • Success — отвечает с подробными сведениями об успешной операции (только из Handle* метода).
  • Failure — Означает, что произошла ошибка, и операция не удалось завершить.
  • RequiringAppLaunch — Невозможно обработать намерение, но операция возможна в приложении.
  • Unspecified — Не используйте: сообщение об ошибке будет отображаться пользователю.

Дополнительные сведения об этих методах и ответах см. в списках и заметках Apple SiriKit.

Реализация списков и заметок

Сначала, чтобы добавить поддержку SiriKit, выполните следующие действия для приложения iOS:

  1. Тик SiriKit в файле Entitlements.plist.
  2. Добавьте ключ описания использования Siri в Info.plist вместе с сообщением для клиентов.
  3. INPreferences.RequestSiriAuthorization Вызовите метод в приложении, чтобы пользователь разрешил взаимодействие Siri.
  4. Добавьте SiriKit в идентификатор приложения на портале разработчика и повторно создайте профили подготовки, чтобы включить новое право.

Затем добавьте новый проект расширения в приложение для обработки запросов Siri:

  1. Щелкните правой кнопкой мыши решение и нажмите кнопку "Добавить > новый проект"....
  2. Выберите шаблон расширения намерений расширения > iOS>.
  3. Будут добавлены два новых проекта: Намерение и Намерение. Настройка пользовательского интерфейса является необязательным, поэтому пример содержит только код в проекте "Намерение ".

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

Настройка IntentHandler

Класс IntentHandler является точкой входа для запросов Siri— каждое намерение передается GetHandler методу, который возвращает объект, который может обрабатывать запрос.

В приведенном ниже коде показана простая реализация:

[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
  protected IntentHandler(IntPtr handle) : base(handle)
  {}
  public override NSObject GetHandler(INIntent intent)
  {
    // This is the default implementation.  If you want different objects to handle different intents,
    // you can override this and return the handler you want for that particular intent.
    return this;
  }
  // add intent handlers here!
}

Класс должен наследоваться от INExtensionи, поскольку пример будет обрабатывать списки и намерения заметок, он также реализует IINNotebookDomainHandling.

Примечание.

  • В .NET существует соглашение о префиксе интерфейсов с заглавной буквой I, которой Xamarin соответствует при привязке протоколов из пакета SDK для iOS.
  • Xamarin также сохраняет имена типов из iOS, и Apple использует первые два символа в именах типов для отражения платформы, к которой принадлежит тип.
  • Intents Для платформы типы префиксируются (IN*например, например), INExtensionно это не интерфейсы.
  • Он также следует, что протоколы (которые становятся интерфейсами в C#) в конечном итоге с двумя I, например IINAddTasksIntentHandling.

Обработка намерений

Каждое намерение (добавление задачи, задание атрибута задачи и т. д.) реализуется в одном методе, аналогичном приведенному ниже. Метод должен выполнять три основные функции:

  1. Обработка намерения — данные, проанализированные Siri, предоставляются в объекте intent , определенном типу намерения. Возможно, ваше приложение проверило, что данные используют необязательные Resolve* методы.
  2. Проверьте и обновите хранилище данных — сохраните данные в файловой системе (с помощью групп приложений, чтобы основное приложение iOS также могли получить к нему доступ) или через сетевой запрос.
  3. Укажите ответ . Используйте completion обработчик для отправки ответа обратно в Siri для чтения и отображения пользователю:
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
  var list = TaskList.FromIntent(intent);
  // TODO: have to create the list and tasks... in your app data store
  var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
  {
    CreatedTaskList = list
  };
  completion(response);
}

Обратите внимание, что null передается в качестве второго параметра в ответ — это параметр действия пользователя, и когда он не указан, будет использоваться значение по умолчанию. Вы можете задать настраиваемый тип действия, если приложение iOS поддерживает его с помощью NSUserActivityTypes ключа в Info.plist. Этот случай можно обрабатывать при открытии приложения и выполнении определенных операций (таких как открытие соответствующего контроллера представления и загрузка данных из операции Siri).

Пример также жестко кодирует Success результат, но в реальных сценариях следует добавить правильную отчетность об ошибках.

Тестовые фразы

Следующие тестовые фразы должны работать в примере приложения:

  • "Сделайте список продуктов с яблоками, бананами и грушами в TasksNotes"
  • Добавление WWDC задачи в TasksNotes
  • "Добавление WWDC задачи в список обучения в TasksNotes"
  • "Пометить WWDC как завершенное в TasksNotes"
  • "В TasksNotes напоминает мне купить iphone, когда я получаю домой"
  • "Марк купить iPhone как завершенный в TasksNotes"
  • "Напомнить мне, чтобы оставить дома в 8 утра в TasksNotes"

Создание примера списка Задание задачи в качестве полного примера

Примечание.

Симулятор iOS 11 поддерживает тестирование с помощью Siri (в отличие от предыдущих версий).

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

Альтернативные имена

Эта новая функция iOS 11 означает, что вы можете настроить альтернативные имена для приложения, чтобы пользователи могли правильно активировать его с помощью Siri. Добавьте следующие ключи в файл Info.plist проекта приложения iOS:

Info.plist с альтернативными ключами и значениями имен приложения

При использовании альтернативного набора имен приложений следующие фразы также будут работать для примера приложения (который фактически называется TasksNotes):

  • "Сделайте продуктовый список с яблоками, бананами и грушами в MonkeyNotes"
  • Добавление WWDC задачи в MonkeyTodo

Устранение неполадок

Некоторые ошибки, которые могут возникнуть при выполнении примера или добавлении SiriKit в собственные приложения:

NSInternalInconsistencyException

Objective-C исключение, вызванное. Имя: NSInternalInconsistencyException Reason: использование класса <INPreferences: 0x60400082ff00> из приложения требует права com.apple.developer.siri. Включена ли возможность Siri в проекте Xcode?

  • SiriKit тикает в файле Entitlements.plist.

  • В разделе "Подписывание пакета для сборки iOS для параметров > > проекта" настроена функция "Права.plist".

    Параметры проекта, показывающие правильно заданные права

  • (для развертывания устройств) Идентификатор приложения включает SiriKit и скачан профиль подготовки.