Как интегрировать Camera Control в iOS-приложение: что Apple забыла написать в документации
Два дня я разбирался с новой фичей iPhone 16. Рассказываю, где подводные камни и почему большинство разработчиков делают это неправильно.
Вы наверняка видели рекламу iPhone 16: боковая кнопка, которая управляет камерой. Нажал — сфоткал. Провёл пальцем — изменил зум. Звучит как магия.
Но если вы разработчик камерного приложения, у меня для вас новости: ваше приложение эту кнопку не видит. И Apple не особо торопится объяснить, почему.
Проблема, о которой молчат
Когда я впервые открыл документацию Apple по Camera Control, всё выглядело просто. Добавляешь AVCaptureSystemZoomSlider, настраиваешь AVCaptureEventInteraction — и готово.
Я написал код. Запустил на iPhone 16. Кнопка не работала.
Проверил настройки Camera Control в системе. Моего приложения там не было. Вообще.
Потратил день на отладку. Перечитал документацию трижды. Ответ нашёлся в видео с WWDC 2024, на 15-й минуте, одним предложением:
«Чтобы ваше приложение появилось в настройках Camera Control, необходимо создать Lock Screen Camera Extension.»
Без этого расширения — никакой интеграции. Ваш код может быть идеальным, но система его просто не увидит.
Как это на самом деле работает
Архитектура Camera Control устроена так:
Пользователь нажимает Camera Control ↓ iOS проверяет: есть ли у приложения Lock Screen Camera Extension? ↓ ДА → Приложение появляется в настройках, контролы работают НЕТ → Приложение невидимо для Camera Control
То есть это не просто API. Это целая архитектура, где Extension — обязательный компонент.
Минимальный рабочий код
После всех экспериментов вот что реально работает:
1. Создаём Lock Screen Camera Extension
В Xcode: File → New → Target → Locked Camera Capture Extension
Без этого шага всё остальное бессмысленно.
2. Добавляем системные контролы
@available(iOS 18.0, *) func setupCameraControls() { guard session.supportsControls, let device = deviceInput?.device else { return } let zoomSlider = AVCaptureSystemZoomSlider(device: device) { zoom in DispatchQueue.main.async { self.currentZoom = zoom } } if session.canAddControl(zoomSlider) { session.addControl(zoomSlider) } }
3. Обрабатываем нажатие кнопки
let interaction = AVCaptureEventInteraction { event in if event.phase == .ended { self.capturePhoto() } } cameraView.addInteraction(interaction)
Выглядит просто. Но есть нюансы.
Три грабли, на которые я наступил
Грабля №1: supportsControls — это не про iOS
session.supportsControls // false на всём, кроме iPhone 16
Это проверка железа, не версии системы. Даже на iOS 18 на iPhone 15 вернёт false. Приложение должно корректно работать и без Camera Control.
Грабля №2: Колбэки приходят не на main thread
// ❌ Так будет крашиться let slider = AVCaptureSystemZoomSlider(device: device) { zoom in self.zoomLabel.text = "\(zoom)x" } // ✅ Так правильно let slider = AVCaptureSystemZoomSlider(device: device) { zoom in DispatchQueue.main.async { self.zoomLabel.text = "\(zoom)x" } }
Грабля №3: Extension должен реально использовать камеру
Нельзя создать пустой Extension «для галочки». Система его убьёт, если он не запросит доступ к камере и не настроит AVCaptureEventInteraction.
Почему это важно именно сейчас
Откройте App Store. Посмотрите топ камерных приложений. Большинство из них не поддерживают Camera Control.
Пользователи iPhone 16 купили телефон в том числе ради этой кнопки. Они хотят её использовать. И когда найдут приложение, которое это умеет — останутся в нём.
Окно возможностей открыто, пока конкуренты разбираются что к чему.
Полное руководство
Всё, что я выяснил за три недели — структуру проекта, полный код CameraController, настройку Lock Screen Extension, интеграцию со SwiftUI и UIKit, обработку ошибок, чек-лист перед релизом — я собрал в одном месте.
Для vc.ru это слишком объёмно (3000+ строк кода), поэтому выложил отдельно:
👉 Полное руководство по интеграции Camera Control
Там есть:
- Пошаговая настройка проекта с нуля
- Готовый класс CameraController с комментариями
- Реализация Lock Screen Extension (то, что все пропускают)
- Примеры для SwiftUI и UIKit
- Диагностические утилиты для отладки
- Типичные ошибки и их решения
- Код, который можно копировать и использовать
Итого
Camera Control — фича, которая выглядит простой снаружи и сложной внутри. Apple сделала мощный инструмент, но документация не объясняет главного: без Lock Screen Extension ничего не заработает.
Если делаете камерное приложение — интегрируйте сейчас, пока конкуренты спят.
Если есть вопросы по реализации — пишите в комментариях, постараюсь помочь.
Полный гайд с кодом: dodecaidr.pro/ru/articles/camera-control