Расскажи о проекте, которым гордишься
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Проект: AR-навигация в крупном ТРЦ — от идеи до 500K пользователей
Горжусь проектом по разработке нативной AR-навигации для сети крупных торгово-развлекательных центров, который я вел как технический лидер команды из 6 iOS-разработчиков. Проект стартовал как пилот для одного ТРЦ, а через два года масштабировался на 15 комплексов с полумиллионом активных пользователей ежемесячно. Его уникальность — в решении реальной боли посетителей: «Я нахожусь на парковке уровня -2, как пешком дойти до конкретного магазина на 3 этаже?».
Ключевые технологии и архитектурные решения
Проект требовал выхода за рамки типовых CRUD-приложений. Основной стек и решения:
- Язык и парадигма: Swift с активным использованием протокол-ориентированного программирования и реактивного подхода с Combine для потоков данных.
- Архитектура: MVVM-C (Model-View-ViewModel-Coordinator). Это позволило:
* Четко отделить AR-логику и навигационный движок от UI.
* Легко тестировать ViewModels с бизнес-логикой маршрутизации.
* Координаторы управляли сложной навигацией между обычными экранами и полноэкранным AR-режимом.
- ARKit и SceneKit: Ядро приложения. Мы создали гибридную систему:
* Использовали **ARKit** для **World Tracking** и **Image Detection** (по предварительно размещенным в ТРЦ маркерам для калибровки).
* Строили 3D-путь с помощью **SceneKit**, визуализируя его поверх видео с камеры.
* Реализовали собственный алгоритм **сглаживания пути и компенсации дрейфа** (drift compensation) виртуальных объектов, так как чистой геопозиции внутри помещения было недостаточно.
class ARNavigationManager: NSObject {
private let sceneView: ARSCNView
private let routeNodes: [SCNNode]
private var isRouteActive = false
func startNavigation(to destination: Shop) {
guard let startMarker = detectStartMarker() else { return }
calculateRoute(from: startMarker, to: destination)
renderPathInScene()
startDriftCompensationTimer() // Фоновый процесс коррекции
}
private func calculateRoute(from start: Marker, to end: Shop) {
// Интеграция с внутренним Graph API для расчета кратчайшего пути
let pathFinder = IndoorPathFinder()
let steps = pathFinder.findPath(between: start, and: end)
routeNodes = steps.map { createGuideNode(for: $0) }
}
}
- Оффлайн-работа и производительность: Карты ТРЦ (весом ~20-50 МБ на комплекс) загружались один раз и хранились локально в Core Data. Для фоновой загрузки обновлений использовали Background Tasks. Оптимизация рендеринга 3D-сцены была критичной для старых устройств (начиная с iPhone 8).
Моя роль и преодоленные вызовы
Как техлид, я не только писал код, но и:
- Принимал ключевые архитектурные решения, например, выбор Combine вместо RxSwift для более тесной интеграции с нативным стеком Apple и легкости поддержки.
- Настроил CI/CD на GitLab с автоматическим прогоном unit-тестов (XCTest) и UI-тестов (XCUITest) для критичных потоков, таких как построение маршрута.
- Решал сложнейшую проблему — «уход» (drift) AR-якоря в длинных коридорах без визуальных ориентиров. Наше гибридное решение сочеталo периодическую рекалибровку по QR-меткам (если пользователь навел камеру) и программную коррекцию на основе данных с гироскопа и акселерометра.
- Внедрил модульную структуру проекта через Swift Package Manager, выделив AR-движок, сетевой слой и кэширующий менеджер в отдельные переиспользуемые пакеты. Это ускорило онбординг новых разработчиков и позволило повторно использовать код в других внутренних проектах.
Результаты и выводы
Проект был успешен не только технически, но и бизнесово:
- Увеличил среднее время пребывания посетителей в ТРЦ на ~15% (по данным аналитики).
- Снизил количество обращений в справочную службу на 30%.
- Получил высокий рейтинг (4.7+) в AppStore, где пользователи особенно хвалили плавность AR-режима и точность наведения.
Горжусь этим проектом, потому что он:
- Сочетал инновационность (AR) с решением прикладной, насущной проблемы.
- Потребовал глубокого погружения в ARKit, 3D-графику и алгоритмы навигации.
- Доказал, что сложные технологии могут быть стабильными и полезными для массового пользователя.
- Стал отличной школой лидерства и архитектурного мышления для всей команды.
Этот опыт сформировал мое ключевое убеждение: даже в потребительских приложениях стоит стремиться к чистой архитектуре и качественному коду — это не замедляет, а ускоряет разработку в долгосрочной перспективе и позволяет уверенно масштабировать продукт.