Реализация 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 уже сегодня.







