Как интегрировать 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

1
Начать дискуссию