Імплементація AirPlay-стрімінгу з мобільного застосунку
AirPlay — протокол Apple для безпровідної передачі аудіо та відео на Apple TV, HomePod, AirPlay 2-сумісні телевізори та колонки. Якщо застосунок програє медіа через AVPlayer, базовий AirPlay працює без додаткового коду — але лише базовий.
Що працює автоматично, а що потребує конфігурації
AVPlayer автоматично підтримує AirPlay при player.allowsExternalPlayback = true (значення за замовчуванням — true). Користувач бачить іконку AirPlay в системному Control Center, вибирає пристрій — відео перемикається.
Що не працює без коду:
- Кнопка AirPlay прямо в інтерфейсі застосунку
- Обробка зміни пристрою відтворення
- Контроль над тим, що саме передається (маршрутизація відео на ТВ, аудіо на HomePod)
AVRoutePickerView: кнопка AirPlay в UI
AVRoutePickerView — системний компонент, який показує стандартний список доступних пристроїв:
let routePickerView = AVRoutePickerView()
routePickerView.tintColor = .white
routePickerView.activeTintColor = .systemBlue
routePickerView.prioritizesVideoDevices = true // показує AirPlay-TV вище колонок
Додайте прямо в UI плеєра — жодних додаткових дозволів не потрібно, піккер системний.
Моніторинг маршруту відтворення
При підключенні до пристрою AirPlay необхідно адаптувати UI: приховати кнопку розгортання на весь екран (відео вже на ТВ), показати індикатор «Передається на...».
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. Якщо потрібно залишити аудіо на телефоні при відео на ТВ — встановлюємо AVAudioSession.setCategory(.playback, options: [.allowAirPlay]) і налаштовуємо preferredInput.
Тестування без фізичного Apple TV
Network.framework дозволяє емулювати Bonjour-сервіс в симуляторі для базового тестування. Але повноцінне тестування AirPlay вимагає фізичного пристрою — Apple TV, HomePod або AirPlay 2-сумісного телевізора. Для CI/CD автоматичне тестування функціональності AirPlay неможливе — лише ручна перевірка.
Строки
Кнопка AirPlay в UI + моніторинг маршруту + правильне відображення заповідника — 1–2 дні.







