Сборка для ТВ устройств¶
Поддержка телевизионных устройств была реализована с целью заставить существующие приложения React Native работать на Apple TV и Android TV, при этом в JavaScript-коде приложений не потребуется практически никаких изменений.
Изменения в сборке¶
- Нативный слой: Чтобы запустить проект React Native на Android TV, внесите следующие изменения в
AndroidManifest.xml.
1 2 3 4 5 6 7 8 9 10 11 12 | |
- Слой JavaScript: Поддержка Android TV была добавлена в
Platform.android.js. Вы можете проверить, выполняется ли код на Android TV, выполнив следующие действия
1 2 | |
Изменения кода¶
-
Доступ к сенсорным элементам управления: При работе на Android TV фреймворк Android будет автоматически применять схему направленной навигации, основанную на относительном положении фокусируемых элементов в ваших представлениях. В миксин
Touchableдобавлен код для обнаружения изменения фокуса и использования существующих методов для стилизации компонентов и инициирования соответствующих действий при выборе представления с помощью пульта телевизора, поэтомуTouchableWithoutFeedback,TouchableHighlight,TouchableOpacityиTouchableNativeFeedbackбудут работать как ожидалось. В частности:onFocusбудет выполняться, когда касаемое представление перейдет в фокусonBlurбудет выполняться, когда сенсорное представление выходит из фокусаonPressбудет выполняться, когда сенсорное представление действительно выбрано нажатием кнопки "select" на телевизионном пульте.
-
Телевизионный пульт/клавиатурный ввод: Новый собственный класс
ReactAndroidTVRootViewHelperустанавливает обработчики ключевых событий для событий пульта дистанционного управления телевизором. Когда происходят удаленные события ТВ, этот класс запускает событие JS. Это событие будет подхвачено экземплярами объекта JavaScriptTVEventHandler. Код приложения, которому необходимо реализовать пользовательскую обработку удаленных ТВ событий, может создать экземплярTVEventHandlerи прослушивать эти события, как показано в следующем коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
-
Поддержка Dev Menu: На эмуляторе cmd-M вызовет меню Dev Menu, аналогичное Android. Чтобы вызвать его на реальном устройстве Android TV, нажмите кнопку меню или долгое нажатие кнопки перемотки вперед на пульте дистанционного управления. (Пожалуйста, не трясите устройство Android TV, это не сработает)
-
Известные проблемы:
- Компоненты
TextInputпока не работают (т.е. они не могут получать фокус автоматически, см. этот комментарий).- Однако можно использовать ссылку, чтобы вручную вызвать
inputRef.current.focus(). - Вы можете обернуть ваш ввод внутри компонента
TouchableWithoutFeedbackи вызвать фокус в событииonFocusэтого touchable. Это позволяет открывать клавиатуру с помощью клавиш со стрелками. - Клавиатура может сбрасывать свое состояние после каждого нажатия клавиш (это может происходить только в эмуляторе Android TV).
- Однако можно использовать ссылку, чтобы вручную вызвать
- Содержимое компонентов
Modalне может получить фокус, подробности смотрите в этом выпуске.
- Компоненты
Устарело
Используйте react-native-tvos вместо этого. Подробности смотрите в блоге 0.62 release blog post.
Изменения в сборке¶
-
Нативный слой: Все проекты React Native Xcode теперь имеют цели сборки для Apple TV, имена которых заканчиваются строкой '-tvOS'.
-
react-native init: В новых проектах React Native, созданных с помощью
react-native init, в проектах XCode будет автоматически создана цель Apple TV. -
Слой JavaScript: Поддержка Apple TV добавлена в
Platform.ios.js. Вы можете проверить, запущен ли код на AppleTV, выполнив следующие действия
1 2 3 4 5 6 | |
Изменения в коде¶
-
Общая поддержка tvOS: Все изменения в родном коде, специфичные для Apple TV, обернуты определением TARGET_OS_TV. Они включают изменения для подавления API, которые не поддерживаются на tvOS (например, веб-просмотры, слайдеры, переключатели, строка состояния и т.д.), а также изменения для поддержки пользовательского ввода с телевизионного пульта или клавиатуры.
-
Общая кодовая база: Поскольку tvOS и iOS имеют большую часть общего кода на Objective-C и JavaScript, большинство документации для iOS в равной степени применимо и к tvOS.
-
Доступ к сенсорным элементам управления: При работе на Apple TV родным классом представления является
RCTTVView, который имеет дополнительные методы для использования механизма фокусировки tvOS. В миксинTouchableдобавлен код для обнаружения изменений фокуса и использования существующих методов для стилизации компонентов и инициирования соответствующих действий при выборе представления с помощью телевизионного пульта, поэтомуTouchableWithoutFeedback,TouchableHighlightиTouchableOpacityбудут работать как ожидалось. В частности:onFocusбудет выполняться, когда касаемое представление перейдет в фокусonBlurбудет выполняться, когда сенсорное представление выходит из фокусаonPressбудет выполняться, когда сенсорное представление действительно выбрано нажатием кнопки "select" на телевизионном пульте.
-
Телевизионный пульт/клавиатурный ввод: Новый собственный класс,
RCTTVRemoteHandler, устанавливает распознаватели жестов для событий пульта дистанционного управления телевизором. Когда происходят события, связанные с ТВ-пультом, этот класс выпускает уведомления, которые подхватываютсяRCTTVNavigationEventEmitter(подклассRCTEventEmitter), который выпускает JS-событие. Это событие будет подхвачено экземплярами объекта JavaScriptTVEventHandler. Код приложения, которому необходимо реализовать пользовательскую обработку удаленных событий ТВ, может создать экземплярTVEventHandlerи прослушивать эти события, как в следующем коде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
-
Поддержка Dev Menu: На симуляторе cmd-D вызывает Dev Menu, аналогично iOS. Чтобы вызвать его на реальном устройстве Apple TV, долго нажмите на кнопку воспроизведения/паузы на пульте ДУ. (Пожалуйста, не трясите устройство Apple TV, это не сработает :))
-
Анимация пульта дистанционного управления телевизором: Собственный код
RCTTVViewреализует рекомендованную Apple параллакс-анимацию, которая помогает направлять взгляд при навигации пользователя по просмотрам. Анимация может быть отключена или настроена с помощью новых опциональных свойств представления. -
Навигация назад с помощью кнопки меню пульта дистанционного управления телевизором: Компонент
BackHandler, изначально написанный для поддержки кнопки "назад" на Android, теперь также поддерживает навигацию назад на Apple TV с помощью кнопки меню на пульте дистанционного управления телевизором. -
Поведение TabBarIOS: Компонент
TabBarIOSоборачивает родной APIUITabBar, который работает по-другому на Apple TV. Чтобы избежать дрожащего повторного рендеринга панели вкладок в tvOS (см. этот выпуск), выбранный элемент панели вкладок может быть установлен из JavaScript только при первоначальном рендеринге, и после этого управляется пользователем через нативный код. -
Известные проблемы:
- Прокрутка ListView. Проблему можно обойти, установив
removeClippedSubviewsв false в ListView и подобных компонентах. Для более подробного обсуждения этой проблемы смотрите этот PR.
- Прокрутка ListView. Проблему можно обойти, установив