Користувач витратив 20 хвилин на заповнення заявки на телефоні, відволікся, відкрив ноутбук — форма порожня. Згідно з даними аналітики, близько 40% користувачів кидають багатокрокові форми через відсутність збереження прогресу. Це призводить до втрати до 30% конверсії на формах оформлення замовлення або реєстрації. Handoff вирішує цю проблему: почав на одному пристрої, продовжив на іншому без втрати контексту. Ми реалізуємо handoff-механізми під ключ, гарантуючи безшовну передачу контексту між будь-якими пристроями. Наша команда має понад 5 років досвіду в інтеграції як нативних, так і серверних рішень. Для iOS і macOS використовуємо Apple Handoff, для Android і Windows — серверну сесію, а для гібридних сценаріїв — комбінацію обох підходів.
Apple Handoff: мінімальна розробка, але тільки Apple
NSUserActivity — фреймворк Apple для передачі контексту через iCloud. Підтримує iOS, macOS, iPadOS. Працює автоматично при коректному налаштуванні activityType та userInfo. Однак вимагає єдиного облікового запису iCloud та активного Bluetooth/Wi-Fi. Згідно з документацією Apple, обсяг передаваних даних обмежений ~256 КБ. Для React Native використовуємо нативний модуль:
let activity = NSUserActivity(activityType: "com.yourapp.editDocument") activity.title = "Редагування документа" activity.userInfo = ["documentId": documentId, "scrollPosition": scrollY, "formData": formData] activity.isEligibleForHandoff = true activity.becomeCurrent() На стороні, що приймає, AppDelegate отримує application(_:continue:restorationHandler:) з цим NSUserActivity. Дані userInfo обмежені ~256 КБ. Для клієнта, у якого Android-телефон та Windows-ноутбук — не працює.
Коли Apple Handoff недостатньо?
Handoff від Apple не підходить для крос-екосистемних сценаріїв. Якщо користувачі працюють з Android, Windows або кількома акаунтами — потрібне серверне рішення. Наприклад, застосунок інтернет-магазину: клієнт почав оформлення замовлення на Android, а завершує на Windows — дані мають бути синхронізовані.
Чому автозбереження критичне?
Автозбереження стану задачі в реальному часі знижує навантаження на підтримку: користувачі рідше скаржаться на втрату даних. При кожному значущому дії (перехід на крок, введення тексту, вибір опції) серіалізований стейт надсилається на сервер. Debounce на 1 секунду знижує кількість запитів на 80% порівняно зі збереженням кожної події введення. Це особливо важливо для мобільних мереж з нестабільним зв'язком.
Як реалізувати кросплатформний Handoff?
Універсальний підхід: сесія задачі зберігається на сервері, прив'язана до акаунта, а не до пристрою.
type TaskSession = { sessionId: string; userId: string; taskType: 'checkout' | 'editDocument' | 'formFill' | 'mediaUpload'; state: Record<string, unknown>; // серіалізований стейт задачі activeDeviceId: string; updatedAt: number; expiresAt: number; }; Granular state: зберігаємо лише необхідні поля. Для форми — step, заповнені поля, статус валідації. Чутливі дані (CVV, PIN) ніколи не зберігаємо. Conflict resolution: останній запис перемагає (LWW) для простоти; для складних задач — vector clocks. Виявлення активних сесій: при відкритті застосунку перевіряємо незавершені сесії.
Як повідомити другий пристрій про сесію?
Існує кілька способів: push-сповіщення (silent push з sessionId), deep link (yourapp://handoff/session/abc123), QR-код, автоматичний опитувач. Автоматичний опитувач дає кращий UX, але вимагає чіткої політики privacy: користувач повинен бачити активні сесії.
| Метод сповіщення | Затримка | UX | Вимоги |
|---|---|---|---|
| Push-сповіщення | 1–5 секунд | Середній | Налаштувати APNs/FCM |
| Deep link | Миттєво | Високий | Обробка URL |
| QR-код | 10–30 секунд | Середній | Екран з QR |
| Автоматичний опитувач | 10–30 секунд | Високий | API для списку сесій |
Порівняння методів Handoff
| Критерій | Apple NSUserActivity | Серверна сесія | Гібрид |
|---|---|---|---|
| Екосистема | Тільки Apple | Всі платформи | Apple + решта |
| Затримка | 0–1 секунда | 200–500 мс | 0–1 сек (Apple) / 200–500 мс (решта) |
| Розробка | Мінімальна | Середня | Висока |
| Універсальність | Низька | Висока | Дуже висока |
Що входить в роботу?
- Проєктування схеми даних для зберігання сесій та API-ендпоінтів.
- Реалізація серверної логіки (збереження, відновлення, видалення сесій).
- Інтеграція з клієнтськими застосунками (автозбереження, виявлення активних сесій).
- Налаштування push-сповіщень (APNs/FCM) та deep link (Universal Links / App Links).
- UI для відновлення сесії (діалог, екран вибору).
- Документація з інтеграції, рекомендації з безпеки та навчання команди.
- Підтримка протягом 2 тижнів після релізу.
Етапи розробки handoff-механізму
- Проєктування схеми даних для зберігання сесій.
- Реалізація серверних ендпоінтів (збереження, відновлення, видалення).
- Інтеграція з клієнтськими застосунками (автозбереження, виявлення сесій).
- Реалізація сповіщень (push, deep link) та UI для відновлення.
- Тестування сценаріїв на різних пристроях та ОС.
- Документація з інтеграції та рекомендації з безпеки.
Чек-лист перевірок handoff
- Сесія коректно зберігається при переході в фон.
- Дані відновлюються при відкритті на іншому пристрої.
- Чутливі поля виключені з серіалізації.
- Push-сповіщення надсилається при збереженні.
- Deep link верифікується.
Оцінка
Серверна сесія задач з deep link, автозбереженням та UI: від 3 до 5 тижнів. З Apple NSUserActivity + кросплатформним fallback: від 4 до 6 тижнів. Вартість розраховується індивідуально після аналізу проєкту.
Отримайте консультацію — ми допоможемо підібрати оптимальний Handoff-механізм. Замовте розробку handoff у ваш застосунок.







