TGStat
TGStat
Type to search
Advanced channel search
  • flag English
    Site language
    flag Russian flag English flag Uzbek
  • Sign In
  • Catalog
    Channels and groups catalog Regional compilations Thematic compilations Платные каналы Search for channels
    Add a channel/group
  • Ratings
    Rating of channels Rating of groups Posts rating
    Ratings of brands and people
  • Analytics
  • Search by posts
  • Telegram monitoring
  • Promotion
    Advertising through Yandex Business Advertising in channels through TGStat Agency Advertising on TGStat.ru website
Мобильный трудоголик

1 Oct, 09:03

Open in Telegram Share Report

🔢 Работа с 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

669 1 8 8 20
Catalog
Channels and groups catalog Channels compilations Search for channels Add a channel/group
Ratings
Rating of Telegram channels Rating of Telegram groups Posts rating Ratings of brands and people
API
API statistics Search API of posts API Callback
Our channels
@TGStat @TGStat_Chat @telepulse @TGStatAPI
Read
Академия TGStat Telegram Research 2019 Telegram Research 2021 Telegram Research 2023
Contacts
Справочный центр Support Email Jobs
Miscellaneous
Terms and conditions Privacy policy Public offer
Our bots
@TGStat_Bot @SearcheeBot @TGAlertsBot @tg_analytics_bot @TGStatChatBot