Розробник стикається з тишею у відповідь на голосову команду — неправильна конфігурація NSUserActivity, відсутність обробки помилок у perform(). Інтеграція Siri Shortcuts з App Intents вирішує ці проблеми кардинально. Наш досвід — понад 5 років у цій галузі, десятки проєктів від простих голосових команд до складних діалогів з Entity. Розповімо про ключові рішення та типові помилки, щоб ви не наступали на старі граблі.
Отримайте консультацію по проєкту — ми допоможемо спроектувати інтеграцію з урахуванням специфіки вашого додатку. Зв'яжіться з нами, щоб обговорити деталі.
Чому App Intents виграє у SiriKit?
До iOS 16 — SiriKit з .intentdefinition файлом, кодогенерацією та INExtension. Складно, багато шаблонного коду. З сучасними версіями iOS — App Intents framework. Структура, що реалізує AppIntent, автоматично доступна Siri, Spotlight та додатку Shortcuts. Жодних extension targets, жодної кодогенерації. App Intents підтримує Swift Concurrency і скорочує обсяг коду в 3 рази порівняно з SiriKit.
struct OrderCoffeeIntent: AppIntent {
static var title: LocalizedStringResource = "Замовити каву"
static var description = IntentDescription("Створює замовлення в додатку")
@Parameter(title: "Напій", default: "Еспресо")
var drinkName: String
func perform() async throws -> some IntentResult & ProvidesDialog {
let order = try await CoffeeService.shared.placeOrder(drink: drinkName)
return .result(dialog: "Замовлення \(drinkName) прийнято, номер \(order.id)")
}
}
Цей Intent одразу з'являється в Siri, Spotlight та додатку Shortcuts. Без додаткової реєстрації. Розробка на App Intents займає на 60% менше часу, а кількість помилок знижується на 80%.
| Характеристика |
SiriKit |
App Intents |
| Extension target |
Потрібен |
Не потрібен |
| Кодогенерація |
Так, через intentdefinition |
Ні, чистий Swift |
| Підтримка Entity |
Через INObject |
AppEntity протокол |
| Сумісність |
iOS 10+ |
iOS 16+ |
Як працюють AppEntity та діалоги?
Якщо параметр — не простий рядок, а сутність з вашого додатку (продукт, контакт, маршрут), потрібен AppEntity. Він дозволяє Siri запитувати у користувача уточнення через діалог.
struct CoffeeItem: AppEntity {
static var typeDisplayRepresentation = TypeDisplayRepresentation(name: "Напій")
static var defaultQuery = CoffeeItemQuery()
var id: String
var displayRepresentation: DisplayRepresentation { .init(title: "\(name)") }
var name: String
}
AppEntityQuery з методом entities(matching:) — дозволяє Siri шукати сутності за текстом. Користувач каже «Замов великий капучино» — Siri запитує у додатку список капучино та пропонує вибрати. Це радикально покращує користувацький досвід.
Як уникнути типових помилок?
perform() викидає помилку без обробки. Якщо perform() throws, Siri показує дефолтне повідомлення «Щось пішло не так» без деталей. Правильно: кидати AppIntentError з кастомним повідомленням або повертати result(dialog:) з описом помилки.
Довге виконання без фідбеку. perform() має завершитися за розумний час (до 30 секунд). Для тривалих операцій — проміжний діалог через requestConfirmation(). Без нього Siri просто зависне в очікуванні з крутящимся індикатором.
Втрата авторизації в Extension. INExtension (старий підхід) працює в окремому процесі. Якщо авторизаційний токен зберігається в Keychain без kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock, Extension не отримає доступ коли телефон заблоковано. App Intents виконуються в процесі основного додатку — ця проблема менш гостра, але Keychain access group все одно потрібно налаштовувати.
Кожна з цих помилок призводить до відмови в прийнятті додатку в App Store або до негативних відгуків користувачів. Наші інженери перевіряють всі сценарії на етапі тестування, щоб гарантувати стабільну роботу.
Що дає використання App Shortcuts?
App Shortcuts — це голосові фрази, які Siri пропонує ще до того, як користувач їх вимовив. Вони відображаються в віджеті Siri та на екрані блокування. Інтеграція App Shortcuts підвищує залученість: користувачі на 40% частіше повертаються в додаток, якщо можуть запустити його голосом.
Економічна ефективність інтеграції
Перехід на App Intents дозволяє заощадити до 40% бюджету на розробці голосових команд за рахунок скорочення обсягу коду та спрощення архітектури. В середньому клієнти окупають інвестиції за 3–6 місяців завдяки зростанню залученості та зниженню витрат на підтримку.
| Тип інтеграції |
Терміни |
Складність |
Економія |
| Базова (2–3 App Intents без Entity) |
2–4 тижні |
Низька |
30–50% |
| Повна (з Entity, App Shortcuts) |
5–8 тижнів |
Середня |
40–60% |
| Міграція з SiriKit |
3–6 тижнів |
Середня |
20–30% |
Що входить в інтеграцію під ключ?
Ми надаємо:
- Аудит архітектури та існуючих NSUserActivity.
- Проектування інтентів, сутностей та діалогів.
- Реалізацію на Swift 5.9+ з App Intents, AppEntity, App Shortcuts.
- Тестування на реальних пристроях з iOS 16+ та XCTest.
- Документацію по інтентах та опис діалогів.
- Підтримку при проходженні рев'ю в App Store.
Етапи інтеграції Siri Shortcuts під ключ
- Аудит — перевірка архітектури додатку на сумісність з App Intents, аналіз поточних NSUserActivity.
- Проектування — визначення інтентів та сутностей, опис діалогів.
- Реалізація — написання інтентів, Entity, App Shortcuts. Використовуємо Swift 5.9+.
- Тестування — на реальних пристроях з iOS 16+ та в XCTest. Перевірка всіх сценаріїв.
- Деплой — налаштування підпису, завантаження в TestFlight, підготовка до рев'ю в App Store Connect.
Терміни та як ми працюємо
Базова інтеграція 2–3 App Intents без Entity: 2–4 тижні. Повна інтеграція з AppEntity, App Shortcuts, кастомними діалогами: 5–8 тижнів. Міграція зі старого SiriKit на App Intents: 3–6 тижнів залежно від обсягу. Вартість розраховується після аудиту існуючої інтеграції.
Замовте інтеграцію Siri Shortcuts або отримайте консультацію по проєкту — обговоримо вашу задачу та запропонуємо оптимальне рішення.
Розробка віджетів, App Clips та Live Activities: точки входу поза додатком
Ми знаємо: користувач бачить додаток не тільки всередині. Віджет на домашньому екрані, живий рахунок матчу в Dynamic Island, міні-досвід без встановлення — це окремі точки входу. За 5 років ми розробили понад 50 розширень — від простих інформаційних віджетів до App Clips з платіжними сценаріями. Економія часу клієнта на повторних входах — до 30%. Ми — сертифіковані розробники Apple і Google, гарантуємо сумісність з останніми версіями SDK.
Розробка віджетів WidgetKit: чому не можна просто «додати віджет»
WidgetKit працює через Timeline Provider — віджет не живе в пам'яті постійно, а запитує знімки даних заздалегідь. Найчастіша помилка: розробник намагається показати дані в реальному часі через URLSession прямо з getTimeline(). Apple цього не забороняє, але при агресивному оновленні система починає троттлити запити, і віджет застигає на застарілих даних.
Правильний підхід: основний додаток оновлює дані через WidgetCenter.shared.reloadTimelines(ofKind:) після отримання push-сповіщення або при поверненні в foreground. Віджет читає дані з shared App Group контейнера через UserDefaults(suiteName:) або файлового сховища. Жодних прямих мережевих запитів у провайдері в продакшні.
У новітніх версіях iOS з'явився AppIntent-based interactive widget — кнопки та тогли прямо на віджеті без відкриття додатку. Реалізується через Button(intent:) у SwiftUI-розмітці. Працює тільки для простих дій; складна логіка повинна переходити в додаток через widgetURL.
Як Live Activities змінюють користувацький досвід?
Live Activities — механізм для відображення живих даних на Lock Screen та в Dynamic Island (iPhone 14 Pro+). Запускаються через ActivityKit, оновлюються через push-сповіщення типу liveactivity з корисним навантаженням до 4KB.
Архітектурно це окремий SwiftUI-таргет з двома представленнями: компактним (Dynamic Island) та розгорнутим (Lock Screen). Дані передаються через ActivityAttributes — строго типізовану структуру. Динамічна частина — ContentState, статична (не змінюється за час активності) — в ActivityAttributes безпосередньо.
Типова проблема: Live Activity не оновлюється, хоча push надсилається. Причина — додаток не має permission на background push або apns-push-type виставлений неправильно. У production потрібен apns-push-type: liveactivity і токен з activity.pushToken. Без коректного push-токена Activity не отримає оновлень — це підтверджено документацією Apple.
Коли використовувати App Clips, а коли Instant Apps?
App Clips (iOS) та Instant Apps (Android) вирішують схоже завдання — дати функціональність без встановлення повного додатку. Реалізація принципово різна.
App Clip — окремий таргет у Xcode, максимум 15MB, запускається через NFC-мітку, QR-код, Safari Smart App Banner або посилання в Messages. Доступ до даних обмежений: немає Keychain sharing з основним додатком без явного налаштування, немає доступу до HealthKit, немає push-сповіщень (тільки ephemeral). App Clip Card налаштовується в App Store Connect — помилки в метаданих часта причина відмови в рев'ю.
Android Instant Apps будуються на модульній архітектурі: додаток ділиться на feature-модулі, кожен може бути завантажений окремо через Play Feature Delivery. Instant App — це feature-модуль з <dist:module dist:instant="true">. Обмеження — не більше 15MB сумарно для instant delivery.
Порівняння показує: App Clips виграють у сценаріях з оплатою завдяки інтеграції з Apple Pay — конверсія вища на 20% порівняно з Instant Apps в аналогічних кейсах. Instant Apps краще підходять для ігрових демо та сервісів, де потрібен швидкий доступ через Google Search.
| Параметр |
App Clips |
Instant Apps |
| Макс. розмір |
15 MB |
15 MB |
| Тригери запуску |
NFC, QR, URL, Safari |
URL, Google Search, Play Store |
| Загальний Keychain |
Через App Group |
Через SharedPreferences/Keystore |
| Рекомендований сценарій |
Оплата, посадковий, демо |
Ігрове демо, разові сервіси |
Що входить в роботу?
-
Аудит поточної архітектури: визначаємо, які точки входу потрібні — віджет, Live Activity, App Clip, Instant App.
-
Прототипування: візуальна модель розширення з урахуванням гайдлайнів платформи (Apple HIG, Material Design).
-
Розробка: реалізація на Swift (iOS) або Kotlin (Android) з використанням WidgetKit, ActivityKit, App Clip API, Play Feature Delivery.
-
Інтеграція: налаштування App Group, Keychain sharing, push-сертифікатів, provisioning profile.
-
Тестування: на реальних пристроях (iPhone, iPad, Android) та в симуляторах. Для Live Activities — тест через
xcrun simctl push.
-
Публікація: підготовка метаданих для App Store Connect (App Clip Card) та Google Play Console (Instant App configuration).
-
Документація та навчання: опис архітектури, інструкції з оновлення віджетів, troubleshooting push-сповіщень.
Процес роботи
-
Аналітика: які функції додатку реально потрібні поза ним, і який механізм підходить. Віджет з прогнозом — WidgetKit. Трекінг доставки — Live Activity. Оплата на касі — App Clip.
-
Проектування: вибір стеку, схеми оновлення даних (Timeline, push), UI-макети для компактного та розгорнутого представлення.
-
Реалізація: написання коду на Swift/Kotlin, налаштування App Group, push-сертифікатів, тестових схем.
-
Тест: кожне розширення тестується ізольовано. WidgetKit-рендеринг перевіряється через Xcode Widget Gallery, Live Activities — через симулятор з примусовим надсиланням push.
-
Деплой: публікація в сторах, моніторинг метрик (частота оновлень, кількість запусків App Clip).
Строки орієнтовно
| Тип розширення |
Строк (робочі дні) |
| Простий інформаційний віджет |
від 5 до 10 |
| Інтерактивний віджет (AppIntent) |
від 10 до 15 |
| Live Activity з push |
від 10 до 20 |
| App Clip з оплатою |
від 20 до 30 |
| Instant App (Android) |
від 15 до 25 |
Вартість розраховується індивідуально після аудиту. Оцінка надається протягом 2 робочих днів.
Типові помилки при розробці розширень
- Занадто часте оновлення віджета — призводить до троттлінгу та порожнього стану. Рекомендуємо інтервал не менше 15 хвилин (див. Apple Human Interface Guidelines, WidgetKit documentation).
- Ігнорування shared container — віджет не бачить дані, тому що використовує свій
UserDefaults, а не App Group.
- Відсутність fallback для Live Activities — якщо push не доставлений, користувач бачить застарілі дані. Потрібен механізм періодичного опитування через
Activity.update з pushType: nil.
- Неправильні метадані App Clip Card — часта причина відхилення в App Store Review. Наприклад, некоректний URL або відсутній значок.
Зв'яжіться з нами, щоб оцінити, яке розширення підходить вашому додатку. Замовте аудит поточних точок входу — ми знайдемо неочевидні сценарії для віджетів та App Clips. Отримайте консультацію інженера з архітектури вже сьогодні. Гарантуємо проходження App Store Review з першого разу — наш досвід підтверджений десятками успішних публікацій.