Реализация Picture-in-Picture режима для iOS-приложения

Реализация Picture-in-Picture режима для iOS-приложения Режим «картинка в картинке» (PiP) на iOS не включается сам — приложение обязано явно поддержать его через API AVKit или AVPictureInPictureController. В 90% проектов, которые к нам приходят, проблема одна: видео уходит в фон, но звук пропадае

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация Picture-in-Picture режима для iOS-приложения
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    898
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1219
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    600

Реализация Picture-in-Picture режима для iOS-приложения

Режим «картинка в картинке» (PiP) на iOS не включается сам — приложение обязано явно поддержать его через API AVKit или AVPictureInPictureController. В 90% проектов, которые к нам приходят, проблема одна: видео уходит в фон, но звук пропадает, или PiP-окно не появляется вовсе. Стандартная отладка занимает до 3 дней, а правильная настройка AVAudioSession сокращает её на 30%. Мы помогли десяткам команд разобраться с этими граблями — расскажем, как не повторять чужие ошибки. Рассмотрим три подхода, типичные сложности и реальный кейс, где грамотная интеграция сэкономила 35–40% бюджета.

Базовая реализация с AVPlayerViewController

Самый быстрый путь — AVPlayerViewController. PiP включается одной настройкой: установите allowsPictureInPicturePlayback = true, настройте AVAudioSession — и кнопка PiP появляется автоматически. Вот минимальный код — около 20 строк:

import AVKit class VideoViewController: UIViewController { private var player: AVPlayer! private var playerViewController: AVPlayerViewController! override func viewDidLoad() { super.viewDidLoad() // Обязательно: категория playback для фонового воспроизведения try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .moviePlayback) try? AVAudioSession.sharedInstance().setActive(true) player = AVPlayer(url: videoURL) playerViewController = AVPlayerViewController() playerViewController.player = player playerViewController.allowsPictureInPicturePlayback = true addChild(playerViewController) view.addSubview(playerViewController.view) playerViewController.view.frame = view.bounds playerViewController.didMove(toParent: self) } } 

Не забудьте добавить в Info.plist UIBackgroundModesaudio. Без этого PiP продолжит показывать видео, но звук пропадёт при переходе в фон — проблема, с которой сталкиваются 70% новичков. На выполнение базовой интеграции уходит 2–3 дня, включая тестирование на разных iOS.

Почему кастомный плеер лучше для сложных проектов?

Если плеер кастомный (на AVPlayerLayer, SpriteKit или OpenGL), AVPlayerViewController не подходит. Нужен AVPictureInPictureController напрямую. Он инициализируется через AVPictureInPictureController(playerLayer:) для AVPlayerLayer или через AVPictureInPictureControllerContentSource с AVPictureInPictureSampleBufferPlaybackDelegate для кастомного рендеринга. Сравните с базовым подходом:

Характеристика AVPlayerViewController AVPictureInPictureController
Сложность интеграции Минимальная Средняя
Кастомизация UI Ограниченная Полная
Поддержка не-видеоконтента Нет Есть (iOS 15+)
Требуемый код ~20 строк ~80 строк
Совместимость с iOS iOS 9+ iOS 9+ (контент — iOS 15+)
Скорость внедрения (база) 2–3 дня 3–5 дней

Пример кастомной реализации:

class CustomVideoPlayer: UIView { private var playerLayer: AVPlayerLayer! private var pipController: AVPictureInPictureController? func setupPiP() { guard AVPictureInPictureController.isPictureInPictureSupported() else { return } pipController = AVPictureInPictureController(playerLayer: playerLayer) pipController?.delegate = self pipController?.canStartPictureInPictureAutomaticallyFromInline = true // автостарт при уходе в фон } } extension CustomVideoPlayer: AVPictureInPictureControllerDelegate { func pictureInPictureControllerWillStartPictureInPicture(_ controller: AVPictureInPictureController) { // скрыть кастомные контролы поверх видео } func pictureInPictureController(_ controller: AVPictureInPictureController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) { // восстановить UI при закрытии PiP-окна completionHandler(true) } } 

Разница заметна: AVPlayerViewController — для простых видео, AVPictureInPictureController — для полного контроля. Наши инженеры с 5+ летним опытом предпочитают второй вариант для проектов с нестандартным контентом. Кастомный подход требует примерно 80 строк кода против 20 у базового, но даёт гибкость.

Как настроить PiP для произвольного контента?

Начиная с iOS 15+, появился AVPictureInPictureVideoCallViewController. С его помощью можно поместить в PiP-окно любой UIView — например, поток с камеры или WebRTC-видео. Контент передаётся через AVPictureInPictureControllerContentSource(activeVideoCallSourceView:contentViewController:). Это решение используют мессенджеры (FaceTime, Zoom) для видеозвонков поверх других приложений. Ограничение: контент должен быть «активным вызовом» по смыслу — Apple может отклонить приложение за злоупотребление на ревью. Внедрение такого решения занимает до 5 дней с учётом тестирования.

Что делать, если PiP не запускается в фоновом режиме?

Проблема в 90% случаев вызвана одной из трёх причин:

  • Не установлен canStartPictureInPictureAutomaticallyFromInline = true.
  • В Info.plist отсутствует UIBackgroundModes: audio.
  • AVAudioSession не активирована или категория не .playback.

Проверьте каждый пункт — и PiP заработает. Если видео зависает при возврате из PiP, задержите вызов completionHandler(true) в restoreUserInterfaceForPictureInPictureStopWithCompletionHandler до полного восстановления UI. Согласно официальной документации Apple, правильная настройка AVAudioSession критична: без неё звук теряется при фоновом режиме.

Ошибка Решение
Пропадает звук при переходе в фон Добавьте UIBackgroundModes: audio и активируйте AVAudioSession (помогает в 70% случаев)
PiP не отображается Проверьте AVPictureInPictureController.isPictureInPictureSupported() — iPad в портретной ориентации может не поддерживать PiP
Кастомные контролы не работают На iOS 16+ используйте playbackControlsIncludeTransportBar и playbackControlsIncludeInfoViews; на старых версиях — только стандартные

Объём работ по внедрению PiP

При заказе услуги по внедрению PiP мы предоставляем:

  1. Интеграцию с вашим плеером (AVPlayerViewController или кастомный) — занимает 1–2 дня.
  2. Настройку AVAudioSession и Info.plist — до 0.5 дня.
  3. Обработку всех состояний PiP (старт, остановка, восстановление UI) — 0.5–1 день.
  4. Тестирование на устройствах с разными версиями iOS (начиная с iOS 14) — 1–2 дня.
  5. Документацию по доработкам для вашей команды — 0.5 дня.

Как внедрить PiP: пошаговая инструкция

  1. Определите тип плеера: используете AVPlayerViewController или кастомный? Для простых видео подойдёт первый, для сложных — второй.
  2. Настройте AVAudioSession с категорией .playback и активируйте её до создания плеера.
  3. Добавьте UIBackgroundModes: audio в Info.plist.
  4. Реализуйте делегат AVPictureInPictureControllerDelegate для обработки переходов.
  5. Протестируйте на реальных устройствах под разными версиями iOS — особенно на iOS 14–17.

Сроки и стоимость

2–3 рабочих дня для базовой интеграции с AVPlayerViewController. Кастомный плеер с AVPictureInPictureController и нестандартным контентом — до 5 дней. Стоимость рассчитывается индивидуально, экономия бюджета за счёт отсутствия переделок может достигать 40% — свяжитесь с нами для оценки вашего проекта. Закажите интеграцию PiP и сэкономьте до 40% бюджета на разработке. Получите консультацию по вашему проекту уже сегодня.