TGViewer
Мобильный трудоголик Мобильный трудоголик @hardworkerit · 1.65K subscribers
Post #484 124
🔢 Работа с Picture-in-Picture в iOS.

Picture-in-Picture - системная функция iOS, которая позволяет воспроизводить видео в отдельном плавающем окне поверх других приложений. Пользователь может свернуть приложение, продолжив смотреть контент в компактном окошке. Для разработчика видеосервиса это отдельный механизм со своей инфраструктурой, жизненным циклом и ограничениями.


Что такое PiP:

Технически PiP - это не просто маленькое видео в углу. Это сквозной системный механизм. Окно PiP не принадлежит приложению в привычном смысле - оно управляется системой и продолжает жить, даже когда пользователь перешел на рабочий стол. Функция появилась на iPad в iOS 9, но для iPhone стала общедоступной с iOS 14. С этого момента фоновое воспроизведение видео в маленьком окошке стало стандартом для уважающих себя видеосервисов.


Подготовка и запуск:

Основной инструмент - класс AVPictureInPictureController. Создать его можно двумя способами: передать ссылку на AVPlayerLayer или использовать contentSource.


let pipController = AVPictureInPictureController(playerLayer: playerLayer)


Либо:


let contentSource = AVPictureInPictureController.ContentSource(playerLayer: playerLayer)
let pipController = AVPictureInPictureController(contentSource: contentSource)



Настройка AVAudioSession:

Чтобы система разрешила запускать видео в фоне, необходимо правильно настроить AVAudioSession. Без этого startPictureInPicture() просто не сработает.


do {
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playback, mode: .moviePlayback)
try session.setActive(true)
} catch {
print("Failed to configure AVAudioSession: \(error)")
}



Почему PiP может не запуститься:

Есть две частые проблемы:

🔹Контроллер не удерживается в памяти. Если создать AVPictureInPictureController локально внутри функции, ARC удалит его сразу после завершения функции. Контроллер не доживет до отрисовки окна. Нужна сильная ссылка.

🔹Не настроены Background Modes. В Xcode нужно зайти в Signing & Capabilities, добавить Background Modes и поставить галочку напротив Audio, AirPlay, and Picture in Picture.


Отслеживание состояний:

Для отслеживания жизненного цикла PiP нужно реализовать протокол AVPictureInPictureControllerDelegate. Он включает методы WillStart, DidStart, FailedToStart, WillStop, Restore и DidStop. Особый интерес представляет Restore. Он вызывается, когда пользователь возвращается из PiP в приложение. В этом методе нужно восстановить UI плеера и вызвать completionHandler(true).


func pictureInPictureController(
_ pictureInPictureController: AVPictureInPictureController,
restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void
) {
self.playerView.isHidden = false
completionHandler(true)
}


Для автоматического запуска PiP при свайпе на главный экран можно использовать флаг canStartPictureInPictureAutomaticallyFromInline.


🔗 Читать подробнее


💡 Вывод:

Picture-in-Picture - мощный инструмент, который улучшает пользовательский опыт. Но для стабильной работы критически важно правильно настроить аудиосессию и Background Modes, грамотно управлять памятью контроллера и использовать contentSource для бесшовного переключения видео. Подкапотный механизм сложнее, чем кажется. AVKit взаимодействует с системным фреймворком Pegasus, который управляет окном PiP. Понимание этой архитектуры помогает избегать типичных ошибок, а работу сделать стабильной и надежной.


Подписаться на канал:
➡️ Telegram | Max
  • 👍 4
  • ❤ 2
  • 🔥 1
More from @hardworkerit
  1. Sep 29, 2026🔢 Управление тулбарами на iPhone Duo. На iPhone Duo элементы управления навигацией, дейст…
  2. Sep 27, 2026🔢 Новые возможности Hashable в Swift 6.4 В Swift 6.4 добавили Hashable для нескольких тип…
  3. Sep 25, 2026🔢 Приватные свойства больше не ломают memberwise инициализатор в Swift 6.4 Swift автомати…
  4. Sep 24, 2026👨‍💻 Почему разработчики ненавидят своих менеджеров. Всем привет! Сегодня хочу разобрать…
  5. Sep 22, 2026🔢 Релиз Swift 6.4: главные изменения для разработчиков. Swift 6.4 вышел. Это обновление п…
  6. Sep 20, 2026📱 Официальный симулятор iPhone Duo уже доступен в Xcode 27.1 В бета-версии Xcode 27.1 поя…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →