From a94adba80bacefe23bdb18ca095992edda3424ca Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:41:23 +0800
Subject: [PATCH 01/10] Raise example iOS deployment target to 15.0
Bumps the iOS floor for the example app and its broadcast extension:
- Podfile `platform :ios` 13.0 -> 15.0, and the post_install override
that forces IPHONEOS_DEPLOYMENT_TARGET on every pod 12.1 -> 15.0
- Runner and LiveKit Broadcast Extension targets 14.0 -> 15.0
Also sorts Info.plist keys into alphabetical order, which Xcode does on
save (no semantic change).
---
example/ios/Podfile | 4 ++--
example/ios/Runner.xcodeproj/project.pbxproj | 12 ++++++------
example/ios/Runner/Info.plist | 12 ++++++------
3 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/example/ios/Podfile b/example/ios/Podfile
index f08511756..371916ac4 100644
--- a/example/ios/Podfile
+++ b/example/ios/Podfile
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
-platform :ios, '13.0'
+platform :ios, '15.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
@@ -43,7 +43,7 @@ post_install do |installer|
# https://stackoverflow.com/questions/63973136/the-ios-deployment-target-iphoneos-deployment-target-is-set-to-8-0-in-flutter
#
target.build_configurations.each do |config|
- config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.1'
+ config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
#
# Make it compile with M1 macs
#
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
index 63f4375a1..1ec103ac5 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -510,7 +510,7 @@
DEVELOPMENT_TEAM = 76TVFCUKK7;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -648,7 +648,7 @@
DEVELOPMENT_TEAM = 76TVFCUKK7;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -677,7 +677,7 @@
DEVELOPMENT_TEAM = 76TVFCUKK7;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
- IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -710,7 +710,7 @@
INFOPLIST_FILE = "LiveKit Broadcast Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "LiveKit Broadcast Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
- IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -749,7 +749,7 @@
INFOPLIST_FILE = "LiveKit Broadcast Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "LiveKit Broadcast Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
- IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@@ -785,7 +785,7 @@
INFOPLIST_FILE = "LiveKit Broadcast Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "LiveKit Broadcast Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
- IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist
index 279909e99..af903405a 100644
--- a/example/ios/Runner/Info.plist
+++ b/example/ios/Runner/Info.plist
@@ -2,10 +2,6 @@
- RTCScreenSharingExtension
- io.livekit.example.flutter.LiveKit-Broadcast-Extension
- RTCAppGroupIdentifier
- group.io.livekit.example.flutter
CADisableMinimumFrameDurationOnPhone
CFBundleDevelopmentRegion
@@ -32,6 +28,12 @@
$(PRODUCT_NAME) will use camera
NSMicrophoneUsageDescription
$(PRODUCT_NAME) will use microphone
+ RTCAppGroupIdentifier
+ group.io.livekit.example.flutter
+ RTCScreenSharingExtension
+ io.livekit.example.flutter.LiveKit-Broadcast-Extension
+ UIApplicationSupportsIndirectInputEvents
+
UIBackgroundModes
audio
@@ -55,7 +57,5 @@
UIViewControllerBasedStatusBarAppearance
- UIApplicationSupportsIndirectInputEvents
-
From 99bf368fee364a907cd4283c871298f929d3ee7d Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:41:31 +0800
Subject: [PATCH 02/10] Exclude generated and platform dirs from example
analysis
`flutter analyze` in example/ was walking build output and the native
platform folders. Adds the standard excludes (build, android, ios, web,
windows, macos, linux) alongside the existing generated-code patterns.
---
example/analysis_options.yaml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml
index d80854028..de6f248e2 100644
--- a/example/analysis_options.yaml
+++ b/example/analysis_options.yaml
@@ -39,6 +39,13 @@ analyzer:
- "**/*.pbenum.dart"
- "**/*.pbjson.dart"
- "**/*.pbserver.dart"
+ - build/**
+ - android/**
+ - ios/**
+ - web/**
+ - windows/**
+ - macos/**
+ - linux/**
linter:
rules:
From 902208528c1975662f313465088203d48c796451 Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Wed, 26 Aug 2026 23:23:30 +0800
Subject: [PATCH 03/10] Migrate example iOS app to UIScene lifecycle
iOS 27 terminates apps that have not adopted the UIScene lifecycle, and
`flutter run` tool-exits on the resulting device log line, so the example
app could no longer be launched on an iOS 27 device.
- Add `UIApplicationSceneManifest` to Info.plist using the stock
`FlutterSceneDelegate`, so no custom scene delegate is needed.
- Conform AppDelegate to `FlutterImplicitEngineDelegate` and move
`GeneratedPluginRegistrant.register` into
`didInitializeImplicitFlutterEngine`. Under UIScene the app delegate's
`window` is nil, so the old `guard let controller = window?...` returned
early and skipped plugin registration entirely.
See https://flutter.dev/to/uiscene-migration
---
example/ios/Runner/AppDelegate.swift | 10 +++++-----
example/ios/Runner/Info.plist | 21 +++++++++++++++++++++
2 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift
index fd1699792..57a282ca0 100644
--- a/example/ios/Runner/AppDelegate.swift
+++ b/example/ios/Runner/AppDelegate.swift
@@ -2,16 +2,16 @@ import UIKit
import Flutter
@main
-@objc class AppDelegate: FlutterAppDelegate {
+@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
- guard let controller = window?.rootViewController as? FlutterViewController else {
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
- GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
+
+ func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {
+ GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)
+ }
}
diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist
index af903405a..f42d5d9c1 100644
--- a/example/ios/Runner/Info.plist
+++ b/example/ios/Runner/Info.plist
@@ -32,6 +32,27 @@
group.io.livekit.example.flutter
RTCScreenSharingExtension
io.livekit.example.flutter.LiveKit-Broadcast-Extension
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneClassName
+ UIWindowScene
+ UISceneConfigurationName
+ flutter
+ UISceneDelegateClassName
+ FlutterSceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
UIApplicationSupportsIndirectInputEvents
UIBackgroundModes
From 593c4cbd069a681d542b80df4616d247eba8ca4b Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:41:38 +0800
Subject: [PATCH 04/10] Raise example macOS deployment target to 12.0
Flutter 3.47 requires a macOS 12.0 floor; the example was still at 10.15.
Updates the Podfile `platform :osx` and MACOSX_DEPLOYMENT_TARGET in all
three build configurations.
---
example/macos/Podfile | 2 +-
example/macos/Runner.xcodeproj/project.pbxproj | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/example/macos/Podfile b/example/macos/Podfile
index 9ec46f8cd..0c76ccf54 100644
--- a/example/macos/Podfile
+++ b/example/macos/Podfile
@@ -1,4 +1,4 @@
-platform :osx, '10.15'
+platform :osx, '12.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
diff --git a/example/macos/Runner.xcodeproj/project.pbxproj b/example/macos/Runner.xcodeproj/project.pbxproj
index f96649524..cee97a2a8 100644
--- a/example/macos/Runner.xcodeproj/project.pbxproj
+++ b/example/macos/Runner.xcodeproj/project.pbxproj
@@ -398,7 +398,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
@@ -479,7 +479,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
@@ -526,7 +526,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.15;
+ MACOSX_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
From e98df3417bd958cf3e10064529d59dee3125d163 Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:00:20 +0800
Subject: [PATCH 05/10] Drop unused use_modular_headers! from example Podfiles
No Flutter template uses `use_modular_headers!` on any platform; it was a
local addition to both example Podfiles.
Verified unnecessary by building each platform with Swift Package Manager
disabled, so every plugin resolves through CocoaPods (including
flutter_webrtc + WebRTC-SDK, and permission_handler_apple on iOS):
both `pod install` and the Xcode build succeed without it.
---
example/ios/Podfile | 1 -
example/macos/Podfile | 1 -
2 files changed, 2 deletions(-)
diff --git a/example/ios/Podfile b/example/ios/Podfile
index 371916ac4..ab0d7914d 100644
--- a/example/ios/Podfile
+++ b/example/ios/Podfile
@@ -29,7 +29,6 @@ flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
- use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
diff --git a/example/macos/Podfile b/example/macos/Podfile
index 0c76ccf54..080c95201 100644
--- a/example/macos/Podfile
+++ b/example/macos/Podfile
@@ -28,7 +28,6 @@ flutter_macos_podfile_setup
target 'Runner' do
use_frameworks!
- use_modular_headers!
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
end
From 7a75e124622b6372db10cc1d46c4f9ed2bd05326 Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:00:37 +0800
Subject: [PATCH 06/10] Stop excluding arm64 for the iOS simulator in the
example
The Podfile's post_install forced
`EXCLUDED_ARCHS[sdk=iphonesimulator*] = 'arm64'` on every pod. That is a
2020 workaround for Intel Macs, and on Apple Silicon it is backwards: it
made `flutter run`/`flutter build` print
The following target(s) do not support arm64 architecture, which is a
requirement for Apple Silicon iOS 26+ simulators
on every invocation, listing every plugin.
After removing it, `flutter build ios --simulator --debug` succeeds, the
warning is gone, and the built binary reports `x86_64 arm64`.
---
example/ios/Podfile | 4 ----
1 file changed, 4 deletions(-)
diff --git a/example/ios/Podfile b/example/ios/Podfile
index ab0d7914d..22364f346 100644
--- a/example/ios/Podfile
+++ b/example/ios/Podfile
@@ -43,10 +43,6 @@ post_install do |installer|
#
target.build_configurations.each do |config|
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
- #
- # Make it compile with M1 macs
- #
- config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = 'arm64'
end
end
From 711a6486db0d8ea638f3dd2e34320a0afc363d08 Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:41:50 +0800
Subject: [PATCH 07/10] Clean up stale iOS project config in example
- Project-level IPHONEOS_DEPLOYMENT_TARGET 12.1 -> 15.0. Every target
already overrode this to 15.0, so it was dead weight, and any new
target would have silently inherited 12.1.
- Drop the three empty `EXCLUDED_ARCHS = ""` entries, left over from the
same era as the simulator arm64 workaround.
---
example/ios/Runner.xcodeproj/project.pbxproj | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
index 1ec103ac5..dbf91446c 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -479,7 +479,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
- EXCLUDED_ARCHS = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -488,7 +487,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -558,7 +557,6 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
- EXCLUDED_ARCHS = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -573,7 +571,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@@ -615,7 +613,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
- EXCLUDED_ARCHS = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -624,7 +621,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 12.1;
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
From 1f291705d226e00fc639f83701f45b3dd39f604a Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:06:53 +0800
Subject: [PATCH 08/10] Drop CocoaPods framework/resource phases from the iOS
example project
With Swift Package Manager on (the default since Flutter 3.41), every
plugin resolves as a Swift Package and `Flutter` is the only remaining
pod, so `pod install` removes the `[CP] Embed Pods Frameworks` and
`[CP] Copy Pods Resources` build phases: there is nothing left to embed
or copy.
These phases are generated and owned by CocoaPods, so `pod install`
re-adds them for anyone building with SPM disabled. Committing the
generated state keeps iOS consistent with macOS, which already carried
only `[CP] Check Pods Manifest.lock`.
---
example/ios/Runner.xcodeproj/project.pbxproj | 36 --------------------
1 file changed, 36 deletions(-)
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
index dbf91446c..db4cf83b9 100644
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -207,8 +207,6 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
D7FECD302860997500D04D1C /* Embed App Extensions */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- D9316257C44ACC699FF042FD /* [CP] Embed Pods Frameworks */,
- 846FAB5D745587A695E025C5 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -320,23 +318,6 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n";
};
- 846FAB5D745587A695E025C5 /* [CP] Copy Pods Resources */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
- );
- name = "[CP] Copy Pods Resources";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
- showEnvVarsInLog = 0;
- };
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -352,23 +333,6 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n";
};
- D9316257C44ACC699FF042FD /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
- );
- name = "[CP] Embed Pods Frameworks";
- outputFileListPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
- };
F30F68AB50F7F85C7927F195 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
From 6342c3f0b5b978ebf8a598be247704cc647f6886 Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:22:06 +0800
Subject: [PATCH 09/10] Raise example Android toolchain to Flutter 3.47's
minimums
`flutter run -d ` failed outright: Flutter 3.47 enforces
minimum AGP and Kotlin Gradle Plugin versions that the example was below,
and they surface one at a time.
Android Gradle Plugin 8.9.1 -> 8.11.1 (Flutter minimum)
Kotlin Gradle Plugin 2.1.0 -> 2.2.20 (Flutter minimum)
Also picks up the two AGP 9 opt-outs that Flutter's own migrator writes
into gradle.properties (`android.builtInKotlin`, `android.newDsl`).
These are the enforced minimums, not the versions `flutter create` now
generates (AGP 9.1.0 / Kotlin 2.4.0 / Gradle 9.3.1). Moving to those is a
larger toolchain jump and is left as separate work. Gradle stays at 8.14,
which only warns.
Verified by running the example on a Pixel 10 Pro emulator.
---
example/android/gradle.properties | 4 ++++
example/android/settings.gradle | 4 ++--
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/example/android/gradle.properties b/example/android/gradle.properties
index fbee1d8cd..d5da7278a 100644
--- a/example/android/gradle.properties
+++ b/example/android/gradle.properties
@@ -1,2 +1,6 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
+# This builtInKotlin flag was added automatically by Flutter migrator
+android.builtInKotlin=false
+# This newDsl flag was added automatically by Flutter migrator
+android.newDsl=false
diff --git a/example/android/settings.gradle b/example/android/settings.gradle
index 8c61b9fdc..ebf08564f 100644
--- a/example/android/settings.gradle
+++ b/example/android/settings.gradle
@@ -18,8 +18,8 @@ pluginManagement {
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
- id "com.android.application" version '8.9.1' apply false
- id "org.jetbrains.kotlin.android" version "2.1.0" apply false
+ id "com.android.application" version '8.11.1' apply false
+ id "org.jetbrains.kotlin.android" version "2.2.20" apply false
}
include ":app"
From e9822939a11059d7781a546b1eaeb743ed5f9b82 Mon Sep 17 00:00:00 2001
From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com>
Date: Thu, 27 Aug 2026 00:37:04 +0800
Subject: [PATCH 10/10] Align example Android NDK and Java target with the
Flutter template
Two divergences from what `flutter create` generates, both surfaced as
build warnings:
- ndkVersion was pinned to 27.0.12077973 while connectivity_plus,
device_info_plus, flutter_background, flutter_webrtc and jni all
require 28.2.13676358. Use `flutter.ndkVersion` (the template's own
reference, currently 28.2.13676358) so this tracks the SDK instead of
drifting again.
- Java source/target compatibility was VERSION_1_8, which now warns
"source/target value 8 is obsolete and will be removed in a future
release". The template uses VERSION_17.
kotlinOptions.jvmTarget moves to 17 alongside it; leaving it at 1_8 would
fail with inconsistent JVM-target compatibility.
Both warnings are gone from the build output and the APK still builds.
---
example/android/app/build.gradle | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index 72964cfc0..1996fa610 100644
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -8,15 +8,15 @@ plugins {
android {
namespace = "io.livekit.example"
compileSdk = flutter.compileSdkVersion
- ndkVersion = "27.0.12077973"
+ ndkVersion = flutter.ndkVersion
compileOptions {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
+ sourceCompatibility = JavaVersion.VERSION_17
+ targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
- jvmTarget = JavaVersion.VERSION_1_8
+ jvmTarget = JavaVersion.VERSION_17
}
defaultConfig {