flutter_tvos
Platform detection and utilities for Flutter apps running on Apple TV (tvOS). Provides runtime checks for tvOS, device info, and capability queries.
1.1.3
38K downloads/mo
#1667 most downloaded on pub.dev
fluttertv/flutter-tvos
What this package is like to depend on
Last release 18 days ago
05 Aug 2026
Release timing varies
gaps range from 1 weeks to 6 weeks
Nearly every release is documented
notes for 8 of 8 stable releases
2 versions withdrawn
withdrawn after publishing
3 months old
10 releases · first in 2026
10 releases in the last 12 months
see the full history below
Release timeline
10 releases · May 2026 to Aug 2026Releases
latest 10-
1.1.305 Aug 2026Release notes
Open source →- Documentation: the README no longer says this package wires the Siri Remote to
Flutter's focus system. The engine does that — an app using only
Focus,FocusTraversal,Shortcutsand standard focusable widgets responds to the remote without depending onflutter_tvosat all. The README now says what the package is actually for (tuning key synthesis, the analog touch stream, swipe events) and calls out raw touch forwarding as the one feature that genuinely requires it. - Example app: the tvOS Xcode project now derives bundle paths from
$(WRAPPER_NAME)instead of$(PRODUCT_NAME).app(the latter is wrong whenever the product name is overridden), and gained a build phase that code-signs theFlutter.frameworkembedded through the Swift Package Manager umbrella — Xcode embeds it but does not sign it, so device installs otherwise carry nested code signed by a foreign team. These landed in the repository earlier but had never been published, because the package version was not bumped at the time. - No library, API, or native plugin changes —
lib/andtvos/Classes/are byte-identical to 1.1.2.
- Documentation: the README no longer says this package wires the Siri Remote to
Flutter's focus system. The engine does that — an app using only
-
1.1.223 Jun 2026Release notes
Open source →- Documentation: list Siri Remote support in the README feature summary and bump the install snippet to the current version. No functional or API changes.
-
1.1.119 Jun 2026Release notes
Open source →Patch release. No Flutter SDK or engine-artefact change — pinned versions match v1.1.0.
Fixed
--obfuscateand--split-debug-infoare now honoured by release/profile (AOT) builds. The tvOS AOT step runsgen_snapshotdirectly (rather than going through upstreamAOTSnapshotter), and previously dropped these flags entirely — the build succeeded but theAppbinary kept readable Dart symbols and the split-debug-info directory stayed empty. The gen_snapshot invocation now forwards--obfuscate, the--dwarf-stack-traces/--resolve-dwarf-paths/--save-debugging-info=<dir>/app.tvos-arm64.symbolstrio, and any--extra-gen-snapshot-options, matching upstreamAOTSnapshotter.build(issue #10).
Release notes
Open source →- Fixed the remote-control
configurehandshake racing native plugin registration at startup.TvRemoteController.init()now retries theconfigurecall until the nativeFlutterTvRemotePluginacknowledges it, so the touchpad reliably starts forwarding swipe/touch events instead of intermittently appearing dead when the first push landed before the native handler was registered. The retry now only swallows the expectedMissingPluginException/PlatformException(any other error — e.g. a config serialization bug — propagates instead of being silently retried), and if the handshake is never acknowledged within the retry budget it surfaces viaFlutterError.reportErrorrather than giving up silently.
-
1.1.012 Jun 2026Release notes
Open source →Minor release — the "porter release". Adds the entire
flutter-tvos plugin portcommand for scaffolding federated*_tvosplugins from existing iOS / macOS plugins, first-classflutter-tvos create --platforms=tvos, a build-time nudge for plugins missing tvOS support, and a handful of build-pipeline fixes. No Flutter SDK or engine-artefact change — pinned versions match v1.0.1.Added
flutter-tvos plugin port— new command. Scaffolds a federated<plugin>_tvossibling from any existing iOS or macOS Flutter plugin. The source plugin is never modified. Source loaders: positional local path,--from-pub <name>, or--from-git <url> --ref <ref>. The 11 packages published atfluttertv/plugins/ pub.dev/publishers/fluttertv.dev were all produced this way. Built in 7 phases — scaffold → copy native verbatim → Swift transformer → Objective-C transformer →--include-example→ fetch loaders → polish. The transformer:- widens Swift
#if os(iOS)/#elseif os(macOS)and Objective-C#if TARGET_OS_IOSso tvOS follows the iOS branch (UIKit / AVFoundation / Flutter embedder shape); - widens
@available iOS X, */#available/API_AVAILABLE(ios())to also listtvOS X(Apple ships those symbols on tvOS at the same OS version); - matches a compatibility database of tvOS-incompatible APIs
(WebKit, SafariServices, LocalAuthentication, CoreLocation,
CaptiveNetwork, NEHotspot, StoreKit code-redemption,
UIPasteboard,AVAudioSessionBluetooth / speaker options, CoreTelephony, GoogleSignIn SDK, …) and either strips the import + stubs the enclosing method-channel handler, or wraps type-level uses behind#if !os(tvOS)(graceful partial port — package still compiles with the feature disabled); - collapses modern multi-target SwiftPM packages (Swift API +
_objc/_ios/_macossiblings) into one CocoaPods module, dropping the macOS-only target; - emits a buildable Swift skeleton for FFI / native-assets
plugins (
dart:ffi+package:objective_c+hook/build.dart) that the tvOS toolchain can't build for as-is, so the user still gets a working scaffold to hand-finish; - prunes cross-platform Dart from the generated
lib/—_plus-style packages bundle Linux / Windows / Web / macOS / Android implementations alongside the iOS one; none reachable at runtime on tvOS, and their transitive imports (package:web,flutter_web_plugins,win32,package:nm, …) aren't in the generated pubspec, so shipping them inflates the package and breakspana/dart pub publishanalysis. Every transformation is recorded in aPORTING_REPORT.mdwritten alongside the package.
- widens Swift
flutter-tvos create --platforms=tvos/--tvos-only— first-class tvOS-only project scaffold. No more "create-iOS-then-strip" — the generated project ships atvos/Apple TV target only, with no iOS / Android / web / desktop platforms to delete by hand.- Build-time warning for plugins missing tvOS support. During
flutter-tvos build/run, each plugin in the app's dep graph that has a FlutterTV-published<name>_tvossibling the user hasn't added is surfaced as a one-line warning, e.g.audioplayers_tvos is available on pub.dev under the fluttertv.dev verified publisher. Did you forget to add it to pubspec.yaml?. Keyed on the user-facing aggregator name, so the federated iOS implementation (audioplayers_darwin) and platform-specific siblings (audioplayers_android,audioplayers_linux, …) don't produce duplicate or noisy warnings. Plugins outside the curated list are silently ignored. doc/port-plugin.md— proper user guide forplugin port, matching the existingdoc/style: quick start, full flag reference, what the transformer does and doesn't do, after- porting workflow, troubleshooting.
Fixed
flutter-tvos build/runnow reads the app'sversion:frompubspec.yamland writes the parsedFLUTTER_BUILD_NAME/FLUTTER_BUILD_NUMBERintoGenerated.xcconfig(1.2.3+4→1.2.3/4). Previously they were hardcoded to1.0.0/1unless explicitly passed via--build-name/--build-number, which brokepackage_info_plusand any code readingCFBundleShortVersionString/CFBundleVersion. Resolution order now matches iOS viaxcode_backend.dart: CLI flag →project.manifest.buildName/buildNumber→ canonical default.FLTAssetsPathis now baked into the generatedInfo.plistso Flutter's plugin asset lookup (Asset/lookupKey(forAsset:)) resolves correctly on a real Apple TV — previously only worked on the simulator.- Device builds now pass
-allowProvisioningUpdatesto xcodebuild so the first build on a fresh team / device can refresh provisioning profiles itself instead of failing. - Tvos build skips the Dart native-assets target so an app that
transitively pulls in an FFI / native-assets plugin (e.g.
path_provider_foundation,package_info_plus) no longer fails withTarget native_assets required define SdkRooton first build (issue #3).
Documentation
- README's plugin-porting section is now a 4-line pointer to
doc/port-plugin.md. The platform-key paragraph also points at the publishedfluttertv/pluginsrepo and thefluttertv.devverified publisher in place of the older "FlutterTV-curated index being assembled and will be published soon" wording. doc/index gains "Porting an existing plugin" under "Plugin development".
Engine
- Updated to Flutter 3.44.0 (
559ffa3f75e7402d65a8def9c28389a9b2e6fe42). - Updated
bin/internal/engine.versiontov1.0.0-flutter3.44.0. - Bumped
packages/flutter_tvosto1.0.5.
Release notes
Open source →- Added Swift Package Manager support.
flutter_tvosnow ships atvos/Package.swiftalongside its podspec, so apps using SPM-based plugin integration link it through the generatedFlutterGeneratedPluginSwiftPackageumbrella. Previously this FFI plugin was CocoaPods-only because its symbols, resolved at runtime viadart:ffi, had no compile-time caller and the static linker dropped them. The plugin now declares its exported C symbols underflutter.plugin.platforms.tvos.ffiSymbols; flutter-tvos reads that list to emit forced link references in the app's generated registrant, and each export is annotated__attribute__((used))/visibility("default")so it reaches the binary's dynamic symbol table. Requires flutter-tvos 1.3.0 or newer; older CLIs ignoreffiSymbolsand the plugin continues to work via CocoaPods.
-
1.0.529 May 2026 -
1.0.415 May 2026Release notes
Open source →- Fixed
dart:ffianddart:iocompile errors on Web.flutter_tvoscan now be added to a core package shared across tvOS, iOS, Android, and Web targets without stub workarounds. AllTvOSInfoproperties return safe defaults (false/''/0) on Web.
- Fixed
-
1.0.310 May 2026Release notes
Open source →- Example: call
WidgetsFlutterBinding.ensureInitialized()beforeTvRemoteController.instance.init()so the Flutter binding is ready when the platform channel attaches. - pubspec: added
issue_trackerlink so GitHub issues surface on pub.dev.
- Example: call
-
1.0.209 May 2026Release notes
Open source →- Removed the
runTvApphelper from the public API; apps should use normalrunApp. TvRemoteController.instance.init()now attaches Dart touch handlers explicitly and remains a no-op off tvOS.- Updated README setup/tuning guidance to reflect explicit initialization and current usage patterns.
- Removed the
-
1.0.104 May 2026 withdrawnRelease notes
Open source →Patch release updating the pinned Flutter SDK and tvOS engine artifacts to Flutter 3.41.9.
Changed
- Updated
bin/internal/flutter.versionto Flutter00b0c91f06209d9e4a41f71b7a512d6eb3b9c694. - Updated
bin/internal/engine.versiontov1.0.0-flutter3.41.9. - Published matching tvOS engine artifacts for debug, profile, release, simulator, and host tooling.
Release notes
Open source →- Changelog corrected and metadata updated for publication on pub.dev (removed incorrect 1.1.0 header and merged entries under 1.0.0).
- Updated
-
1.0.004 May 2026 withdrawnRelease notes
Open source →First public release. Targets Flutter 3.41.4.
Highlights
- RCU (Remote Control Unit) Support: Full integration with the Apple TV Siri Remote, including directional pad (D-pad) focus manipulation and enter/select interactions.
- Native TextField Implementation: Deep integration with the tvOS on-screen keyboard, allowing users to interact with Flutter
TextFieldwidgets identically to native tvOS text inputs. - Flutter DevTools Integration: Full support for Flutter DevTools, Observatory, profiling, and debugging across both simulator and physical devices.
Commands
Ten commands are available in this release:
Command Description build tvosBuild an IPA or app bundle for tvOS device or simulator runBuild, install, and launch on a simulator or device with hot reload createScaffold a new tvOS app or plugin cleanDelete build artefacts devicesList connected Apple TV devices and running simulators doctorCheck that the toolchain is configured correctly attachAttach to an already-running Flutter app for debugging driveRun integration tests via flutter_driver testRun unit tests precachePre-download engine artifacts Simulator Support
- Debug (JIT) builds targeting
appletvsimulatorSDK - Hot reload and hot restart over the VM service
- Simulator listed and targeted by device ID via
flutter-tvos devicesandflutter-tvos run -d <id>
Physical Device Deployment
- Deployment to physical Apple TV hardware via
xcrun devicectl - Release and profile (AOT) builds targeting
appletvosSDK - Three-tier code signing resolution: environment variable → embedded
.pbxprojsetting → keychain lookup
AOT Compilation
- Release builds use
gen_snapshotto produce ahead-of-time compiled binaries - Profile builds include observatory/DevTools hooks without JIT overhead
Plugin Support
- Native Swift plugins via CocoaPods integration
- Plugin template:
flutter-tvos create --template=plugin - Plugins declare a
tvosplatform entry in theirpubspec.yaml
flutter_tvosPlatform PackageA companion Dart/Swift package providing:
TvOSInfo— device model, OS version, and screen size queries- Device detection helpers (physical vs. simulator)
- tvOS capability queries (focus engine availability, game controller presence)
Tests
74 unit tests covering command parsing, artifact resolution, build configuration, code signing logic, and device discovery. All tests use Flutter's standard test infrastructure and run without a connected device.
Known Limitations
- tvOS Simulator only supports debug (JIT) mode; profile/release simulator builds are not available (Apple restriction)
- Metal is the only supported rendering backend; OpenGL is not present on tvOS
- macOS host and Xcode 15 or later are required
Release notes
Open source →Remote Control (RCU)
TvRemoteController.init()— Siri Remote wired to Flutter's keyboard/focus pipeline on tvOS; passthrough on iOS/Android.TvRemoteConfig— runtime-tunable thresholds (swipe, D-pad dead zone, auto-repeat delays); shipped to native via method channel.TvRemoteController.addRawListener— raw touchpad events for custom swipe zones (video scrubbers etc.).TvRemoteController.addSwipeListener— receive aggregatedSwipeEventnotifications (direction + magnitude + isFast) without hand-rolling aSwipeDetectorfrom raw touches. Raw and swipe listeners fire in parallel for the same gesture.- Lock-screen media commands (
MPRemoteCommandCenter) forwarded toflutter/keyeventso widgets reacting toLogicalKeyboardKey.mediaPlay/Pause/Stop/...light up for free.
Round-3 review follow-ups (Flutter Android / flutter-tizen parity)
-
Select →
LogicalKeyboardKey.enter(wasselect). Flutter's defaultActivateIntentbinds toenter, so standard buttons and list items now activate on Select press without any app-level shortcut registration. -
Menu →
Navigator.maybePopviaflutter/navigation popRoute(was a deadpress(key=menu)method call). Mirrors Android's physical back-button behavior. -
Play/Pause →
LogicalKeyboardKey.mediaPlayPause(was a deadpress(key=playPause)method call). Via Android keymap (Flutter's macOS map has no media entries). -
Touches channel no longer spams "message discarded" warnings when no
addRawListeneris registered — engine installs a no-op drain, transparently replaced by Dart handler on attach. -
Initial release
-
Platform detection:
isTvOS,isSimulator -
Device info:
tvOSVersion,deviceModel,machineId -
Capability queries:
supports4K,supportsHDR,supportsMultiUser -
Display info:
displayResolution -
Result caching with
clearCache()support