App Extensions — це окремі виконувані модулі, що розширюють можливості мобільного додатка за межі його основного інтерфейсу: Today Widget на домашньому екрані, обробка VoIP-дзвінків через CallKit та реакція на системні події через BroadcastReceiver. Системні інтеграції дозволяють додатку взаємодіяти з операційною системою на глибокому рівні, відкриваючи функції, недоступні звичайним екранам. Згідно з документацією Apple Developer, кожне розширення працює в ізольованому процесі та керується системою незалежно від основного додатка. App Extensions у мобільному додатку дозволяють реалізувати функції, недоступні в основному процесі.
Головне
App Extensions на iOS з'явилися в iOS 8 і стали фундаментом для системних інтеграцій у мобільній розробці. Це окремі бінарники, упаковані разом з основним додатком, але запущені в ізольованому процесі. Кожне розширення має власний Info.plist та точку входу, задану через NSExtensionPrincipalClass. Система керує життєвим циклом App Extensions — вони не можуть залишатися у фоновому режимі після завершення завдання.
WidgetKit (iOS 14+) — сучасний фреймворк для створення віджетів на домашньому екрані. WidgetKit використовує SwiftUI для опису інтерфейсу та TimelineProvider для визначення розкладу оновлень. Віджети бувають трьох розмірів: малий (2×2 комірки), середній (4×2) та великий (4×4). Старий Today Widget на UICollectionViewController підтримується, але Apple рекомендує мігрувати на WidgetKit. App Extensions на WidgetKit не підтримують анімацію, клавіатурне введення та жести — це статичні або псевдоанімовані елементи з періодичним оновленням.
Share Extension дозволяє надсилати контент з будь-якого додатка у ваш через системний лист «Поділитися». Share Extension отримує дані через NSExtensionItem та використовує SLComposeServiceViewController для UI. Action Extension обробляє контент на місці — наприклад, перекладає текст у браузері без переходу в інший додаток. Обидва типи повинні завершити роботу за обмежений час, інакше система «вбиває» розширення. Це важливе обмеження App Extensions у мобільному додатку — фонові завдання недоступні на рівні розширень.
Системні інтеграції на iOS виходять далеко за рамки віджетів: CallKit, PushKit та SiriKit дозволяють мобільному додатку працювати на системному рівні. Ці фреймворки вимагають спеціальних entitlements, але дають користувачеві безшовний досвід — дзвінки через CallKit виглядають як звичайні телефонні, а Siri обробляє запити без відкриття додатка.
CallKit інтегрує дзвінки сторонніх додатків у системний екран виклику, включаючи заблокований екран. Провайдер CXProvider реєструє додаток як VoIP-сервіс, а CXCallController керує дзвінками. CallKit автоматично блокує дублюючі дзвінки та підтримує Call Directory Extension для блокування небажаних номерів. Системні інтеграції в мобільній розробці з CallKit критичні для додатків голосового зв'язку — WhatsApp, Skype та Zoom використовують його для відображення вхідних дзвінків.
PushKit доставляє push-сповіщення безпосередньо в мобільний додаток без показу користувачеві. PushKit пробуджує додаток з «убитого» стану та передає дані через делегат PKPushRegistryDelegate. Це основний механізм для VoIP-додатків: PushKit доставляє інформацію про дзвінок, а CallKit відображає її. PushKit має вищий пріоритет доставки, ніж звичайні push-сповіщення, і не потребує показу банера. App Extensions у мобільних додатках часто комбінують PushKit з CallKit для організації голосового зв'язку.
SiriKit дозволяє обробляти запити через Siri та додаток «Команди». Intents Extension — окремий App Extension, який реєструє підтримувані інтенти та обробляє їх. SiriKit підтримує 20+ доменів: дзвінки, повідомлення, платежі, нотатки, тренування. Швидкі команди дозволяють користувачеві створювати автоматизації — наприклад, «Надіслати повідомлення в WhatsApp через Siri». Системні інтеграції з SiriKit та Швидкими командами підвищують залученість, оскільки користувач виконує дії без відкриття додатка.
BroadcastReceiver — компонент Android, який реагує на системні широкомовні повідомлення. На відміну від iOS App Extensions, BroadcastReceiver не потребує окремого бінарника — достатньо зареєструвати ресивер у маніфесті або в коді через Context.registerReceiver. Системні інтеграції на Android часто починаються з BroadcastReceiver: від запуску сервісу при завантаженні пристрою до реакції на підключення до мережі.
IntentFilter зв'язує BroadcastReceiver з конкретною системною подією. Типові події: BOOT_COMPLETED (завантаження пристрою), CONNECTIVITY_ACTION (зміна мережі), BATTERY_LOW (низький заряд), TIME_SET (зміна часу). Ресивер реєструється в AndroidManifest.xml або через Context.registerReceiver для динамічної реєстрації. Динамічна реєстрація краща — вона не потребує дозволів у маніфесті та діє тільки при активному додатку. App Extensions на Android не існують як концепція, але BroadcastReceiver виконує схожу роль — розширює можливості додатка за рахунок системних інтеграцій.
NotificationListenerService — сервіс, який отримує всі сповіщення системи. NotificationListenerService потребує дозволу BIND_NOTIFICATION_LISTENER_SERVICE та доступу через налаштування спеціальних можливостей. AccessibilityService — потужніший інструмент для системної інтеграції: він може читати вміст екрана, симулювати натискання та автоматизувати дії. Обидва сервіси вимагають явного ввімкнення користувачем у налаштуваннях, що підвищує безпеку. Системні інтеграції в мобільному додатку через AccessibilityService використовуються для авто-філерів, читалок екрана та інструментів доступності.
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
WorkManager.getInstance(context)
.enqueueUniqueWork("post-boot", ...)
}
}
}
Приклад реєструє BroadcastReceiver для події BOOT_COMPLETED. WorkManager використовується для відкладеного виконання завдання після завантаження пристрою — це стандартний підхід для Android-додатків.
App Widget Provider на Android — аналог iOS App Extensions у контексті віджетів: це компонент, який відображає інтерактивний контент на домашньому екрані. На відміну від WidgetKit, Android-віджети можуть приймати введення користувача — натискання, перемикання та жести. App Widget Provider реєструється в маніфесті через XML-опис розміру та частоти оновлення.
RemoteViews описує інтерфейс віджета через XML-розмітку та підтримує лише обмежений набір View. RemoteViews не дозволяє використовувати кастомні View — лише стандартні компоненти: TextView, ImageView, Button, ProgressBar. AppWidgetProvider — базовий клас, який обробляє оновлення, ввімкнення та видалення віджета. Метод onUpdate викликається за таймером через updatePeriodMillis або через WorkManager для точного контролю. Системні інтеграції з віджетами на Android вимагають обережності — занадто часте оновлення витрачає батарею.
Glance API — Jetpack-бібліотека для створення віджетів на Kotlin DSL замість XML. Glance API компілюється в RemoteViews та підтримує Compose-подібний синтаксис: GlanceComposable, Column, Row, Text. Бібліотека вирішує проблему складного XML-коду та дозволяє тестувати віджети через JUnit. Glance API поки не підтримує всі можливості RemoteViews — для складних інтерактивних віджетів краще використовувати класичний підхід. App Extensions у мобільній розробці на Android еволюціонують у бік Glance API, спрощуючи створення та підтримку віджетів.
Content Provider — компонент Android для обміну структурованими даними між додатками через єдиний інтерфейс ContentResolver. На відміну від iOS App Extensions, Content Provider не створює окремий процес — дані запитуються синхронно в контексті викликаючого додатка. Content Provider лежить в основі системних інтеграцій на Android: контакти, медіафайли, календар та стандартні додатки використовують його для публікації даних.
FileProvider — підклас ContentProvider для безпечної передачі файлів між додатками. FileProvider генерує тимчасові content:// URI замість прямих file:// шляхів, які заборонені на Android 7+. Для використання потрібно вказати files-path або external-files-path у XML-конфігурації. App Extensions у мобільній розробці на Android не існують як окрема концепція, але FileProvider виконує їхню функцію — розширює можливості обміну даними за межі одного додатка.
На iOS роль обміну файлами виконує File Provider Extension. File Provider Extension публікує файли додатка в Files App через NSFileProviderManager. На відміну від FileProvider, iOS-розширення потребує окремого бінарника та працює в ізольованому процесі. File Provider Extension підтримує NSFileProviderItem для опису файлів та NSFileProviderEnumerator для навігації по папках. Системні інтеграції в мобільних додатках через File Provider Extension дозволяють користувачеві керувати файлами додатка з Files App без його відкриття.
class MyFileProviderExtension: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
return MyFileProviderItem(identifier: identifier)
}
}
Приклад показує мінімальну реалізацію File Provider Extension на Swift. Метод item(for:) повертає об'єкт NSFileProviderItem за ідентифікатором — система викликає його при відображенні файлів у Files App.
Часто задавані питання
App Extensions — це окремі бінарники, що розширюють функціональність додатка за межі його процесу: Today Widget, Share Extension, Action Extension, Keyboard Extension та інші типи, що працюють в ізольованому середовищі.
CallKit інтегрує VoIP-дзвінки в системний інтерфейс виклику з відображенням на заблокованому екрані. PushKit доставляє фонові push-сповіщення без показу користувачеві — він пробуджує додаток для обробки даних, наприклад, інформації про вхідний дзвінок.
BroadcastReceiver — компонент Android, який реагує на системні широкомовні повідомлення: завантаження пристрою (BOOT_COMPLETED), підключення до мережі (CONNECTIVITY_ACTION), зміна режиму польоту та інші події ОС.
Використовуйте AppWidgetProvider з RemoteViews для створення інтерфейсу віджета або Glance API (Jetpack) для Kotlin DSL-підходу. Віджет реєструється в маніфесті через XML-опис із зазначенням розміру та частоти оновлення.
Content Provider — компонент Android для обміну даними між додатками через ContentResolver. Він використовується для доступу до контактів, медіафайлів та будь-яких структурованих даних з інших додатків.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.