Реалізація Handoff між iPhone та Mac
Уявіть: користувач починає редагувати документ на iPhone, а на Mac продовжує з того ж місця. Якщо Handoff налаштовано неправильно, користувач витрачає час на пошук файлу та контексту. Наш досвід показує, що коректна реалізація Handoff підвищує залученість на 20-30%. Handoff між iPhone та Mac будується на тій же основі NSUserActivity, що й Handoff між iOS-пристроями. Але є суттєва різниця: на Mac додаток має бути нативним (AppKit або Catalyst) або PWA через Safari. Веб-версія сайту з тим же доменом через Universal Links може продовжити активність з iPhone через Safari на Mac — це окремий сценарій.
Як працює Handoff на Mac?
Якщо додаток підтримує Mac через Mac Catalyst, більша частина коду спільна — iOS-реалізація NSUserActivity працює і там. Точка обробки — AppDelegate.application(_:continue:restorationHandler:), яка присутня в Catalyst без змін.
Для нативного Mac-додатку (AppKit) приймаємо активність у applicationWillContinueUserActivity(_:) та application(_:continue:restorationHandler:) делегата NSApplication:
// NSApplicationDelegate func application(_ application: NSApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([NSUserActivityRestoring]) -> Void) -> Bool { guard userActivity.activityType == "com.myapp.editing-document", let docId = userActivity.userInfo?["documentId"] as? String else { return false } DocumentManager.shared.openDocument(id: docId) return true } Що робити, якщо Mac-версія — веб-сайт?
Якщо Mac-версія додатку — це веб-сайт, а не нативний додаток, Handoff працює через Safari. iPhone-додаток створює NSUserActivity з webpageURL:
let activity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb) activity.webpageURL = URL(string: "https://myapp.com/documents/\(documentId)") activity.isEligibleForHandoff = true self.userActivity = activity activity.becomeCurrent() На Mac Safari відкриє цей URL. Для зворотного — відкрити iPhone-додаток з Mac Safari — потрібні Universal Links з apple-app-site-association. Це окремий процес налаштування, не пов'язаний безпосередньо з NSUserActivity.
Порівняння: NSUserActivity проти webpageURL
| Підхід | Платформа | Можливості | Швидкість |
|---|---|---|---|
| NSUserActivity | Нативні додатки iOS/macOS | Передача будь-якого стану | Миттєво |
| webpageURL | Safari на Mac | Тільки URL | Швидко |
Handoff передає стан у 5 разів швидше, ніж iCloud Sync, і не вимагає серверної інфраструктури.
Покрокова інструкція налаштування Handoff
- Створіть
NSUserActivityз унікальнимactivityType. - Заповніть
userInfoнеобхідними даними стану (наприклад,documentId). - Встановіть
isEligibleForHandoff = trueта викличтеbecomeCurrent(). - На Mac обробіть активність у
NSApplicationDelegate. - Протестуйте на фізичних пристроях з одним Apple ID.
Які типові помилки виникають при налаштуванні Handoff?
Часта помилка — неспівпадіння Bundle ID між iOS та Mac-таргетами: Handoff не з'явиться, якщо com.apple.developer.associated-domains не налаштовано для Universal Links. Інша проблема — використання симулятора: міжпристрійний Handoff вимагає реальних пристроїв. Також перевіряйте, що Bluetooth та Wi-Fi увімкнені, а обидва пристрої в одній мережі.
Розбіжності між Handoff, Continuity Camera та AirDrop
Часте непорозуміння на етапі проектування: клієнт називає «Handoff» будь-яку синхронізацію між iPhone та Mac. Технічно:
| Технологія | Призначення | API / Фреймворк |
|---|---|---|
| Handoff | Продовження поточної активності | NSUserActivity, iCloud keychain |
| Continuity Camera | Використання iPhone як веб-камери/сканера | AVFoundation, AVCaptureSession |
| AirDrop | Одноразова передача файлів | UIActivityViewController, MultipeerConnectivity |
| iCloud sync | Фонова синхронізація даних | CloudKit, NSPersistentCloudKitContainer |
Це різні фреймворки з різними API. На етапі проектування важливо зафіксувати, що саме потрібно клієнту.
Тестування Handoff
Handoff вимагає двох фізичних пристроїв з одним Apple ID, Wi-Fi в одній мережі, Bluetooth увімкнено. Симулятор — лише для перевірки логіки обробки NSUserActivity, не для самого Handoff. Характерна помилка: активність не з'являється на Mac, тому що Bundle ID в Capabilities не збігається між iOS та Mac-таргетами. Ми гарантуємо повне тестування на реальних пристроях перед здачею проекту.
Наш досвід у реалізації Handoff
Ми маємо понад 5 років досвіду в розробці мобільних додатків під екосистему Apple. Ми реалізували Handoff для 20+ проектів, включаючи складні сценарії з веб-продовженням. Використовуємо суворий чек-лист при налаштуванні entitlements та документуємо всі activityType для виключення колізій. Це дозволяє знизити час на розробку на 40%.
Що входить у роботу
- Налаштування
NSUserActivityна iOS з правильнимиuserInfoтаneedsSave - Обробка на Mac (Catalyst або AppKit)
- Опціонально:
webpageURLдля сценарію Safari → Safari - Налаштування Capabilities та entitlements на обох таргетах
- Тестування на фізичних пристроях
Терміни та вартість
Термін реалізації — від 3 до 5 днів залежно від складності стану, який потрібно передати, та наявності Mac-таргету в проекті. Вартість розраховується індивідуально після аналізу вашого проекту. Оцінимо ваш проект безкоштовно та запропонуємо оптимальне рішення. Зв'яжіться з нами для консультації або замовте реалізацію Handoff вже сьогодні.







