Реалізація спільного AR-досвіду (Collaborative AR)
Collaborative Session у ARKit — це Apple-специфічний механізм, який дозволяє кільком пристроям в одній локальній мережі обмінюватися AR-даними: feature points, якорями, трансформаціями. На відміну від Cloud Anchors, тут немає зовнішнього сервера — пристрої будують спільну карту разом, в реальному часі.
Включається однією строкою у конфігурації та виявляється значно складніше, ніж здається.
Як влаштована Collaborative Session
let config = ARWorldTrackingConfiguration()
config.isCollaborationEnabled = true
arView.session.run(config)
Після цього ARKit починає генерувати ARSession.CollaborationData — пакети з інформацією про оточення цього пристрою. Їх потрібно відправляти іншим учасникам через будь-який транспорт (MultipeerConnectivity, WebSocket, GameKit):
func session(_ session: ARSession, didOutputCollaborationData data: ARSession.CollaborationData) {
let encoded = try? NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: true)
// відправляємо encoded всім пирам
}
// На принимаючій стороні:
let data = try? NSKeyedUnarchiver.unarchivedObject(ofClass: ARSession.CollaborationData.self, from: received)
session.update(with: data)
Пристрої починають будувати спільну карту — кожен додає свої feature points. Через 10–30 секунд карти зливаються, і всі учасники бачать одинакову систему координат.
Що йде не так
MultipeerConnectivity — ненадійний транспорт. MCSession періодично дропає пирів без внятних помилок. Пристрій залишається у списку connectedPeers, але дані не доходять. Рішення: heartbeat кожні 2 секунди + автоматичне переподключення при трьох пропущених пінгах.
Розмір пакетів CollaborationData. При активному русі камери — до 50–100 КБ/с на пристрій. На 5 учасників — 250–500 КБ/с вихідного трафіку. MCSession з надійною доставкою (.reliable) створює чергу та лагує. Переключаємось на .unreliable для CollaborationData — втрата окремих пакетів некритична, ARKit восстановлюється. Критичні дані (розміщення об'єктів) відправляємо .reliable окремим каналом.
Момент слияння карт. До слияння пристрої працюють у своїх локальних системах координат. Якорі, додані до слияння, можуть стрибнути при синхронізації. Потрібно відстежувати ARParticipantAnchor — коли інший учасник з'являється у сцені, значить карти об'єдналися:
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
let participants = anchors.compactMap { $0 as? ARParticipantAnchor }
if !participants.isEmpty {
// Карти об'єдналися — можна розміщувати об'єкти
enableObjectPlacement()
}
}
Розміщувати об'єкти до ARParticipantAnchor — значить отримувати рассинхронізацію між учасниками.
iOS-only обмеження. Collaborative Session працює тільки між Apple-пристроями. Для Android — тільки ARCore Cloud Anchors.
Практичний кейс
Корпоративний AR-додаток для спільного планування офісу. 4 учасники з iPad Pro в одному приміщенні. Collaborative Session через MultipeerConnectivity. Кожен міг перетягувати віртуальну меблі, решта бачила зміни з затримкою ~100 мс.
Головна проблема: при виході одного учасника з кімнати MCSession його дропала, але ARKit продовжував слати дані в пустоту та накопичував чергу. При повертанні — лавина накопичених пакетів зависала UI. Рішення: при втраті пира — одразу очистити буфер та переконектитися з нуля.
Що входить у роботу
- Настройка ARWorldTrackingConfiguration з
isCollaborationEnabled - Реалізація транспортного шару через MultipeerConnectivity або GameKit
- Обробка життєвого циклу сесії: детектування учасників, слияння карт, вихід пирів
- Синхронізація користувацьких даних поверх AR-простору
- Тестування на реальних пристроях у різних мережевих умовах
Сроки
Базова Collaborative Session з MultipeerConnectivity — 2–3 тижні. З повною обробкою edge-кейсів, синхронізацією стану та UI — 4–7 тижнів. Вартість розраховується індивідуально.







