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

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

Введение

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

Зависимости

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 также можно добавить в раскадровку.

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

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

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

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

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

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

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

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

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

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

Медиа-контроль

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

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

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

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

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

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

Вводный оверлей

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

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

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

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

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

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

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

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

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

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

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

Журнала отладки

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

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

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

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

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