[iOS 10] Вбудовуємо підтримку Siri свого iOS додаток

image

Apple показала WWDC 2016 нові iOS 10 та macOS Sierra, і я не упустив можливість відразу ж оновити свої пристрої.

Одне з ключових оновлень — поява SiriKit для розробників, тепер у нас з вами є можливість використовувати Siri у власних додатках. І ми сьогодні зробимо наше перше додаток з підтримкою Siri (вихідні коди проекту в кінці статті)

(!) Шановні читачі «Хабрахабра», усі помилки та виправлення по даній статті надсилайте, будь ласка, в особисті повідомлення.


Мої враження від iOS 10 і macOS
У новій macOS з'явилася Siri — це відразу кидається в очі, з новими функціями. Нарешті запрацював обмін посиланнями між iOS і macOS — як тільки відкриваєш сторінку на iPhone/iPad — відразу з'являється на mac значок Safari, що відкриває цю сторінку (Раніше ця функція працювала через раз). Ну і звичайно дуже круто що копіюючи текст на iOS — його можна вставити на macOS. З картинками і фото теж саме — один клік на iPhone, і фото вже на ноутбуці, більше не потрібно мэйлить фото самому собі. За замовчуванням включається на macOS телеметрія, яку я відразу відключив (скрін). З мінусів iOS 10 — дійсно гальмівна, іноді (не завжди) на iPhone 5S і iPad Air пригальмовує скролл, але в цілому, інтерфейс виглядає більш стильно, контрастніше, зміни UI незначні, але в цілому «більш стильно і мінімалістично» :) В плані UI дизайну так само варто відзначити оновлені формочки для IN-APP повідомлень.

image

Apple пропонує кілька сценаріїв для використання Siri сторонніми розробниками:

  • Аудіо і відео дзвінки
  • Робота з повідомленнями та контактами
  • Здійснення платежів за допомогою Siri
  • Пошук фотографій
  • Тренування
  • Робота з картками (Виклик таксі)


У цій статті я покажу, як створювати StoryBoard інтерфейс для Siri і викликати наші функції з допомогою голосового помічника.

Для початку завантажуємо і встановлюємо Xcode 8 і створюємо новий додаток з одним ViewController і називаємо його, наприклад «DemoApp».

Для додавання голосової підтримки нам доведеться додати нове розширення, для цього вибираємо в лівій панелі файлового менеджера верхню сходинку (файл проекту) і вибираємо в меню Editor -> Add target…

image

Назвемо наше розширення «DemoAppSiriIntent», так само не забуваємо перевірити наявність галочки навпроти «Include UI Extension»

image

Так само для роботи Siri нам необхідно додати в проект бібліотеку CoreLocation.framework

image

У нас в проекті з'явилися нові файли

  • IntentHandler.m — файл з CallBack функціями, що Siri повертає
  • IntentViewController.m — файл для роботи з StoryBoard інтерфейсом, який розташований поруч, у файлі MainInterface.storyboard


Для початку ми навчимо наше додаток запускати «Фітнес активність» (Workout), для цього у файлі IntentHandler.m повинні бути об'явлені наступні Delegates:

@interface IntentHandler () <INStartWorkoutIntentHandling, INPauseWorkoutIntentHandling, INResumeWorkoutIntentHandling, INCancelWorkoutIntentHandling, INEndWorkoutIntentHandling>
@end


Для позначення методів взаємодії з Siri Apple використовує слово «Намір», тепер, затискаючи клавішу CMD, клікаємо на «INStartWorkoutIntentHandling» і дивимося, які функції використовує даний deligate.

Обов'язковий для включення в проект метод:

  • handleStartWorkout


Додаткові методи, які можна не включати в проект:

  • confirmStartWorkout
  • resolveWorkoutNameForStartWorkout
  • resolveGoalValueForStartWorkout
  • resolveWorkoutGoalUnitTypeForStartworkout
  • resolveWorkoutLocationTypeForStartworkout
  • resolveIsOpenEndedForStartWorkout


Медод «confirmStartWorkout» викликає по черзі наступні Callback функції, які вже автоматично створені в нашому файлі «IntentHandler.m»:

  • resolveWorkoutNameForStartWorkout
  • resolveGoalValueForStartWorkout
  • DemoAppSiriIntent
  • resolveWorkoutLocationTypeForStartworkout
  • resolveIsOpenEndedForStartWorkout
  • confirmStartWorkout
  • handleStartWorkout


Поряд з файлом «IntentHandler.m» ми бачимо plist з налаштуваннями нашого «Intent» розширення «Info.plist».

Перевіряємо, що в гілці "NSExtension -> NSExtensionAttributes -> IntentsSupported" перераховані всі наші Intents для роботи з Siri Workout:

  1. Item 0: INStartWorkoutIntent
  2. Item 1: INPauseWorkoutIntent
  3. Item 2: INResumeWorkoutIntent
  4. Item 3: INCancelWorkoutIntent
  5. Item 4: INEndWorkoutIntent


image

Якщо ми продублюємо дані «Intents» в гілку "NSExtension -> NSExtensionAttributes -> IntentsRestrictedWhileLocked", то Siri зможе викликати функції з нашого додатка навіть з заблокованого пристрою.

Тепер переходимо до файлу «MainInterface.storyboard» і для демо додатки додаємо на нього два UILabel, один з них буде лічильником, для демонстрації того, що наш UI інтерфейс всередині Siri може оновлюватися в реальному часі.

image

Важливо відзначити, що даний інтерфейс не може містити «gesture recognizers» і перехоплювачі подій натискання пальцями і, при закриття даного вікна, Siri звільнить всі об'єкти в пам'яті.

На схемі ми можемо ознайомитися з життєвим циклом нашого «Siri view інтерфейсу».

image

Отже, саме час скомпілювати наш додаток і перевірити, чи працюють голосові команди. Тестувати даний приклад вийде тільки на реальному пристрої, для початку збираємо додаток як звичайно:

image

Потім натискаємо на Stop і окремо компілюємо наше розширення, вибравши схему «DemoAppSiriIntent». Під час компіляції Xcode запитає нас, для якого додатка ми збираємо дане розширення, і в списку ми вказуємо «DemoApp».

image

На цьому етапі ми побачимо, що наш додаток з'являється на секунду і тут же зникає, це не «виліт», всі функції виводу NSLog з файлу «IntentHandler.m» показують нам, що все працює.

Ах так, трохи не зыбыл, в налаштуваннях нашого iOS девайса заходимо в розділ Siri і встановлюємо галочку навпроти нашої програми «DemoApp»:

image

Отже, саме час вимовити вголос «Hey, Siri, start workout in DemoApp»


Результат ви можете побачити на цьому відео:



Тепер ми переконалися, що все працює, давайте додамо підтримку повідомлень в наш додаток.

Перейшовши за посиланням, ви можете ознайомитися з усіма «Intent» методами, які підтримуються в даний момент Siri:
https://developer.apple.com/...

Зараз нас цікавить секція «Messaging», відкриваємо наш «IntentHandler.m файл, прописуємо delegate повідомлення:

@interface IntentHandler () <INSendMessageIntentHandling>


Утримуючи затиснутою CMD — клікаємо на «INSendMessageIntentHandling» і бачимо, що необхідною функцією в цей раз є «handleSendMessage». Для початку присвоюємо «Intent» для повідомлень у функції «handlerForIntent»:

- (id)handlerForIntent:(INIntent *)intent {
id handler = nil;
if ([intent isKindOfClass:[INSendMessageIntent class]]) {
handler = self;
}
handler = self;
return handler;
}


І потім пишемо callback функцію для нашого «Intent»:

- (void)handleSendMessage:(INSendMessageIntent *)intent completion:(void (^)(INSendMessageIntentResponse * _Nonnull))completion {
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:NSStringFromClass([INSendMessageIntent class])];
INSendMessageIntentResponse *response = [[INSendMessageIntentResponse alloc] initWithCode:
INSendMessageIntentResponseCodeSuccess userActivity:userActivity];
NSLog(@"handleSendMessage");
completion(response);
}


Не забуваємо прописати наш новий «Intent» plist.info у гілку "NSExtension -> NSExtensionAttributes -> IntentsSupported":

image

Ось і все, цю статтю я написав у дуже стислі строки, але якщо вам цікава ця тема, дайте знати в коментарях, я можу написати більш розширену публікацію, що включає такі нюанси, як локалізація команд Siri в нашому додатку, робота з картами, складання синонімів для голосових фраз і повчальні фрази для Siri, ну і звичайно ж проблеми бета версії Xcode 8.

Вихідні файли проекту з даної статті ви можете завантажити за посиланням:

http://big-lab.com/images/articles/sirikit/DemoApp.zip
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.