Picture-in-Picture в iOS: запуск и переключение контента
Picture-in-Picture в iOS позволяет свернуть видео в плавающее окно поверх любого экрана — пользователь смотрит ролик и одновременно работает в другом приложении. Технически это AVKit и AVFoundation: AVPictureInPictureController запускает режим, а системный делегат отвечает за переключение контента без обрыва воспроизведения. Для бизнес-приложений это способ совмещать видеоконсультацию с заполнением формы или заказа.
что такое picture-in-picture в iOS и где он нужен бизнесу
PiP появился в iPadOS в 2015 году, на iPhone заработал только с iOS 14 в 2020-м — до этого свернуть видео в плавающее окно на смартфоне было нельзя в принципе. Технически режим строится на AVKit и AVFoundation: приложение создаёт AVPictureInPictureController, привязывает его к слою плеера, а система сама рисует плавающее окошко, ловит жесты пользователя и передаёт события через делегат. Разработчику не нужно рисовать окно руками — нужно правильно объявить возможности и корректно реагировать на переходы между состояниями. Отдельный момент — минимальная версия iOS: если часть сотрудников работает на устройствах с iOS 13 и старше, для них PiP просто недоступен, и приложению нужен запасной сценарий без него.
Для типового B2B-приложения из Москвы PiP не «фича ради фичи». Это конкретные сценарии: диспетчер логистической компании смотрит видеоинструктаж по погрузке и одновременно сверяет накладную в заказе; мастер сервисной службы на видеозвонке с клиентом одновременно заполняет карточку заявки; менеджер по продажам показывает демо продукта на созвоне и параллельно готовит коммерческое предложение в CRM; риелтор показывает видеотур по объекту, пока клиент листает планировку в том же приложении. Во всех случаях сотрудник не переключается между двумя полноэкранными приложениями — видео остаётся на экране, пока идёт работа. Мы закладываем такие сценарии, когда делаем разработку мобильных приложений для компаний, у которых видео и рабочие данные должны жить в одном экране одновременно.
почему PiP не запускается или обрывается при переключении контента
Кладовщик на складе в Подольске смотрит на планшете видеоинструкцию по сборке заказа, сворачивает приложение свайпом вверх, чтобы открыть карточку заказа в учётной системе — и видео пропадает. Не сворачивается в окошко, а просто останавливается, экран чёрный. Через пару секунд приложение на переднем плане, а плеер молчит. Кладовщик открывает видео заново, перематывает к нужному месту — теряет минуту-две на каждой сборке, а таких сборок за смену десятки.
Причина почти всегда одна из типовых. Первая — категория аудиосессии. По умолчанию iOS ставит .soloAmbient, а эта категория останавливает звук при сворачивании приложения, и PiP не может стартовать без активного аудиопотока. Вторая — в Xcode не включён background mode «Audio, AirPlay, and Picture in Picture»: без этого флага система прерывает воспроизведение сразу при уходе в фон, до того как успевает открыться окно PiP. Третья причина касается именно переключения контента — того самого места в заголовке этой статьи. Если для каждого нового видео в приложении создаётся новый AVPlayer и новый AVPictureInPictureController вместо переиспользования одного через единый источник контента, система на секунду теряет связь между старым и новым плеером — получается чёрный кадр или полный обрыв PiP. Четвёртая причина — банальная: разработчик тестировал сценарий один раз на своём iPhone и посчитал задачу закрытой, не проверив переключение между тремя-четырьмя роликами подряд, с которым реально столкнётся пользователь.
Если это не починить, теряется не пара секунд у одного кладовщика. На созвоне с клиентом обрыв PiP выглядит как зависшее приложение — часть клиентов вешает трубку и не перезванивает, сделка срывается прямо на демонстрации. В сторе это оседает в отзывах с формулировкой «глючит», рейтинг приложения падает, а с ним и органические установки. И каждая переделка PiP постфактум, когда архитектура уже завязана на пересоздание плеера при каждом видео, стоит дороже, чем заложить это правильно с самого начала разработки.
как исправить проблему с запуском и переключением PiP
Первым делом стоит проверить поддержку через AVPictureInPictureController.isPictureInPictureSupported() — на части старых устройств и в определённых конфигурациях PiP недоступен физически, и дальнейшая отладка бессмысленна. Дальше по порядку:
- ✓категория аудиосессии выставляется в .playback ещё до запуска плеера, а не по факту сворачивания приложения;
- ✓в Signing & Capabilities target добавляется background mode «Audio, AirPlay, and Picture in Picture»;
- ✓реализуется AVPictureInPictureControllerDelegate, а метод failedToStartPictureInPictureWithError логируется — именно там видна настоящая причина отказа, а не догадки по внешним симптомам;
- ✓для автоматического старта при уходе в фон включается canStartPictureInPictureAutomaticallyFromInline = true.
Для переключения контента между несколькими видео правильная архитектура — один контроллер PiP на всё приложение через AVPictureInPictureControllerContentSource (доступен с iOS 15), а не пересоздание контроллера под каждый новый ролик. Старый плеер перед подменой корректно останавливается и освобождается, новый подключается к тому же слою — тогда переключение происходит без чёрного кадра и обрыва звука. Выбор конкретного способа зависит от того, что показывает приложение — файл, живой видеозвонок или плейлист, — и таблица ниже показывает, какой вариант под какую задачу. Если приложение параллельно тянет данные заказа из учётной системы, тут же стоит проверить и интеграцию приложения с 1С — фоновый запрос к базе не должен блокировать основной поток и мешать плееру держать PiP.
сравнение способов реализации PiP
| способ | что показывает | когда подходит | сложность |
|---|---|---|---|
| AVPlayerViewController | стандартный проигрыватель видеофайла | обучающие ролики без брендированного интерфейса | низкая |
| AVPictureInPictureController + свой плеер | кастомный UI поверх AVPlayer | брендированные курсы, видео с элементами управления заказчика | средняя |
| AVPictureInPictureVideoCallViewController | поток с камеры или видеозвонок | удалённая техподдержка, видеоосмотр объекта | высокая |
| AVPictureInPictureControllerContentSource | единая точка для смены видео | плейлисты и переключение контента без разрыва PiP | средняя-высокая |
что делать, если ошибка PiP повторяется даже после исправлений
Если код исправлен по чек-листу выше, а PiP всё равно срывается — на реальных устройствах, а не в разработке — причина обычно глубже кода одного экрана. Первое, что стоит проверить: тестировался ли PiP только в симуляторе Xcode. Это частая ловушка — симулятор не поддерживает полноценный композитинг Picture-in-Picture, и код, идеально работающий там, может падать на реальном iPhone. Второе — нагрузка на память: если приложение параллельно держит открытыми несколько тяжёлых экранов с данными заказов, система может убить фоновый процесс плеера при нехватке памяти, и PiP оборвётся без ошибки в логах приложения — только в системном логе устройства. Третье — режим низкого энергопотребления и тепловой троттлинг на возрастных моделях: склады часто используют iPhone SE второго поколения или бюджетные модели, купленные несколько лет назад, и на них PiP отваливается заметно чаще, чем на актуальных устройствах. Четвёртое — конфликт со сторонними SDK: аналитика или push-библиотека может переопределять категорию AVAudioSession после того, как её выставило основное приложение.
Практическая проверка занимает немного времени: подключить реальное устройство, включить системные логи через консоль, воспроизвести сценарий сворачивания трижды подряд с разными видео и посмотреть, в какой момент система разрывает связь с плеером. Часто причина видна уже на этом шаге, без глубокого дебага.
Если проблема повторяется на этом этапе, дальнейший перебор вариантов вручную обычно дороже, чем один системный аудит: проверка на матрице реальных устройств разных поколений, разбор системных логов через Instruments и полная трассировка жизненного цикла AVPlayer от старта до переключения контента. Для компаний, где PiP встроен в более крупный B2B-сценарий с заказами и заявками, такой аудит логично делать вместе с проверкой всего мобильного контура — мы разбираем это на примере B2B-приложений с 1С.
как предотвратить сбои PiP при переключении контента
Дешевле заложить архитектуру правильно на старте, чем чинить её после релиза в сторе. Три вещи, которые стоит закрепить в требованиях к разработке ещё на этапе проектирования: один переиспользуемый AVPictureInPictureController на всё приложение вместо пересоздания под каждое видео; обязательная очистка предыдущего плеера — остановка, снятие наблюдателей, освобождение памяти — перед загрузкой следующего ролика; и тестирование PiP только на физических устройствах перед каждым релизом, включая пару моделей трёхлетней давности, если ими реально пользуются сотрудники в поле.
Отдельно стоит завести мониторинг крашей именно по PiP-сценариям — в системах вроде Crashlytics такие падения легко перепутать с обычным фоновым завершением процесса, если не смотреть на них отдельно. И финальная проверка — документировать в чек-листе QA конкретные шаги: сворачивание во время воспроизведения, переключение между тремя разными видео подряд, возврат в приложение через кнопку на окне PiP. Без этого чек-листа регресс возвращается при каждом следующем обновлении плеера, потому что новый разработчик на проекте про эти нюансы просто не знает.
сколько стоит добавить PiP в корпоративное приложение
Если PiP — часть нового мобильного приложения, а не доработка существующего, разработка под iOS у нас стартует от 500 000 руб. — сюда входит проектирование архитектуры плеера сразу с учётом переключения контента, а не как отдельная доделка после релиза. Если приложение уже работает и нужно добавить или починить PiP в существующем коде, стоимость считается индивидуально после короткого аудита — часто дешевле, чем полная переработка модуля видео с нуля, потому что меняется не весь плеер, а конкретные точки: аудиосессия, капабилити, делегат, источник контента. Актуальные условия и форматы работы — на странице тарифов.
❓ Частые вопросы
Работает ли Picture-in-Picture одинаково на iPhone и iPad?
Технически да, API общий для AVKit. Но на iPhone PiP появился только с iOS 14 в 2020 году, на iPad — ещё с 2015-го. Если у сотрудников старые iPhone на iOS 13 и ниже, PiP на них работать не будет.
Можно ли запустить PiP автоматически, без нажатия пользователем отдельной кнопки?
Да, через canStartPictureInPictureAutomaticallyFromInline = true — видео сворачивается само при уходе в фон. Но нужна активная аудиосессия категории .playback и включённый background mode, иначе автозапуск не сработает.
Почему PiP не тестируется в симуляторе Xcode?
Симулятор не поддерживает полноценный композитинг Picture-in-Picture — часть поведения там просто не воспроизводится. Проверять запуск и переключение контента нужно только на физических iPhone и iPad, желательно нескольких поколений.
Сколько стоит добавить PiP в готовое корпоративное приложение?
Зависит от текущей архитектуры плеера. Новая мобильная разработка с нуля у нас стартует от 500 000 руб.; доработка PiP в существующем приложении оценивается индивидуально после короткого аудита кода.
Нужно ли отдельное разрешение Apple для публикации приложения с PiP?
Отдельного согласования нет, но приложение обязано явно объявлять background mode «Audio, AirPlay, and Picture in Picture» и корректно обрабатывать переходы между состояниями — иначе модерация может отклонить сборку из-за нестабильного поведения.
Или позвоните: +7 495 133-92-44 — в рабочее время с 9:00 до 19:00
Остались вопросы? Нужна помощь?
Менеджеры компании с радостью ответят на ваши вопросы, произведут расчет стоимости услуг и подготовят индивидуальное коммерческое предложение.
Бесплатная консультация

