Налаштування App Clips для iOS (мініпрограми)
App Clip — це частина основної програми вагою до 15 МБ, яку користувач запускає моментально через QR-код, NFC-метку, Safari Banner або посилання в Maps — без установки повної програми. Платіж за парковку, швидкий заказ в кафе, реєстрація на мероприятие: сценарії, де вимога «спочатку встанови програму» убиває конверсію.
Архітектура: таргет та shared код
App Clip — окремий таргет в Xcode (AppClip), не окрема програма. Він ділить код з основною програмою через shared frameworks або прямого включення файлів в обидва таргети. Принципіальне обмеження: App Clip не може звертатися до даних основної програми (різні sandbox), але може передавати дані при наступній установці через NSUserActivity.
Структура проекту:
MyApp (основний таргет)
├── Sources/
│ ├── SharedFeatures/ ← компілюється в обидва таргети
│ └── MainAppOnly/
MyAppClip (App Clip таргет)
└── Sources/
└── ClipEntry.swift
Додати файл в обидва таргети: Build Phases → Compile Sources → додати спільні файли в MyAppClip.
Info.plist App Clip вимагає словника NSAppClip з NSAppClipRequestEphemeralUserNotification та NSAppClipRequestLocationConfirmation — якщо потрібні сповіщення та геолокація. Без явного указання Clip не зможе запитати ці дозволи.
App Clip Experience URL
Кожен App Clip запускається по URL. URL реєструється в App Store Connect → App Clips → Add New App Clip Experience. Формат:
https://example.com/clips/parking?lot=A1
У коді App Clip обробляємо URL через NSUserActivityTypes → NSUserActivityTypeBrowsingWeb:
@main
struct AppClipEntry: App {
var body: some Scene {
WindowGroup {
ContentView()
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb) { activity in
guard let url = activity.webpageURL else { return }
handleClipURL(url)
}
}
}
func handleClipURL(_ url: URL) {
// Парсим параметри: lot=A1
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let lot = components?.queryItems?.first(where: { $0.name == "lot" })?.value
// Відкриваємо потрібний екран
}
}
URL-асоціація настраивається через файл apple-app-site-association на сервері:
{
"appclips": {
"apps": ["TEAMID.com.example.myapp.Clip"]
}
}
Файл повинен бути доступний по https://example.com/.well-known/apple-app-site-association з Content-Type application/json.
Платежі та авторизація в App Clip
Apple Pay — працює в App Clip без обмежень. Саме тому платіжні сценарії — основне застосування Clips. PKPaymentAuthorizationViewController підключається стандартно.
Sign in with Apple — працює. Важливо: користувач отримує eфемерний ідентифікатор для App Clip, відмінний від ідентифікатора в основній програмі. При установці повної програми потрібно обробити міграцію через SKOverlay:
// Запропонувати установку повної програми після успішної дії
let config = SKOverlay.AppClipConfiguration(position: .bottom)
let overlay = SKOverlay(configuration: config)
overlay.present(in: windowScene)
Ephemeral notifications — App Clip може запитати дозвіл на сповіщення без стандартного системного діалогу дозволів, але тільки на час сесії Clip (8 годин). Запитуються через NSAppClipRequestEphemeralUserNotification.
Тестування
Локальне тестування: схема MyAppClip + environment variable _XCAppClipURL з тестовим URL. Xcode запускає Clip в режимі симуляції без необхідності реєстрації в App Store Connect.
Scheme Environment Variables:
_XCAppClipURL = https://example.com/clips/parking?lot=A1
Тестування через TestFlight: повна App Clip переживання з реальним QR/NFC — тільки через TestFlight або продакшн. Симулятор не підтримує NFC.
Обмеження, про які потрібно знати
- Нема доступу до HealthKit, HomeKit, CallKit
- Нема фонових завдань (Background Tasks)
- CloudKit доступен тільки для читання публічних записів
- Розмір 15 МБ — після компресії App Store, не розмір бандла в проекті
Ориентири по срокам
Налаштування App Clip таргета, URL association, базовий флоу з Apple Pay — 3 дні. Повноцінний сценарій з передачею даних в основну програму, SKOverlay, тестуванням через TestFlight — 4–5 днів.







