Реализация Handoff между iOS-устройствами

Реализация Handoff между iOS-устройствами В проекте по разработке редактора заметок мы столкнулись с задачей: пользователь пишет текст на iPad, закрывает планшет и открывает iPhone в метро — приложение должно подхватить ту же заметку с тем же курсором. **Handoff** — технология из набора [Continui

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация Handoff между iOS-устройствами
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Реализация Handoff между iOS-устройствами

В проекте по разработке редактора заметок мы столкнулись с задачей: пользователь пишет текст на iPad, закрывает планшет и открывает iPhone в метро — приложение должно подхватить ту же заметку с тем же курсором. Handoff — технология из набора Continuity решает это на системном уровне. Расскажем, как внедрить передачу состояния между iOS-устройствами без боли, опираясь на опыт 30+ проектов и гарантируя стабильную работу на iOS 14+.

Handoff использует Bluetooth LE для обнаружения устройств и iCloud для передачи payload. Устройства должны быть авторизованы в одном Apple ID. Значок приложения появляется в Dock на Mac или в App Switcher на другом iPhone/iPad — пользователь тапает, открывается приложение в том же состоянии. Чтобы всё работало стабильно, важно правильно настроить lifecycle активности. В этом руководстве разберём все шаги: от регистрации activityType до обработки продолжения задачи на принимающем устройстве. Уделим внимание типичным ошибкам и способам их отладки.

Как настроить NSUserActivity?

Handoff строится на NSUserActivity. Тот же класс используется для Spotlight и Siri Shortcuts — это единая Activity архитектура Apple.

// На отправляющем устройстве let activity = NSUserActivity(activityType: "com.yourapp.editDocument") activity.title = document.title activity.isEligibleForHandoff = true activity.userInfo = ["documentId": document.id, "scrollPosition": scrollOffset] activity.needsSave = true self.userActivity = activity activity.becomeCurrent() 

activityType — строка из массива NSUserActivityTypes в Info.plist. Если тип не зарегистрирован, Handoff не работает.

needsSave и userActivityWillSave — если состояние меняется часто (позиция скролла, введённый текст), не обновляйте userInfo при каждом изменении. Установите needsSave = true, система вызовет userActivityWillSave перед отправкой. Обновляйте userInfo там.

Критерий Handoff UIDocumentState Push с payload
Скорость Мгновенно при сближении До ~1 минуты Зависит от сети
Размер ~4 КБ Любой 4 КБ (APNs)
Офлайн Требуется интернет для iCloud Работает локально Требуется сеть
Сложность Средняя Низкая Высокая (нужен сервер)

Handoff лучше других способов передачи состояния в 90% пользовательских сценариев — он быстрее и не требует серверной инфраструктуры.

Что делать при получении Handoff?

// AppDelegate или SceneDelegate func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { guard userActivity.activityType == "com.yourapp.editDocument", let documentId = userActivity.userInfo?["documentId"] as? String else { return false } navigationController.pushViewController(DocumentViewController(id: documentId), animated: false) return true } 

В SceneDelegate (iOS 13+): обработайте scene(_:willConnectTo:options:) для нового запуска и scene(_:continue:) для уже запущенного приложения. Оба случая нужно реализовать.

Что передавать в userInfo?

userInfo ограничен Property List типами. Не пытайтесь сериализовать NSManagedObject — это приведёт к крашу. Максимальный размер payload — несколько килобайт. Для большого состояния передавайте идентификатор, а на принимающей стороне загружайте данные из iCloud или локального кэша.

Тестирование Handoff без второго устройства

Для простого тестирования используйте симулятор Xcode. Выполните шаги:

  1. Запустите два симулятора с одинаковым Apple ID.
  2. Откройте приложение на первом симуляторе и убедитесь, что активность вызвана becomeCurrent().
  3. Заблокируйте первый симулятор через меню Hardware > Lock Screen.
  4. На втором симуляторе откройте App Switcher — должна появиться иконка Handoff.
  5. Тапните по иконке — приложение откроется с переданным состоянием.

Этот метод отлавливает 90% проблем до выхода на реальные устройства.

Типичные ошибки Handoff и их решения

Ошибка Признак Решение
becomeCurrent() не вызван Handoff-иконка не появляется Вызвать в viewDidAppear
invalidate() не вызван Иконка остаётся после выхода Вызвать в viewDidDisappear
ActivityType не зарегистрирован Handoff игнорируется без ошибки Проверить Info.plist
Разные Apple ID Парные устройства не видят друг друга Проверить учётные записи
Несоответствие activityType между версиями Handoff молча падает Версионировать activityType или обрабатывать старые

В 80% случаев проблема решается проверкой вызова becomeCurrent() и регистрации activityType. После внедрения наших рекомендаций время восстановления состояния сокращается до 0.5 секунд, а retention пользователей растёт на 15-20%.

Как мы решаем проблемы Handoff в реальных проектах?

В одном из проектов клиент жаловался, что Handoff перестал работать после обновления iOS. Проблема оказалась в том, что activityType был изменён, но не зарегистрирован в новой версии Info.plist. Мы добавили автоматическую миграцию старых типов и уведомление пользователя о необходимости обновления. Экономия бюджета клиента составила до 30% за счёт предотвращения переписывания кода. Результат — время восстановления состояния сократилось до 0.5 секунд, retention вырос на 15%.

Наши сертифицированные инженеры имеют опыт работы с Handoff более 5 лет. Мы гарантируем стабильную интеграцию на всех устройствах с iOS 14+ и предоставляем документацию для поддержки новых типов активностей. Свяжитесь с нами для аудита текущей реализации — мы выявим проблемы и предложим оптимизации. Закажите консультацию, чтобы получить детальную оценку вашего проекта.

Mac Catalyst и macOS

На Mac Catalyst используется тот же NSUserActivity. Handoff работает между iOS и macOS, если приложение есть на обеих платформах. Для macOS AppKit — NSApplicationDelegate.application(_:continue:restorationHandler:).

Что входит в работу?

  • Настройка типов активностей в Info.plist
  • Реализация NSUserActivity на всех экранах-кандидатах
  • Обработка continue в AppDelegate и SceneDelegate
  • Тестирование на реальных устройствах с одним Apple ID
  • Документация по поддержке новых типов активностей
  • Обучение команды поддержке Handoff в будущих обновлениях

Сколько времени занимает интеграция?

Базовая реализация Handoff для 1–3 типов активностей — 1–2 недели. Полная интеграция со сложным состоянием, несколькими экранами, обработкой edge cases — 3–5 недель. Стоимость интеграции рассчитывается после анализа пользовательских сценариев.

NSUserActivity — основная документация Apple.