Перенос приложения iOS Sender из Cast SDK v2 в Cast Application Framework (CAF)

Следующая процедура позволяет преобразовать приложение отправителя iOS из Cast SDK v2 в CAF Sender, основанное на синглтоне GCKCastContext .

Введение

  • CAF Sender по-прежнему распространяется на сайте разработчиков Google Cast и CocoaPods , как и v2.
  • Добавлены новые классы, которые берут на себя ответственность за соблюдение контрольного списка дизайна Google Cast.
  • CAF Sender предоставляет виджеты, соответствующие требованиям Cast UX; Версия 2 не содержала никаких компонентов пользовательского интерфейса и требовала реализации этих виджетов.
  • Дизайн CAF Sender соответствует дизайну Cast Android SDK.
  • CAF Sender поддерживает биткод, например v2.
  • Скрытые субтитры в CAF аналогичны версии 2.

Зависимости

CAF Sender поддерживает iOS версии 8 и более поздних версий.

Инициализация

В CAF для платформы Cast требуется явный шаг инициализации. Это включает в себя инициализацию синглтона GCKCastContext с использованием соответствующего GCKCastOptions для указания идентификатора приложения веб-приемника и любых других глобальных параметров. Обычно это делается с помощью метода AppDelegate -[application:didFinishLaunchingWithOptions:] :

GCKCastOptions *options = [[GCKCastOptions alloc]
    initWithReceiverApplicationID:applicationID];
[GCKCastContext setSharedInstanceWithOptions:options];

Этот шаг не был необходим в v2.

Обнаружение устройств

В CAF процесс обнаружения запускается и останавливается платформой автоматически, когда приложение переходит на передний план и переходит в фоновый режим соответственно. Классы GCKDeviceScanner и GCKFilterCriteria из версии 2 устарели и не должны использоваться.

Кнопка трансляции и диалоговое окно трансляции

В CAF кнопка и диалоговое окно Cast предоставляются платформой. Кнопку Cast можно создать и добавить на панель навигации следующим образом:

GCKUICastButton *castButton =
    [[GCKUICastButton alloc] initWithFrame:CGRectMake(0, 0, 24, 24)];
castButton.tintColor = [UIColor whiteColor];
self.navigationItem.rightBarButtonItem =
    [[UIBarButtonItem alloc] initWithCustomView:castButton];

Кнопку Cast также можно добавить в раскадровку.

Когда кто-то нажимает кнопку, автоматически открывается диалоговое окно трансляции.

Управление устройством

В CAF управление устройствами в основном осуществляется платформой. Приложению отправителя не требуется обрабатывать подключение к устройству и запускать приложение веб-приемника. Класс GCKDeviceManager версии 2 устарел и не должен использоваться. Взаимодействие между отправителем и веб-получателем теперь представлено как «сеанс». Класс CAF GCKSessionManager управляет жизненным циклом сеанса и автоматически запускает и останавливает сеансы в ответ на жесты пользователя: сеанс запускается, когда пользователь выбирает устройство трансляции в диалоговом окне трансляции, и завершается, когда пользователь нажимает кнопку «Остановить трансляцию» в диалоговом окне трансляции. диалоговое окно или когда само приложение-отправитель завершает работу. Приложение-отправитель может быть уведомлено о событиях жизненного цикла сеанса, зарегистрировав GCKSessionManagerListener с помощью GCKSessionManager . Протокол GCKSessionManagerListener определяет методы обратного вызова для всех событий жизненного цикла сеанса.

Класс GCKCastSession представляет сеанс с устройством Cast. В классе есть методы для управления громкостью устройства и состояниями отключения звука, что ранее было сделано в версии 2 с использованием методов GCKDeviceManager .

В версии 2 протокол GCKDeviceManagerDelegate предоставлял уведомления об изменениях состояния устройства, включая громкость, состояние отключения звука, состояние ожидания и т. д. В CAF уведомления об изменении состояния громкости/отключения звука доставляются с помощью методов обратного вызова в протоколе GCKSessionManagerListener ; эти прослушиватели зарегистрированы в GCKSessionManager . Все остальные уведомления о состоянии устройства доставляются через протокол GCKCastDeviceStatusListener ; эти прослушиватели зарегистрированы в GCKCastSession .

Логика переподключения

Как и в версии 2, CAF пытается восстановить сетевые соединения, потерянные из-за временной потери сигнала Wi-Fi или других сетевых ошибок. Теперь это делается на уровне сеанса; сеанс может перейти в «приостановленное» состояние при потере соединения и вернуться в «подключенное» состояние при восстановлении соединения. Платформа заботится о повторном подключении к приложению веб-приемника и повторном подключении любых каналов Cast в рамках этого процесса.

Кроме того, CAF также добавляет автоматическое возобновление сеанса. Если приложение-отправитель отправляется в фоновый режим или завершается (перелистыванием или из-за сбоя) во время сеанса трансляции, платформа попытается возобновить этот сеанс, когда приложение-отправитель вернется на передний план или перезапустится. ; это автоматически обрабатывается GCKSessionManager , который выдает соответствующие обратные вызовы для всех зарегистрированных экземпляров GCKSessionManagerListener .

Регистрация пользовательского канала

В версии 2 пользовательские каналы (реализованные с использованием либо подкласса GCKCastChannel , либо GCKGenericChannel и делегата) регистрировались с помощью GCKDeviceManager . В CAF пользовательские каналы вместо этого регистрируются с помощью экземпляра GCKCastSession . Регистрация может быть выполнена в методе обратного вызова GCKSessionManagerListener -[sessionManager:didStartCastSession:] . Для мультимедийных приложений больше нет необходимости явно регистрировать GCKMediaControlChannel ; более подробную информацию см. в следующем разделе.

Контроль СМИ

Класс v2 GCKMediaControlChannel устарел и не должен использоваться. В CAF он заменен новым классом GCKRemoteMediaClient , который обеспечивает эквивалентную функциональность в более удобном API. Нет необходимости явно инициализировать или регистрировать этот объект; платформа автоматически создаст экземпляр объекта и зарегистрирует базовый медиа-канал во время начала сеанса, если подключаемое приложение веб-приемника поддерживает пространство имен мультимедиа.

Доступ GCKRemoteMediaClient можно получить с помощью свойства -[remoteMediaClient] объекта GCKCastSession .

В версии 2 все медиа-запросы, отправленные через GCKMediaControlChannel , возвращали числовой идентификатор запроса, а методы GCKMediaControlChannelDelegate предоставляли этот идентификатор при отправке уведомлений о завершении или сбое запроса.

В CAF все медиа-запросы, отправленные в GCKRemoteMediaClient , возвращают объект GCKRequest ; с этим объектом связан протокол GCKRequestDelegate , который можно использовать для отслеживания хода выполнения и конечного результата запроса.

GCKMediaControlChannel v2; будет отправлять уведомления об изменениях состояния медиаплеера на веб-приемнике через GCKMediaControlChannelDelegate . В CAF GCKRemoteMediaClient предоставляет эквивалентные обратные вызовы через свой протокол GCKRemoteMediaClientListener . В GCKRemoteMediaClient можно зарегистрировать любое количество прослушивателей, что позволяет нескольким компонентам-отправителям совместно использовать один экземпляр GCKRemoteMediaClient , связанный с сеансом.

В версии 2 приложение-отправитель должно было взять на себя бремя синхронизации пользовательского интерфейса с состоянием медиаплеера на веб-приемнике. В CAF большую часть этой ответственности берет на себя класс GCKUIMediaController ; примеры использования этого компонента см. в учебной документации по кодовой лаборатории .

Вводное наложение

V2 не предоставляет вводного пользовательского интерфейса .

CAF добавляет класс GCKCastContext с методом -[presentCastInstructionsViewControllerOnce] , который приложение-отправитель может использовать для выделения кнопки трансляции, когда она впервые отображается пользователям.

Мини-контроллер

В версии 2 вам необходимо с нуля реализовать мини-контроллер в приложении-отправителе.

В CAF платформа предоставляет панель управления GCKUIMiniMediaControlsViewController , которую можно добавить в сцены, где вы хотите отображать постоянные элементы управления. Есть два способа добавить мини-контроллер в приложение-отправитель:

  • Позвольте платформе Cast управлять макетом мини-контроллера, обернув существующий контроллер представления GCKUICastContainerViewController и добавив GCKUIMiniMediaControlsViewController внизу его представления.

  • Добавьте мини-контроллер непосредственно в существующий контроллер представления, используя -[createMiniMediaControlsViewController] для создания экземпляра GCKUIMiniMediaControlsViewController , а затем добавив его в контроллер представления контейнера в качестве подпредставления.

Расширенный контроллер

В версии 2 вам необходимо с нуля реализовать расширенный контроллер в приложении-отправителе.

CAF добавляет GCKUIMediaController , который можно использовать для более простой реализации расширенного контроллера.

CAF добавляет предварительно созданный расширенный виджет контроллера GCKUIExpandedMediaControlsViewController , который вы можете просто добавить в свое приложение. Вам больше не нужно реализовывать собственный расширенный контроллер с помощью GCKUIMediaController .

Ведение журнала отладки

Классы GCKLogger и GCKLoggerDelegate из версии 2 перенесены в CAF с некоторыми изменениями и улучшениями.

Метод GCKLoggerDelegate -[logFromFunction:message:] устарел в пользу -[logMessage:fromFunction:] .

Сообщения журнала платформы теперь можно фильтровать, создав соответствующий экземпляр GCKLoggerFilter и назначив его, установив свойство -[filter] синглтона GCKLogger .

Примеры приложений

Мы рекомендуем просмотреть лаборатории кода и примеры приложений , написанных для CAF.