Flutter for Apple TV

Flutter 引擎的修改+测试应用程序,用于演示 Flutter 应用程序可以在 Apple TV 上运行

此项目(以及Liberty Global 仓库)仅用于测试目的!

Flutter 及相关标志是 Google LLC 的商标。我们未获得 Google LLC 的认可或关联。

方法

  • 引擎
  • 框架
    • “flutter”工具(/framework)未修改。
    • 不支持 tvos 平台,无法使用 ios 目标,因为在没有修改的情况下,它将使用错误的 SDK(ios)来编译应用程序。
  • 应用程序
    • ios 应用程序设置相比的更改
      • 修改了主故事板。
      • tvos 的图标集。
      • 用于编译应用程序的自定义脚本,该脚本替换了“构建阶段”中的 code_backend.sh。此脚本基于引擎测试应用程序中的脚本,该应用程序仅使用引擎中的工具。无法使用普通脚本,因为它使用了不支持 tvos 的标准“flutter”工具。
    • 从真实的 ios 应用目标复制生成的资源。测试应用目标实际上会覆盖 ios 构建以使用这些资源。
    • 将应用程序和 pod 的目标更改为 'tvos',并将最低操作系统版本设置为 12.0。

已知限制

  • 并非所有 pod 都能编译。使用 ios 目标,并且某些 API 不被 tvos 支持。例如 WebView。
  • 没有调试功能。
  • 没有 Apple TV 外观小部件、没有虚拟键盘集成等。
  • tvos 不支持资源监控(使用 flutter 工具)。

已知问题

  • 当调试版本安装在模拟器或 Apple TV 设备上时,应用程序在屏幕上选择时将不会加载。它只能从 xcode 调试器加载。这对于发布版本没有问题。这很可能与应用程序尝试连接到未启动的 127.0.0.1 有关,因为没有使用 flutter 工具。

支持的设备

  • Apple tvOS 12.0 或更高版本。

解决方法

设置引擎/开发环境

编译引擎

  • 脚本将在 src/out 文件夹中为 TVOS 构建 5 个目标。
    • ios_debug_unopt, ios_debug_sim_unopt, ios_release, host_debug_unopt 和 host_release release。
  • 注意:获取所有仓库并为 Apple TV(所有目标)编译引擎至少需要 29Gb 的可用磁盘空间!
  • /engine/src/ 脚本中运行 sh ninja_build.sh(位于脚本文件夹中,参见 ninja_build.sh)。
    • 添加参数 clean 以进行完全重建。
    • 注意:在 32Gb 宿主系统上可以删除 --no-lto 标志。
  • 基于:https://github.com/flutter/flutter/wiki/Compiling-the-engine。此 wiki 中描述的顺序问题在于,为主机生成的文件的指向是 ios/tvos SDK 而不是 macos。

编译应用程序

  • 第一次构建真实的 ios 目标,以确保资源(图像、字体等)由 flutter 工具生成并可用于 tvos。
    • flutter build ios
  • 注意:无论目标如何,应用程序始终会编译到 /build/ios/Release-iphoneos。主要原因是普通 ios 构建生成的资源位于此处并被重新使用。
    • 这意味着,如果任何资源发生更改、添加或删除,则必须先完成普通的 ios 构建。为此,必须先撤销以下步骤!
  • 将 tvos 文件夹重命名为 ios。
    • Flutter 工具假定文件夹名称为 ios。如果文件夹名称不同,Flutter pub get 将失败!
    • 运行命令:sh scripts/switch_target.sh tvos
    • (切换回 ios:sh scripts/switch_target.sh ios)。
  • 运行命令:flutter pub get
  • 转到 ios 文件夹。
  • 安装/获取 cocoa pods。
    • 运行命令:pod install
    • Pod 目标在 podfile 的 post_install 步骤中自动从 ios 更正为 tvos。
  • 将 flutter 框架复制到 pods。
    • 运行命令:sh ../scripts/copy_framework.sh debug_sim <path to local flutter engine>/engine/src
    • 复制调试模拟器版本。正确的版本(debug、sim、release/archive)将在应用程序编译期间复制。
    • 不幸的是,这是一个手动步骤,因为 pod 首先由 xcode 作为依赖项进行编译,而 xcode 构建过程中没有在此之前的钩子来根据所选目标自动复制要使用的正确框架。
  • 在 ios 文件夹中打开 Runner.xcworkspace
    • FLUTTER_LOCAL_ENGINE 中设置指向本地编译的 flutter 引擎的路径(src 文件夹)。
    • 例如:FLUTTER_LOCAL_ENGINE = <your local path to flutter engine>/engine/src
    • 或者运行:sed -i '' "s#FLUTTER_LOCAL_ENGINE[[:space:]]=[[:space:]].*;#FLUTTER_LOCAL_ENGINE = \"${FLUTTER_LOCAL_ENGINE}\";#g" Runner.xcodeproj/project.pbxproj
  • 为设备调试、模拟器或存档构建应用程序(请参阅下面的切换目标)。

GitHub

https://github.com/LibertyGlobal/flutter-tvos-demo