Реализация AirPlay-стриминга из мобильного приложения
AirPlay — протокол Apple для беспроводной передачи аудио и видео на Apple TV, HomePod, AirPlay 2-совместимые телевизоры и колонки. Если приложение играет медиа через AVPlayer, базовый AirPlay работает без дополнительного кода — но только базовый.
Что работает само, а что нужно настраивать
AVPlayer автоматически поддерживает AirPlay при player.allowsExternalPlayback = true (значение по умолчанию — true). Пользователь видит иконку AirPlay в системном Control Center, выбирает устройство — видео переключается.
Что не работает без кода:
- Кнопка AirPlay прямо в интерфейсе приложения
- Обработка смены устройства воспроизведения
- Контроль над тем, что именно передаётся (роут видео на TV, аудио на HomePod)
AVRoutePickerView: кнопка AirPlay в UI
AVRoutePickerView — системный компонент, показывает стандартный список доступных устройств:
let routePickerView = AVRoutePickerView()
routePickerView.tintColor = .white
routePickerView.activeTintColor = .systemBlue
routePickerView.prioritizesVideoDevices = true // показывает AirPlay-TV выше колонок
Добавляем прямо в UI плеера — никаких дополнительных разрешений не нужно, пикер — системный.
Мониторинг маршрута воспроизведения
При подключении к AirPlay-устройству нужно адаптировать UI: скрыть кнопку разворачивания на весь экран (видео уже на TV), показать индикатор «Передаётся на...».
NotificationCenter.default.addObserver(
forName: AVAudioSession.routeChangeNotification,
object: nil, queue: .main
) { notification in
guard let reason = notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt,
let changeReason = AVAudioSession.RouteChangeReason(rawValue: reason) else { return }
switch changeReason {
case .newDeviceAvailable:
let outputs = AVAudioSession.sharedInstance().currentRoute.outputs
let isAirPlay = outputs.contains { $0.portType == .airPlay }
self.updateUIForAirPlay(isAirPlay)
case .oldDeviceUnavailable:
self.updateUIForAirPlay(false)
default: break
}
}
player.isExternalPlaybackActive — флаг, что видео сейчас передаётся на внешний экран. При true — основной экран телефона показывает заглушку «Воспроизводится на Apple TV», а не чёрный экран.
AirPlay 2 и многокомнатный звук
AirPlay 2 позволяет воспроизводить аудио одновременно на нескольких устройствах. Для поддержки в приложении: AVAudioSession категория .playback или .playAndRecord — это всё, что нужно. Система сама управляет мультироутингом.
Ограничения
AirPlay — только iOS/macOS. Для Android-приложений аналог — Chromecast (Google Cast SDK). Если нужна кросс-платформенность — реализуем оба протокола.
Видео с DRM (FairPlay) через AirPlay передаётся только на устройства с поддержкой FairPlay. Apple TV поддерживает, большинство сторонних AirPlay-устройств — нет. Пользователь видит ошибку воспроизведения — это ограничение Apple, обойти нельзя.
AirPlay для аудио: отдельный маршрут
При передаче видео на AirPlay-устройство аудио может остаться на телефоне или уйти вместе с видео — зависит от настройки AVAudioSession. Для правильного поведения (аудио и видео вместе на AirPlay-устройстве): AVAudioSession.Category.playback без allowBluetoothA2DP. Если нужно оставить аудио на телефоне при видео на TV — задаём AVAudioSession.setCategory(.playback, options: [.allowAirPlay]) и настраиваем preferredInput.
Тестирование без физического Apple TV
Network.framework позволяет эмулировать Bonjour-сервис в симуляторе для базового тестирования. Но полноценный AirPlay тест требует физического устройства — Apple TV, HomePod или AirPlay 2-совместимого телевизора. Для CI/CD автоматически тестировать AirPlay-функциональность нельзя — только ручная проверка.
Сроки
Кнопка AirPlay в UI + мониторинг маршрута + корректное отображение заглушки — 1–2 дня.







