diff --git a/engine/src/flutter/shell/platform/darwin/ios/BUILD.gn b/engine/src/flutter/shell/platform/darwin/ios/BUILD.gn
index 9e39894..5b8ff3a 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/BUILD.gn
+++ b/engine/src/flutter/shell/platform/darwin/ios/BUILD.gn
@@ -65,6 +65,7 @@
     "framework/Source/AccessibilityFeatures.swift",
     "framework/Source/ConnectionCollection.swift",
     "framework/Source/DisplayLinkManager.swift",
+    "framework/Source/KeyboardInsetManager.swift",
     "framework/Source/LaunchEngine.swift",
     "framework/Source/SplashScreenManager.swift",
     "framework/Source/UIPressProxy.swift",
@@ -108,8 +109,6 @@
     "framework/Source/FlutterHeadlessDartRunner.mm",
     "framework/Source/FlutterKeyPrimaryResponder.h",
     "framework/Source/FlutterKeySecondaryResponder.h",
-    "framework/Source/FlutterKeyboardInsetManager.h",
-    "framework/Source/FlutterKeyboardInsetManager.mm",
     "framework/Source/FlutterKeyboardManager.h",
     "framework/Source/FlutterKeyboardManager.mm",
     "framework/Source/FlutterMetalLayer.h",
diff --git a/engine/src/flutter/shell/platform/darwin/ios/InternalFlutterSwift-Bridging-Header.h b/engine/src/flutter/shell/platform/darwin/ios/InternalFlutterSwift-Bridging-Header.h
index 26fc55b..d8b7c90 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/InternalFlutterSwift-Bridging-Header.h
+++ b/engine/src/flutter/shell/platform/darwin/ios/InternalFlutterSwift-Bridging-Header.h
@@ -9,5 +9,6 @@
 #import "flutter/shell/platform/darwin/ios/framework/Headers/Flutter.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterFMLTaskRunner.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterFMLTaskRunners.h"
+#import "flutter/third_party/spring_animation/spring_animation.h"
 
 #endif  // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_INTERNALFLUTTERSWIFT_BRIDGING_HEADER_H_
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.h b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.h
deleted file mode 100644
index 11d9af0..0000000
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERKEYBOARDINSETMANAGER_H_
-#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERKEYBOARDINSETMANAGER_H_
-
-#import <UIKit/UIKit.h>
-
-@class FlutterEngine;
-@class FlutterKeyboardInsetManager;
-
-/**
- * @brief Manages the calculations and animations for software keyboard insets.
- *
- * This class is responsible for observing keyboard notifications, calculating the appropriate
- * insets for the Flutter view based on the keyboard mode (docked, floating, hidden),
- * and animating the transition of the insets.
- */
-@protocol FlutterKeyboardInsetManagerDelegate <NSObject>
-
-/**
- * @brief Updates the viewport metrics with the new bottom inset.
- */
-- (void)updateViewportMetricsWithInset:(CGFloat)inset;
-
-/**
- * @brief Returns the current physical bottom view inset.
- */
-- (CGFloat)physicalViewInsetBottom;
-
-/**
- * @brief Returns the view associated with the delegate.
- */
-- (UIView*)view;
-
-/**
- * @brief Returns the engine associated with the delegate.
- */
-- (FlutterEngine*)engine;
-
-/**
- * @brief Returns the UIScreen associated with the Flutter view, if the view is loaded.
- */
-- (UIScreen*)flutterScreenIfViewLoaded;
-
-/**
- * @brief Returns whether the device is an iPad and in Slide Over or Stage Manager mode.
- */
-- (BOOL)isPadInSlideOverOrStageManagerMode;
-
-/**
- * @brief Converts a rectangle from the view's coordinate system to the screen's coordinate system.
- */
-- (CGRect)convertViewRectToScreen:(CGRect)rect;
-
-/**
- * @brief Returns whether the delegate's view is currently loaded.
- */
-- (BOOL)isViewLoaded;
-
-@end
-
-/**
- * @brief Coordinates the animation of the bottom viewport inset in response to system keyboard
- * visibility changes.
- *
- * This manager translates native iOS keyboard notifications into pixel insets for the engine. It
- * ensures that the Flutter app UI correctly resizes or scrolls when the software keyboard appears
- * or disappears.
- *
- * We synchronize the app's layout transitions with the native keyboard animation curve by tracking
- * a hidden internal view. When a keyboard notification is received, this view is animated using the
- * native iOS duration and curve. The manager tracks this animation and calls the delegate's update
- * methods on every vsync pulse until the transition completes.
- *
- * iOS doesn't provide us with a frame-by-frame callback for keyboard transitions, but we need to
- * animate our views smoothly to account for keyboard size/position changes. To ensure Flutter's
- * layout animates in perfect sync with the system keyboard, we use a "hidden view" synchronization
- * trick:
- *
- *  * When a keyboard notification (e.g., UIKeyboardWillShow) is received, the manager animates a
- *    hidden UIView's frame using the native iOS duration and curve.
- *  * A FlutterVSyncClient tracks the 'presentationLayer' of this hidden view on every vsync.
- *  * The intermediate positions are then translated into physical pixel insets and sent to the
- *    engine until the animation completes.
- *
- * To prevent incorrect layout shifts, the manager filters notifications based on the following
- * criteria:
- *
- * * Local notifications:
- *   In multitasking environments, such as iPad Split View, notifications triggered by interactions
- *   with other applications are ignored.
- *
- * * Keyboard attachment mode:
- *   The manager distinguishes between "docked" keyboards, which cover the bottom of the viewport,
- *   and "floating" or "undocked" keyboards. Floating keyboards do not typically require a viewport
- *   inset and are ignored to allow them to hover over the Flutter content without resizing the
- *   layout.
- *
- * * View lifecycle:
- *   Notifications are ignored if the associated view is not loaded or if the delegate is not the
- *   active view controller.
- *
- * @see [FlutterViewController], which owns this manager and acts as its delegate.
- */
-@interface FlutterKeyboardInsetManager : NSObject
-
-/**
- * @brief Initializes the manager with a delegate.
- *
- * The manager maintains a weak reference to the delegate.
- *
- * @param delegate The object that handles viewport updates. Typically a [FlutterViewController].
- */
-- (instancetype)initWithDelegate:(id<FlutterKeyboardInsetManagerDelegate>)delegate;
-
-/**
- * @brief Processes a system keyboard notification to update the target inset and begin any
- *        necessary animations.
- *
- * Consider calling this method from the view controller's keyboard notification observers. It
- * automatically performs filtering for non-local or floating keyboard events.
- *
- * @param notification The notification received from the [NSNotificationCenter].
- */
-- (void)handleKeyboardNotification:(NSNotification*)notification;
-
-/**
- * @brief Immediately stops any active keyboard animations and synchronizes the engine's viewport
- *        metrics with a zero inset.
- */
-- (void)hideKeyboardImmediately;
-
-/**
- * @brief Terminates any active animations and releases internal resources.
- *
- * Consider calling this method when the owner of the manager is being deallocated.
- */
-- (void)invalidate;
-
-/**
- * @brief The physical pixel value of the bottom inset once the current animation reaches its final
- *        state.
- */
-@property(nonatomic, assign, readonly) CGFloat targetViewInsetBottom;
-
-/**
- * @brief Indicates whether the keyboard is currently onscreen or in the process of transitioning
- *        from the background.
- */
-@property(nonatomic, assign) BOOL isKeyboardInOrTransitioningFromBackground;
-
-@end
-
-#endif  // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERKEYBOARDINSETMANAGER_H_
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.mm
deleted file mode 100644
index ad10e93..0000000
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.mm
+++ /dev/null
@@ -1,434 +0,0 @@
-// Copyright 2013 The Flutter Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.h"
-
-#include <memory>
-
-#include "flutter/fml/platform/darwin/platform_version.h"
-#include "flutter/fml/time/time_delta.h"
-#include "flutter/fml/time/time_point.h"
-#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h"
-#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h"
-#import "flutter/shell/platform/embedder/embedder.h"
-#import "flutter/third_party/spring_animation/spring_animation.h"
-
-@interface FlutterKeyboardInsetManager ()
-
-@property(nonatomic, weak) id<FlutterKeyboardInsetManagerDelegate> delegate;
-@property(nonatomic, assign, readwrite) CGFloat targetViewInsetBottom;
-@property(nonatomic, assign) CGFloat originalViewInsetBottom;
-@property(nonatomic, strong) FlutterVSyncClient* keyboardAnimationVSyncClient;
-@property(nonatomic, assign) BOOL keyboardAnimationIsShowing;
-@property(nonatomic, assign) NSTimeInterval keyboardAnimationStartTime;
-@property(nonatomic, strong) UIView* keyboardAnimationView;
-@property(nonatomic, strong) SpringAnimation* keyboardSpringAnimation;
-
-@end
-
-@implementation FlutterKeyboardInsetManager
-
-- (instancetype)initWithDelegate:(id<FlutterKeyboardInsetManagerDelegate>)delegate {
-  self = [super init];
-  if (self) {
-    _delegate = delegate;
-    _targetViewInsetBottom = 0.0;
-  }
-  return self;
-}
-
-- (void)handleKeyboardNotification:(NSNotification*)notification {
-  // See https://flutter.dev/go/ios-keyboard-calculating-inset for more details
-  // on why notifications are used and how things are calculated.
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  if (!delegate || [self shouldIgnoreKeyboardNotification:notification]) {
-    return;
-  }
-
-  NSDictionary* info = notification.userInfo;
-  CGRect beginKeyboardFrame = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
-  CGRect keyboardFrame = [info[UIKeyboardFrameEndUserInfoKey] CGRectValue];
-  FlutterKeyboardMode keyboardMode = [self calculateKeyboardAttachMode:notification];
-  CGFloat calculatedInset = [self calculateKeyboardInset:keyboardFrame keyboardMode:keyboardMode];
-  NSTimeInterval duration = [info[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
-
-  // If the software keyboard is displayed before displaying the PasswordManager prompt,
-  // UIKeyboardWillHideNotification will occur immediately after UIKeyboardWillShowNotification.
-  // The duration of the animation will be 0.0, and the calculated inset will be 0.0.
-  // In this case, it is necessary to cancel the animation and hide the keyboard immediately.
-  // https://github.com/flutter/flutter/pull/164884
-  if (keyboardMode == FlutterKeyboardModeHidden && calculatedInset == 0.0 && duration == 0.0) {
-    [self hideKeyboardImmediately];
-    return;
-  }
-
-  // Avoid double triggering startKeyBoardAnimation.
-  if (self.targetViewInsetBottom == calculatedInset) {
-    return;
-  }
-  self.targetViewInsetBottom = calculatedInset;
-
-  // Flag for simultaneous compounding animation calls.
-  // This captures animation calls made while the keyboard animation is currently animating. If the
-  // new animation is in the same direction as the current animation, this flag lets the current
-  // animation continue with an updated targetViewInsetBottom instead of starting a new keyboard
-  // animation. This allows for smoother keyboard animation interpolation.
-  BOOL keyboardWillShow = beginKeyboardFrame.origin.y > keyboardFrame.origin.y;
-  BOOL keyboardAnimationIsCompounding =
-      self.keyboardAnimationIsShowing == keyboardWillShow && _keyboardAnimationVSyncClient != nil;
-
-  // Mark keyboard as showing or hiding.
-  self.keyboardAnimationIsShowing = keyboardWillShow;
-
-  if (!keyboardAnimationIsCompounding) {
-    [self startKeyBoardAnimation:duration];
-  } else if (self.keyboardSpringAnimation) {
-    self.keyboardSpringAnimation.toValue = self.targetViewInsetBottom;
-  }
-}
-
-- (BOOL)shouldIgnoreKeyboardNotification:(NSNotification*)notification {
-  // Don't ignore UIKeyboardWillHideNotification notifications.
-  // Even if the notification is triggered in the background or by a different app/view controller,
-  // we want to always handle this notification to avoid inaccurate inset when in a mulitasking mode
-  // or when switching between apps.
-  if (notification.name == UIKeyboardWillHideNotification) {
-    return NO;
-  }
-
-  // Ignore notification when keyboard's dimensions and position are all zeroes for
-  // UIKeyboardWillChangeFrameNotification. This happens when keyboard is dragged. Do not ignore if
-  // the notification is UIKeyboardWillShowNotification, as CGRectZero for that notfication only
-  // occurs when Minimized/Expanded Shortcuts Bar is dropped after dragging, which we later use to
-  // categorize it as floating.
-  NSDictionary* info = notification.userInfo;
-  CGRect keyboardFrame = [info[UIKeyboardFrameEndUserInfoKey] CGRectValue];
-  if (notification.name == UIKeyboardWillChangeFrameNotification &&
-      CGRectEqualToRect(keyboardFrame, CGRectZero)) {
-    return YES;
-  }
-
-  // When keyboard's height or width is set to 0, don't ignore. This does not happen
-  // often but can happen sometimes when switching between multitasking modes.
-  if (CGRectIsEmpty(keyboardFrame)) {
-    return NO;
-  }
-
-  // Ignore keyboard notifications related to other apps or view controllers.
-  if ([self isKeyboardNotificationForDifferentView:notification]) {
-    return YES;
-  }
-  return NO;
-}
-
-- (BOOL)isKeyboardNotificationForDifferentView:(NSNotification*)notification {
-  NSDictionary* info = notification.userInfo;
-
-  // Keyboard notifications related to other apps.
-  // If the UIKeyboardIsLocalUserInfoKey key doesn't exist (this should not happen after iOS 8),
-  // proceed as if it was local so that the notification is not ignored.
-  id isLocal = info[UIKeyboardIsLocalUserInfoKey];
-  if (isLocal && ![isLocal boolValue]) {
-    return YES;
-  }
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  return (id)delegate.engine.viewController != (id)delegate;
-}
-
-- (FlutterKeyboardMode)calculateKeyboardAttachMode:(NSNotification*)notification {
-  // There are multiple types of keyboard: docked, undocked, split, split docked,
-  // floating, expanded shortcuts bar, minimized shortcuts bar. This function will categorize
-  // the keyboard as one of the following modes: docked, floating, or hidden.
-  // Docked mode includes docked, split docked, expanded shortcuts bar (when opening via click),
-  // and minimized shortcuts bar (when opened via click).
-  // Floating includes undocked, split, floating, expanded shortcuts bar (when dragged and dropped),
-  // and minimized shortcuts bar (when dragged and dropped).
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  if (!delegate) {
-    return FlutterKeyboardModeHidden;
-  }
-  NSDictionary* info = notification.userInfo;
-  CGRect keyboardFrame = [info[UIKeyboardFrameEndUserInfoKey] CGRectValue];
-
-  if (notification.name == UIKeyboardWillHideNotification) {
-    return FlutterKeyboardModeHidden;
-  }
-
-  // If keyboard's dimensions and position are all zeroes, that means it's a Minimized/Expanded
-  // Shortcuts Bar that has been dropped after dragging, which we categorize as floating.
-  if (CGRectEqualToRect(keyboardFrame, CGRectZero)) {
-    return FlutterKeyboardModeFloating;
-  }
-  // If keyboard's width or height are 0, it's hidden.
-  if (CGRectIsEmpty(keyboardFrame)) {
-    return FlutterKeyboardModeHidden;
-  }
-
-  CGRect screenRect = delegate.flutterScreenIfViewLoaded.bounds;
-  CGRect adjustedKeyboardFrame = keyboardFrame;
-  adjustedKeyboardFrame.origin.y += [self calculateMultitaskingAdjustment:screenRect
-                                                            keyboardFrame:keyboardFrame];
-
-  // If the keyboard is partially or fully showing within the screen, it's either docked or
-  // floating. Sometimes with custom keyboard extensions, the keyboard's position may be off by a
-  // small decimal amount (which is why CGRectIntersectRect can't be used). Round to compare.
-  CGRect intersection = CGRectIntersection(adjustedKeyboardFrame, screenRect);
-  CGFloat intersectionHeight = CGRectGetHeight(intersection);
-  CGFloat intersectionWidth = CGRectGetWidth(intersection);
-  if (round(intersectionHeight) > 0 && intersectionWidth > 0) {
-    CGFloat screenHeight = CGRectGetHeight(screenRect);
-    CGFloat adjustedKeyboardBottom = CGRectGetMaxY(adjustedKeyboardFrame);
-    if (round(adjustedKeyboardBottom) < screenHeight) {
-      return FlutterKeyboardModeFloating;
-    }
-    return FlutterKeyboardModeDocked;
-  }
-  return FlutterKeyboardModeHidden;
-}
-
-/**
- * @brief Calculates the adjustment needed for multitasking modes like Slide Over on iPad.
- *
- * In Slide Over mode, the keyboard's frame does not include the space below the app,
- * even though the keyboard may be at the bottom of the screen. This method calculates
- * that offset so we can shift the y origin correctly.
- */
-- (CGFloat)calculateMultitaskingAdjustment:(CGRect)screenRect keyboardFrame:(CGRect)keyboardFrame {
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  if (!delegate.isViewLoaded) {
-    return 0;
-  }
-
-  // In Slide Over mode, the keyboard's frame does not include the space
-  // below the app, even though the keyboard may be at the bottom of the screen.
-  // To handle, shift the Y origin by the amount of space below the app.
-  UIView* view = delegate.view;
-  if ([delegate isPadInSlideOverOrStageManagerMode]) {
-    CGFloat screenHeight = CGRectGetHeight(screenRect);
-    CGFloat keyboardBottom = CGRectGetMaxY(keyboardFrame);
-
-    // Stage Manager mode will also meet the above parameters, but it does not handle
-    // the keyboard positioning the same way, so skip if keyboard is at bottom of page.
-    if (screenHeight == keyboardBottom) {
-      return 0;
-    }
-    CGRect viewRectRelativeToScreen = [delegate convertViewRectToScreen:view.bounds];
-    CGFloat viewBottom = CGRectGetMaxY(viewRectRelativeToScreen);
-    CGFloat offset = screenHeight - viewBottom;
-    if (offset > 0) {
-      return offset;
-    }
-  }
-  return 0;
-}
-
-- (CGFloat)calculateKeyboardInset:(CGRect)keyboardFrame
-                     keyboardMode:(FlutterKeyboardMode)keyboardMode {
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-
-  // Only docked keyboards will have an inset.
-  if (keyboardMode == FlutterKeyboardModeDocked) {
-    if (!delegate.isViewLoaded) {
-      return 0;
-    }
-    UIView* view = delegate.view;
-    CGRect viewRectRelativeToScreen = [delegate convertViewRectToScreen:view.bounds];
-    CGRect intersection = CGRectIntersection(keyboardFrame, viewRectRelativeToScreen);
-    CGFloat portionOfKeyboardInView = CGRectGetHeight(intersection);
-
-    // The keyboard is treated as an inset since we want to effectively reduce the window size by
-    // the keyboard height. The Dart side will compute a value accounting for the keyboard-consuming
-    // bottom padding.
-    CGFloat scale = delegate.flutterScreenIfViewLoaded.scale;
-    return portionOfKeyboardInView * scale;
-  }
-  return 0;
-}
-
-- (void)startKeyBoardAnimation:(NSTimeInterval)duration {
-  // If current physical_view_inset_bottom == targetViewInsetBottom, do nothing.
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  if (!delegate.isViewLoaded) {
-    return;
-  }
-  UIView* view = delegate.view;
-
-  // When this method is called for the first time,
-  // initialize the keyboardAnimationView to get animation interpolation during animation.
-  if (!self.keyboardAnimationView) {
-    UIView* keyboardAnimationView = [[UIView alloc] init];
-    keyboardAnimationView.hidden = YES;
-    self.keyboardAnimationView = keyboardAnimationView;
-  }
-
-  if (self.keyboardAnimationView.superview != view) {
-    [view addSubview:self.keyboardAnimationView];
-  }
-
-  // Remove running animation when start another animation.
-  [self.keyboardAnimationView.layer removeAllAnimations];
-
-  // Set animation begin value and DisplayLink tracking values.
-  CGFloat currentInset = delegate.physicalViewInsetBottom;
-  self.keyboardAnimationView.frame = CGRectMake(0, currentInset, 0, 0);
-  self.keyboardAnimationStartTime = CACurrentMediaTime();
-  self.originalViewInsetBottom = currentInset;
-
-  // Invalidate old vsync client if old animation is not completed.
-  [self invalidateKeyboardAnimationVSyncClient];
-
-  __weak FlutterKeyboardInsetManager* weakSelf = self;
-  [self setUpKeyboardAnimationVsyncClient:^(NSTimeInterval targetTime) {
-    [weakSelf handleKeyboardAnimationCallbackWithTargetTime:targetTime];
-  }];
-  FlutterVSyncClient* currentVsyncClient = _keyboardAnimationVSyncClient;
-
-  [UIView animateWithDuration:duration
-      animations:^{
-        FlutterKeyboardInsetManager* strongSelf = weakSelf;
-        if (!strongSelf) {
-          return;
-        }
-
-        // Set end value.
-        strongSelf.keyboardAnimationView.frame =
-            CGRectMake(0, strongSelf.targetViewInsetBottom, 0, 0);
-
-        // Setup keyboard animation interpolation.
-        [strongSelf.keyboardAnimationView layoutIfNeeded];
-        CAAnimation* keyboardAnimation =
-            [strongSelf.keyboardAnimationView.layer animationForKey:@"position"];
-        [strongSelf setUpKeyboardSpringAnimationIfNeeded:keyboardAnimation];
-      }
-      completion:^(BOOL finished) {
-        FlutterKeyboardInsetManager* strongSelf = weakSelf;
-        if (strongSelf && strongSelf.keyboardAnimationVSyncClient == currentVsyncClient) {
-          // Indicates the vsync client captured by this block is the original one, which also
-          // indicates the animation has not been interrupted from its beginning. Moreover,
-          // indicates the animation is over and there is no more to execute.
-          [strongSelf invalidateKeyboardAnimationVSyncClient];
-          [strongSelf removeKeyboardAnimationView];
-          [strongSelf ensureViewportMetricsIsCorrect];
-        }
-      }];
-}
-
-- (void)hideKeyboardImmediately {
-  [self invalidateKeyboardAnimationVSyncClient];
-  if (self.keyboardAnimationView) {
-    [self.keyboardAnimationView.layer removeAllAnimations];
-    [self removeKeyboardAnimationView];
-    self.keyboardAnimationView = nil;
-  }
-  if (self.keyboardSpringAnimation) {
-    self.keyboardSpringAnimation = nil;
-  }
-  self.targetViewInsetBottom = 0.0;
-  [self ensureViewportMetricsIsCorrect];
-}
-
-- (void)setUpKeyboardSpringAnimationIfNeeded:(CAAnimation*)keyboardAnimation {
-  // If keyboard animation is null or not a spring animation, fallback to DisplayLink tracking.
-  if (keyboardAnimation == nil || ![keyboardAnimation isKindOfClass:[CASpringAnimation class]]) {
-    _keyboardSpringAnimation = nil;
-    return;
-  }
-
-  // Set up keyboard spring animation details for spring curve animation calculation.
-  CASpringAnimation* keyboardCASpringAnimation = (CASpringAnimation*)keyboardAnimation;
-  _keyboardSpringAnimation =
-      [[SpringAnimation alloc] initWithStiffness:keyboardCASpringAnimation.stiffness
-                                         damping:keyboardCASpringAnimation.damping
-                                            mass:keyboardCASpringAnimation.mass
-                                 initialVelocity:keyboardCASpringAnimation.initialVelocity
-                                       fromValue:self.originalViewInsetBottom
-                                         toValue:self.targetViewInsetBottom];
-}
-
-- (void)handleKeyboardAnimationCallbackWithTargetTime:(NSTimeInterval)targetTime {
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-
-  // If the view controller's view is not loaded, bail out.
-  if (!delegate.isViewLoaded) {
-    return;
-  }
-  // If the view for tracking keyboard animation is nil, means it is not
-  // created, bail out.
-  if (!self.keyboardAnimationView) {
-    return;
-  }
-  // If keyboardAnimationVSyncClient is nil, means the animation ends.
-  // And should bail out.
-  if (!self.keyboardAnimationVSyncClient) {
-    return;
-  }
-
-  if (self.keyboardAnimationView.superview != delegate.view) {
-    // Ensure the keyboardAnimationView is in view hierarchy when animation running.
-    [delegate.view addSubview:self.keyboardAnimationView];
-  }
-
-  CGFloat currentInset = 0;
-  if (!self.keyboardSpringAnimation) {
-    if (self.keyboardAnimationView.layer.presentationLayer) {
-      currentInset = self.keyboardAnimationView.layer.presentationLayer.frame.origin.y;
-    }
-  } else {
-    NSTimeInterval timeElapsed = targetTime - self.keyboardAnimationStartTime;
-    currentInset = [self.keyboardSpringAnimation curveFunction:timeElapsed];
-  }
-
-  [delegate updateViewportMetricsWithInset:currentInset];
-}
-
-- (void)setUpKeyboardAnimationVsyncClient:
-    (FlutterKeyboardAnimationCallback)keyboardAnimationCallback {
-  if (!keyboardAnimationCallback) {
-    return;
-  }
-  NSAssert(_keyboardAnimationVSyncClient == nil,
-           @"_keyboardAnimationVSyncClient must be nil when setting up.");
-
-  // Make sure the new viewport metrics get sent after the begin frame event has processed.
-  FlutterKeyboardAnimationCallback animationCallback = [keyboardAnimationCallback copy];
-
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  auto vsyncCallback = ^(CFTimeInterval startTime, CFTimeInterval targetTime) {
-    CFTimeInterval frameInterval = targetTime - startTime;
-    CFTimeInterval projectedTargetTime = targetTime + frameInterval;
-    dispatch_async(dispatch_get_main_queue(), ^(void) {
-      animationCallback(projectedTargetTime);
-    });
-  };
-  _keyboardAnimationVSyncClient = [[FlutterVSyncClient alloc]
-                initWithTaskRunner:delegate.engine.uiTaskRunner
-      isVariableRefreshRateEnabled:FlutterDisplayLinkManager.maxRefreshRateEnabledOnIPhone
-                    maxRefreshRate:FlutterDisplayLinkManager.displayRefreshRate
-                          callback:vsyncCallback];
-  _keyboardAnimationVSyncClient.allowPauseAfterVsync = NO;
-  [_keyboardAnimationVSyncClient await];
-}
-
-- (void)invalidateKeyboardAnimationVSyncClient {
-  [_keyboardAnimationVSyncClient invalidate];
-  _keyboardAnimationVSyncClient = nil;
-}
-
-- (void)removeKeyboardAnimationView {
-  if (self.keyboardAnimationView.superview != nil) {
-    [self.keyboardAnimationView removeFromSuperview];
-  }
-}
-
-- (void)ensureViewportMetricsIsCorrect {
-  id<FlutterKeyboardInsetManagerDelegate> delegate = self.delegate;
-  [delegate updateViewportMetricsWithInset:self.targetViewInsetBottom];
-}
-
-- (void)invalidate {
-  [self invalidateKeyboardAnimationVSyncClient];
-  [self removeKeyboardAnimationView];
-}
-
-@end
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
index 27e30b1..4a152ce 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
+++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController.mm
@@ -23,7 +23,6 @@
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine+TaskRunners.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyPrimaryResponder.h"
-#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardManager.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformPlugin.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h"
@@ -2318,6 +2317,10 @@
   return _viewportMetrics.physical_view_inset_bottom;
 }
 
+- (FlutterFMLTaskRunner*)uiTaskRunner {
+  return self.engine.uiTaskRunner;
+}
+
 - (BOOL)isPadInSlideOverOrStageManagerMode {
   if (self.view.traitCollection.userInterfaceIdiom == UIUserInterfaceIdiomPad &&
       self.view.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact &&
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
index d26e130..07e1014 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
+++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewControllerTest.mm
@@ -15,6 +15,7 @@
 #import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate_Internal.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEmbedderKeyResponder.h"
+#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine+TaskRunners.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterFakeKeyEvents.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegate_internal.h"
@@ -32,6 +33,8 @@
 
 using namespace flutter::testing;
 
+typedef void (^FlutterKeyboardAnimationCallback)(NSTimeInterval targetTime);
+
 @interface FlutterKeyboardInsetManager (Test)
 - (void)setUpKeyboardAnimationVsyncClient:
     (FlutterKeyboardAnimationCallback)keyboardAnimationCallback;
@@ -42,7 +45,8 @@
 @property(nonatomic, assign) BOOL isKeyboardInOrTransitioningFromBackground;
 - (void)handleKeyboardNotification:(NSNotification*)notification;
 - (BOOL)isKeyboardNotificationForDifferentView:(NSNotification*)notification;
-- (CGFloat)calculateKeyboardInset:(CGRect)keyboardFrame keyboardMode:(int)keyboardMode;
+- (CGFloat)calculateKeyboardInset:(CGRect)keyboardFrame
+                     keyboardMode:(FlutterKeyboardMode)keyboardMode;
 - (BOOL)shouldIgnoreKeyboardNotification:(NSNotification*)notification;
 - (FlutterKeyboardMode)calculateKeyboardAttachMode:(NSNotification*)notification;
 - (CGFloat)calculateMultitaskingAdjustment:(CGRect)screenRect keyboardFrame:(CGRect)keyboardFrame;
@@ -55,15 +59,86 @@
 - (void)invalidateKeyboardAnimationVSyncClient;
 @end
 
-@interface FlutterKeyboardInsetManagerMock : FlutterKeyboardInsetManager
-@property(nonatomic, assign) BOOL didCallStartKeyboardAnimation;
+// A fake keyboard inset manager.
+//
+// Used to verify that FlutterViewController drives the manager through the
+// FlutterKeyboardInsetManagerProtocol (e.g. on viewDidDisappear), while
+// avoiding the need to set up and perform real animations.
+@interface FakeFlutterKeyboardInsetManager : NSObject <FlutterKeyboardInsetManagerProtocol>
+@property(nonatomic, assign) CGFloat targetViewInsetBottom;
+@property(nonatomic, assign) BOOL isKeyboardInOrTransitioningFromBackground;
+@property(nonatomic, strong) FlutterVSyncClient* keyboardAnimationVSyncClient;
+@property(nonatomic, assign) BOOL didCallEnsureViewportMetricsIsCorrect;
+@property(nonatomic, assign) BOOL didCallInvalidateKeyboardAnimationVSyncClient;
+
+- (instancetype)initWithDelegate:(id<FlutterKeyboardInsetManagerDelegate>)delegate;
 @end
 
-@implementation FlutterKeyboardInsetManagerMock
-- (void)startKeyBoardAnimation:(NSTimeInterval)duration {
-  [super startKeyBoardAnimation:duration];
-  self.didCallStartKeyboardAnimation = YES;
+@implementation FakeFlutterKeyboardInsetManager {
+  __weak id<FlutterKeyboardInsetManagerDelegate> _delegate;
 }
+
+- (instancetype)initWithDelegate:(id<FlutterKeyboardInsetManagerDelegate>)delegate {
+  self = [super init];
+  if (self) {
+    _delegate = delegate;
+  }
+  return self;
+}
+
+- (void)setDelegate:(id<FlutterKeyboardInsetManagerDelegate>)delegate {
+  _delegate = delegate;
+}
+
+- (id<FlutterKeyboardInsetManagerDelegate>)delegate {
+  return _delegate;
+}
+
+- (void)startKeyBoardAnimation:(NSTimeInterval)duration {
+}
+
+- (void)handleKeyboardNotification:(NSNotification*)notification {
+}
+
+- (void)setUpKeyboardAnimationVsyncClient:(FlutterKeyboardAnimationCallback)animationCallback {
+  self.keyboardAnimationVSyncClient = nil;
+}
+
+- (void)invalidate {
+}
+
+- (void)setUpKeyboardSpringAnimationIfNeeded:(CAAnimation*)keyboardAnimation {
+}
+
+- (BOOL)shouldIgnoreKeyboardNotification:(NSNotification*)notification {
+  return NO;
+}
+
+- (FlutterKeyboardMode)calculateKeyboardAttachMode:(NSNotification*)notification {
+  return FlutterKeyboardModeHidden;
+}
+
+- (void)ensureViewportMetricsIsCorrect {
+  self.didCallEnsureViewportMetricsIsCorrect = YES;
+}
+
+- (void)invalidateKeyboardAnimationVSyncClient {
+  self.didCallInvalidateKeyboardAnimationVSyncClient = YES;
+}
+
+- (void)hideKeyboardImmediately {
+  [self ensureViewportMetricsIsCorrect];
+  [self invalidateKeyboardAnimationVSyncClient];
+}
+
+- (SpringAnimation*)keyboardSpringAnimation {
+  return nullptr;
+}
+
+- (UIView*)keyboardAnimationView {
+  return nullptr;
+}
+
 @end
 
 @interface TestKeyboardInsetDelegate : NSObject <FlutterKeyboardInsetManagerDelegate>
@@ -75,33 +150,55 @@
 @property(nonatomic, assign) BOOL isViewLoaded;
 @property(nonatomic, assign) BOOL mockIsPadInSlideOverOrStageManagerMode;
 @property(nonatomic, assign) CGRect mockConvertedViewRect;
+@property(nonatomic, strong) FlutterFMLTaskRunner* mockTaskRunner;
 @end
 
 @implementation TestKeyboardInsetDelegate
+
+- (instancetype)init {
+  if (self = [super init]) {
+    fml::MessageLoop::EnsureInitializedForCurrentThread();
+    _mockTaskRunner = [[FlutterFMLTaskRunner alloc]
+        initWithTaskRunner:fml::MessageLoop::GetCurrent().GetTaskRunner()];
+  }
+  return self;
+}
+
+- (FlutterFMLTaskRunner*)uiTaskRunner {
+  return self.mockTaskRunner;
+}
+
 - (void)updateViewportMetricsWithInset:(CGFloat)inset {
   self.currentInset = inset;
   if (self.updateViewportMetricsBlock) {
     self.updateViewportMetricsBlock(inset);
   }
 }
+
 - (CGFloat)physicalViewInsetBottom {
   return self.currentInset;
 }
+
 - (UIView*)view {
   return self.mockView;
 }
+
 - (FlutterEngine*)engine {
   return self.mockEngine;
 }
+
 - (UIScreen*)flutterScreenIfViewLoaded {
   return self.mockScreen;
 }
+
 - (BOOL)isPadInSlideOverOrStageManagerMode {
   return self.mockIsPadInSlideOverOrStageManagerMode;
 }
+
 - (CGRect)convertViewRectToScreen:(CGRect)rect {
   return self.mockConvertedViewRect;
 }
+
 @end
 
 /// Sometimes we have to use a custom mock to avoid retain cycles in OCMock.
@@ -340,34 +437,48 @@
                                                                                  bundle:nil];
   FlutterViewController* viewControllerMock = OCMPartialMock(viewController);
   OCMStub([viewControllerMock isViewLoaded]).andReturn(YES);
-  [viewControllerMock view];
+  __unused UIView* dummyView = [viewControllerMock view];
   viewController.keyboardInsetManager.delegate =
       (id<FlutterKeyboardInsetManagerDelegate>)viewControllerMock;
 
   engine.viewController = viewControllerMock;
 
-  id managerMock = OCMPartialMock(viewController.keyboardInsetManager);
-  viewController.keyboardInsetManager = managerMock;
+  FlutterKeyboardInsetManager* manager =
+      (FlutterKeyboardInsetManager*)viewController.keyboardInsetManager;
 
   id viewClassMock = OCMClassMock([UIView class]);
   OCMStub([viewClassMock animateWithDuration:0.25 animations:[OCMArg any] completion:[OCMArg any]])
       .andDo(^(NSInvocation* invocation) {
-        void (^animations)(void);
+        // -getArgument:atIndex: does a raw memcpy without retaining; declare the block locals
+        // __unsafe_unretained so ARC doesn't over-release the invocation-owned blocks.
+        __unsafe_unretained void (^animations)(void);
         [invocation getArgument:&animations atIndex:3];
         if (animations) {
           animations();
         }
-        void (^completion)(BOOL finished);
+        __unsafe_unretained void (^completion)(BOOL finished);
         [invocation getArgument:&completion atIndex:4];
         if (completion) {
           completion(YES);
         }
       });
 
-  viewController.keyboardInsetManager.targetViewInsetBottom = 320;
-  [managerMock startKeyBoardAnimation:0.25];
+  // Pre-seed a spring animation. startKeyBoardAnimation: must call
+  // setUpKeyboardSpringAnimationIfNeeded:, which clears it back to nil since the UIView animation
+  // is mocked out and therefore produces no real "position" CASpringAnimation to derive one from.
+  manager.targetViewInsetBottom = 320;
+  manager.keyboardSpringAnimation = [[SpringAnimation alloc] initWithStiffness:100
+                                                                       damping:10
+                                                                          mass:1
+                                                               initialVelocity:0
+                                                                     fromValue:0
+                                                                       toValue:320];
+  XCTAssertNotNil(manager.keyboardSpringAnimation);
 
-  OCMVerify([managerMock setUpKeyboardSpringAnimationIfNeeded:[OCMArg any]]);
+  [manager startKeyBoardAnimation:0.25];
+
+  XCTAssertNil(manager.keyboardSpringAnimation);
+  [viewClassMock stopMocking];
 }
 
 - (void)testSetupKeyboardSpringAnimationIfNeeded {
@@ -386,7 +497,7 @@
   // Null check.
   [viewController.keyboardInsetManager setUpKeyboardSpringAnimationIfNeeded:nil];
   SpringAnimation* keyboardSpringAnimation =
-      [viewController.keyboardInsetManager keyboardSpringAnimation];
+      viewController.keyboardInsetManager.keyboardSpringAnimation;
   XCTAssertTrue(keyboardSpringAnimation == nil);
 
   // CAAnimation that is not a CASpringAnimation.
@@ -396,7 +507,7 @@
   nonSpringAnimation.toValue = [NSNumber numberWithFloat:1.0];
   nonSpringAnimation.keyPath = @"position";
   [viewController.keyboardInsetManager setUpKeyboardSpringAnimationIfNeeded:nonSpringAnimation];
-  keyboardSpringAnimation = [viewController.keyboardInsetManager keyboardSpringAnimation];
+  keyboardSpringAnimation = viewController.keyboardInsetManager.keyboardSpringAnimation;
 
   XCTAssertTrue(keyboardSpringAnimation == nil);
 
@@ -409,7 +520,7 @@
   springAnimation.fromValue = [NSValue valueWithCGPoint:CGPointMake(0, 0)];
   springAnimation.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)];
   [viewController.keyboardInsetManager setUpKeyboardSpringAnimationIfNeeded:springAnimation];
-  keyboardSpringAnimation = [viewController.keyboardInsetManager keyboardSpringAnimation];
+  keyboardSpringAnimation = viewController.keyboardInsetManager.keyboardSpringAnimation;
   XCTAssertTrue(keyboardSpringAnimation != nil);
 }
 
@@ -429,17 +540,19 @@
   TestKeyboardInsetDelegate* delegate = [[TestKeyboardInsetDelegate alloc] init];
   delegate.isViewLoaded = YES;
   delegate.mockScreen = screen;
-
+  delegate.mockView = [[UIView alloc] init];
   delegate.mockConvertedViewRect = viewFrame;
 
   FlutterEnginePartialMock* engine = [[FlutterEnginePartialMock alloc] init];
   delegate.mockEngine = engine;
 
+  // Set the delegate as the engine's current view controller so the notifications are not
+  // treated as coming from a different view (i.e. shouldIgnoreKeyboardNotification: returns NO).
+  engine.viewController = (FlutterViewController*)delegate;
+
   FlutterKeyboardInsetManager* manager =
       [[FlutterKeyboardInsetManager alloc] initWithDelegate:delegate];
 
-  id managerMock = OCMPartialMock(manager);
-  OCMStub([managerMock shouldIgnoreKeyboardNotification:[OCMArg any]]).andReturn(NO);
   BOOL isLocal = YES;
 
   // Start show keyboard animation.
@@ -455,7 +568,7 @@
                     @"UIKeyboardIsLocalUserInfoKey" : @(isLocal)
                   }];
   manager.targetViewInsetBottom = 0;
-  [managerMock handleKeyboardNotification:fakeNotification];
+  [manager handleKeyboardNotification:fakeNotification];
   BOOL isShowingAnimation1 = manager.keyboardAnimationIsShowing;
   XCTAssertTrue(isShowingAnimation1);
 
@@ -472,7 +585,7 @@
                     @"UIKeyboardIsLocalUserInfoKey" : @(isLocal)
                   }];
 
-  [managerMock handleKeyboardNotification:fakeNotification];
+  [manager handleKeyboardNotification:fakeNotification];
   BOOL isShowingAnimation2 = manager.keyboardAnimationIsShowing;
   XCTAssertTrue(isShowingAnimation2);
   XCTAssertTrue(isShowingAnimation1 == isShowingAnimation2);
@@ -490,7 +603,7 @@
                     @"UIKeyboardIsLocalUserInfoKey" : @(isLocal)
                   }];
 
-  [managerMock handleKeyboardNotification:fakeNotification];
+  [manager handleKeyboardNotification:fakeNotification];
   BOOL isShowingAnimation3 = manager.keyboardAnimationIsShowing;
   XCTAssertFalse(isShowingAnimation3);
   XCTAssertTrue(isShowingAnimation2 != isShowingAnimation3);
@@ -508,10 +621,12 @@
                     @"UIKeyboardIsLocalUserInfoKey" : @(isLocal)
                   }];
 
-  [managerMock handleKeyboardNotification:fakeNotification];
+  [manager handleKeyboardNotification:fakeNotification];
   BOOL isShowingAnimation4 = manager.keyboardAnimationIsShowing;
   XCTAssertFalse(isShowingAnimation4);
   XCTAssertTrue(isShowingAnimation3 == isShowingAnimation4);
+
+  [manager invalidate];
 }
 
 - (void)testShouldIgnoreKeyboardNotification {
@@ -522,8 +637,8 @@
   // isKeyboardNotificationForDifferentView
   OCMStub([self.mockEngine viewController]).andReturn(viewControllerMock);
 
-  // Use custom mock for manager to avoid OCMock andDo block issues with C++ interop
-  FlutterKeyboardInsetManagerMock* managerMock = [[FlutterKeyboardInsetManagerMock alloc]
+  // Exercise the real shouldIgnoreKeyboardNotification: implementation.
+  FlutterKeyboardInsetManager* managerMock = [[FlutterKeyboardInsetManager alloc]
       initWithDelegate:(id<FlutterKeyboardInsetManagerDelegate>)viewControllerMock];
   viewController.keyboardInsetManager = managerMock;
 
@@ -628,7 +743,7 @@
                                                                                  bundle:nil];
   FlutterViewController* viewControllerMock = OCMPartialMock(viewController);
   OCMStub([viewControllerMock isViewLoaded]).andReturn(YES);
-  [viewControllerMock view];
+  __unused UIView* dummyView = [viewControllerMock view];
   viewController.keyboardInsetManager.delegate =
       (id<FlutterKeyboardInsetManagerDelegate>)viewControllerMock;
 
@@ -906,19 +1021,28 @@
   delegate.isViewLoaded = YES;
   delegate.mockScreen = screen;
 
+  // view() is non-optional in the delegate protocol; provide a real view so the real
+  // startKeyBoardAnimation: can add its animation view to the hierarchy.
+  delegate.mockView = [[UIView alloc] init];
   delegate.mockConvertedViewRect = viewFrame;
 
   FlutterEnginePartialMock* engine = [[FlutterEnginePartialMock alloc] init];
   delegate.mockEngine = engine;
   engine.viewController = (FlutterViewController*)delegate;
 
-  FlutterKeyboardInsetManagerMock* managerMock =
-      [[FlutterKeyboardInsetManagerMock alloc] initWithDelegate:delegate];
-  managerMock.targetViewInsetBottom = 0;
+  FlutterKeyboardInsetManager* manager =
+      [[FlutterKeyboardInsetManager alloc] initWithDelegate:delegate];
+  manager.targetViewInsetBottom = 0;
 
-  [managerMock handleKeyboardNotification:notification];
-  XCTAssertTrue(managerMock.targetViewInsetBottom == 320 * screen.scale);
-  XCTAssertTrue(managerMock.didCallStartKeyboardAnimation);
+  [manager handleKeyboardNotification:notification];
+
+  // Verify the docked keyboard produces an inset.
+  XCTAssertTrue(manager.targetViewInsetBottom == 320 * screen.scale);
+
+  // Verify handleKeyboardNotification: kicks off the animation, which sets up the vsync client.
+  XCTAssertNotNil(manager.keyboardAnimationVSyncClient);
+
+  [manager invalidate];
 }
 
 - (void)testEnsureBottomInsetIsZeroWhenKeyboardDismissed {
@@ -964,7 +1088,7 @@
 
   engine.viewController = viewControllerMock;
   OCMStub([viewControllerMock isViewLoaded]).andReturn(YES);
-  [viewControllerMock view];
+  __unused UIView* dummyView2 = [viewControllerMock view];
 
   UIScreen* screen = [self setUpMockScreen];
   OCMStub([screen scale]).andReturn(1.0);
@@ -1020,13 +1144,14 @@
   viewController.keyboardInsetManager.delegate =
       (id<FlutterKeyboardInsetManagerDelegate>)viewControllerMock;
 
-  id managerMock = OCMPartialMock(viewController.keyboardInsetManager);
+  FakeFlutterKeyboardInsetManager* managerMock = [[FakeFlutterKeyboardInsetManager alloc]
+      initWithDelegate:(id<FlutterKeyboardInsetManagerDelegate>)viewControllerMock];
   viewController.keyboardInsetManager = managerMock;
 
   [viewControllerMock viewDidDisappear:YES];
 
-  OCMVerify([managerMock ensureViewportMetricsIsCorrect]);
-  OCMVerify([managerMock invalidateKeyboardAnimationVSyncClient]);
+  XCTAssertTrue(managerMock.didCallEnsureViewportMetricsIsCorrect);
+  XCTAssertTrue(managerMock.didCallInvalidateKeyboardAnimationVSyncClient);
 }
 
 - (void)testViewDidDisappearDoesntPauseEngineWhenNotTheViewController {
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h
index 78234fb..1f52df5 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h
+++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h
@@ -9,7 +9,6 @@
 
 #import "flutter/shell/platform/darwin/ios/InternalFlutterSwift/InternalFlutterSwift.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeySecondaryResponder.h"
-#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardInsetManager.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterKeyboardManager.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsController.h"
 #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterRestorationPlugin.h"
@@ -32,22 +31,12 @@
 // NOLINTNEXTLINE(readability-identifier-naming)
 extern NSNotificationName const FlutterViewControllerShowHomeIndicator;
 
-typedef NS_ENUM(NSInteger, FlutterKeyboardMode) {
-  // NOLINTBEGIN(readability-identifier-naming)
-  FlutterKeyboardModeHidden = 0,
-  FlutterKeyboardModeDocked = 1,
-  FlutterKeyboardModeFloating = 2,
-  // NOLINTEND(readability-identifier-naming)
-};
-
-typedef void (^FlutterKeyboardAnimationCallback)(NSTimeInterval);
-
 @interface FlutterViewController () <FlutterViewResponder>
 
 @property(nonatomic, readonly) BOOL isPresentingViewController;
 @property(nonatomic, readonly) BOOL isVoiceOverRunning;
 @property(nonatomic, strong) FlutterKeyboardManager* keyboardManager;
-@property(nonatomic, strong) FlutterKeyboardInsetManager* keyboardInsetManager;
+@property(nonatomic, strong) id<FlutterKeyboardInsetManagerProtocol> keyboardInsetManager;
 @property(nonatomic, readwrite) NSString* applicationLocale;
 
 /**
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/KeyboardInsetManager.swift b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/KeyboardInsetManager.swift
new file mode 100644
index 0000000..e6dc70a
--- /dev/null
+++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/KeyboardInsetManager.swift
@@ -0,0 +1,486 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import UIKit
+
+@objc public enum FlutterKeyboardMode: Int {
+  case hidden
+  case docked
+  case floating
+}
+
+public typealias FlutterKeyboardAnimationCallback = (_ targetTime: CFTimeInterval) -> Void
+
+/// @brief Coordinates the animation of the bottom viewport inset in response to system keyboard
+/// visibility changes.
+///
+/// This manager translates native iOS keyboard notifications into pixel insets for the engine. It
+/// ensures that the Flutter app UI correctly resizes or scrolls when the software keyboard appears
+/// or disappears.
+///
+/// We synchronize the app's layout transitions with the native keyboard animation curve by tracking
+/// a hidden internal view. When a keyboard notification is received, this view is animated using the
+/// native iOS duration and curve. The manager tracks this animation and calls the delegate's update
+/// methods on every vsync pulse until the transition completes.
+///
+/// iOS doesn't provide us with a frame-by-frame callback for keyboard transitions, but we need to
+/// animate our views smoothly to account for keyboard size/position changes. To ensure Flutter's
+/// layout animates in perfect sync with the system keyboard, we use a "hidden view" synchronization
+/// trick:
+///
+///  * When a keyboard notification (e.g., UIKeyboardWillShow) is received, the manager animates a
+///    hidden UIView's frame using the native iOS duration and curve.
+///  * A VSyncClient tracks the 'presentationLayer' of this hidden view on every vsync.
+///  * The intermediate positions are then translated into physical pixel insets and sent to the
+///    engine until the animation completes.
+///
+/// To prevent incorrect layout shifts, the manager filters notifications based on the following
+/// criteria:
+///
+/// * Local notifications:
+///   In multitasking environments, such as iPad Split View, notifications triggered by interactions
+///   with other applications are ignored.
+///
+/// * Keyboard attachment mode:
+///   The manager distinguishes between "docked" keyboards, which cover the bottom of the viewport,
+///   and "floating" or "undocked" keyboards. Floating keyboards do not typically require a viewport
+///   inset and are ignored to allow them to hover over the Flutter content without resizing the
+///   layout.
+///
+/// * View lifecycle:
+///   Notifications are ignored if the associated view is not loaded or if the delegate is not the
+///   active view controller.
+///
+/// @see [FlutterViewController], which owns this manager and acts as its delegate.
+@objc public protocol FlutterKeyboardInsetManagerDelegate: NSObjectProtocol {
+  @objc(updateViewportMetricsWithInset:)
+  func updateViewportMetrics(withInset inset: CGFloat)
+  func physicalViewInsetBottom() -> CGFloat
+  func uiTaskRunner() -> TaskRunner?
+  func view() -> UIView
+  func engine() -> FlutterEngine?
+  func flutterScreenIfViewLoaded() -> UIScreen?
+  func isPadInSlideOverOrStageManagerMode() -> Bool
+  @objc(convertViewRectToScreen:)
+  func convertViewRect(toScreen rect: CGRect) -> CGRect
+  func isViewLoaded() -> Bool
+}
+
+@objc public protocol FlutterKeyboardInsetManagerProtocol: NSObjectProtocol {
+  var delegate: FlutterKeyboardInsetManagerDelegate? { get set }
+  var targetViewInsetBottom: CGFloat { get set }
+  var isKeyboardInOrTransitioningFromBackground: Bool { get set }
+  var keyboardAnimationVSyncClient: VSyncClient? { get }
+
+  func handleKeyboardNotification(_ notification: Notification)
+  func hideKeyboardImmediately()
+  func invalidate()
+  func invalidateKeyboardAnimationVSyncClient()
+  func startKeyBoardAnimation(_ duration: TimeInterval)
+  var keyboardAnimationView: UIView? { get }
+  var keyboardSpringAnimation: SpringAnimation? { get }
+  func setUpKeyboardSpringAnimationIfNeeded(_ keyboardAnimation: CAAnimation?)
+  func shouldIgnoreKeyboardNotification(_ notification: Notification) -> Bool
+  func setUpKeyboardAnimationVsyncClient(_ animationCallback: FlutterKeyboardAnimationCallback?)
+  func calculateKeyboardAttachMode(_ notification: Notification) -> FlutterKeyboardMode
+  func ensureViewportMetricsIsCorrect()
+}
+
+@objc open class FlutterKeyboardInsetManager: NSObject, FlutterKeyboardInsetManagerProtocol {
+  @objc public weak var delegate: FlutterKeyboardInsetManagerDelegate?
+  @objc public var targetViewInsetBottom: CGFloat = 0
+
+  private var originalViewInsetBottom: CGFloat = 0
+  @objc public var keyboardAnimationVSyncClient: VSyncClient?
+  @objc public var keyboardAnimationIsShowing: Bool = false
+  private var keyboardAnimationStartTime: CFTimeInterval = 0
+  @objc public var keyboardAnimationView: UIView?
+  @objc public var keyboardSpringAnimation: SpringAnimation?
+  @objc public var isKeyboardInOrTransitioningFromBackground: Bool = false
+
+  @objc public init(delegate: FlutterKeyboardInsetManagerDelegate) {
+    self.delegate = delegate
+    super.init()
+  }
+
+  @objc public func handleKeyboardNotification(_ notification: Notification) {
+    // See https://flutter.dev/go/ios-keyboard-calculating-inset for more details on why
+    // notifications are used and how things are calculated.
+    guard delegate != nil else { return }
+    if shouldIgnoreKeyboardNotification(notification) {
+      return
+    }
+
+    let info = notification.userInfo
+    let beginKeyboardFrame =
+      (info?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue ?? .zero
+    let keyboardFrame =
+      (info?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? .zero
+    let keyboardMode = calculateKeyboardAttachMode(notification)
+    let calculatedInset = calculateKeyboardInset(keyboardFrame, keyboardMode: keyboardMode)
+    let duration =
+      info?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double ?? 0
+
+    // If the software keyboard is displayed before displaying the PasswordManager prompt,
+    // UIKeyboardWillHideNotification will occur immediately after UIKeyboardWillShowNotification.
+    // The duration of the animation will be 0.0, and the calculated inset will be 0.0. In this
+    // case, it is necessary to cancel the animation and hide the keyboard immediately.
+    // https://github.com/flutter/flutter/pull/164884
+    if keyboardMode == .hidden && calculatedInset == 0.0 && duration == 0.0 {
+      hideKeyboardImmediately()
+      return
+    }
+
+    // Avoid double triggering startKeyBoardAnimation.
+    if targetViewInsetBottom == calculatedInset {
+      return
+    }
+    targetViewInsetBottom = calculatedInset
+
+    // Flag for simultaneous compounding animation calls.
+    // This captures animation calls made while the keyboard animation is currently animating. If
+    // the new animation is in the same direction as the current animation, this flag lets the
+    // current animation continue with an updated targetViewInsetBottom instead of starting a new
+    // keyboard animation. This allows for smoother keyboard animation interpolation.
+    let keyboardWillShow = beginKeyboardFrame.origin.y > keyboardFrame.origin.y
+    let keyboardAnimationIsCompounding =
+      keyboardAnimationIsShowing == keyboardWillShow && keyboardAnimationVSyncClient != nil
+
+    // Mark keyboard as showing or hiding.
+    keyboardAnimationIsShowing = keyboardWillShow
+
+    if !keyboardAnimationIsCompounding {
+      startKeyBoardAnimation(duration)
+    } else if let keyboardSpringAnimation = keyboardSpringAnimation {
+      keyboardSpringAnimation.toValue = targetViewInsetBottom
+    }
+  }
+
+  @objc public func shouldIgnoreKeyboardNotification(_ notification: Notification) -> Bool {
+    // Don't ignore UIKeyboardWillHideNotification notifications.
+    // Even if the notification is triggered in the background or by a different app/view
+    // controller, we want to always handle this notification to avoid inaccurate inset when in a
+    // multitasking mode or when switching between apps.
+    if notification.name == UIResponder.keyboardWillHideNotification {
+      return false
+    }
+
+    let info = notification.userInfo
+    let keyboardFrame =
+      (info?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? .zero
+
+    // Ignore notification when keyboard's dimensions and position are all zeroes for
+    // UIKeyboardWillChangeFrameNotification. This happens when keyboard is dragged. Do not ignore
+    // if the notification is UIKeyboardWillShowNotification, as CGRectZero for that notification
+    // only occurs when Minimized/Expanded Shortcuts Bar is dropped after dragging, which we later
+    // use to categorize it as floating.
+    if notification.name == UIResponder.keyboardWillChangeFrameNotification
+      && keyboardFrame == .zero
+    {
+      return true
+    }
+
+    // When keyboard's height or width is set to 0, don't ignore. This does not happen often but can
+    // happen sometimes when switching between multitasking modes.
+    if keyboardFrame.isEmpty {
+      return false
+    }
+
+    // Ignore keyboard notifications related to other apps or view controllers.
+    if isKeyboardNotificationForDifferentView(notification) {
+      return true
+    }
+    return false
+  }
+
+  @objc public func isKeyboardNotificationForDifferentView(_ notification: Notification) -> Bool {
+    let info = notification.userInfo
+    // Keyboard notifications related to other apps (e.g. in split view mode on iPad).
+    // If the UIKeyboardIsLocalUserInfoKey key doesn't exist (this should not happen after iOS 8),
+    // proceed as if it was local so that the notification is not ignored.
+    if let isLocal = info?[UIResponder.keyboardIsLocalUserInfoKey] as? Bool, !isLocal {
+      return true
+    }
+    guard let delegate else { return false }
+    return delegate.engine()?.viewController !== (delegate as AnyObject)
+  }
+
+  @objc public func calculateKeyboardAttachMode(_ notification: Notification) -> FlutterKeyboardMode
+  {
+    // There are multiple types of keyboard: docked, undocked, split, split docked,
+    // floating, expanded shortcuts bar, minimized shortcuts bar.
+    //
+    // This function will categorize the keyboard as one of the following modes: docked, floating,
+    // or hidden.
+    //
+    // Docked mode includes docked, split docked, expanded shortcuts bar (when opening via click),
+    // and minimized shortcuts bar (when opened via click).
+    //
+    // Floating includes undocked, split, floating, expanded shortcuts bar (when dragged and
+    // dropped), and minimized shortcuts bar (when dragged and dropped).
+    guard let delegate else { return .hidden }
+
+    if notification.name == UIResponder.keyboardWillHideNotification {
+      return .hidden
+    }
+
+    let info = notification.userInfo
+    let keyboardFrame =
+      (info?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue ?? .zero
+
+    // If keyboard's dimensions and position are all zeroes, that means it's a Minimized/Expanded
+    // Shortcuts Bar that has been dropped after dragging, which we categorize as floating.
+    if keyboardFrame == .zero {
+      return .floating
+    }
+
+    // If keyboard's width or height are 0, it's hidden.
+    if keyboardFrame.isEmpty {
+      return .hidden
+    }
+
+    guard let screen = delegate.flutterScreenIfViewLoaded() else {
+      return .hidden
+    }
+
+    let screenRect = screen.bounds
+    var adjustedKeyboardFrame = keyboardFrame
+    adjustedKeyboardFrame.origin.y += calculateMultitaskingAdjustment(
+      screenRect, keyboardFrame: keyboardFrame)
+
+    // If the keyboard is partially or fully showing within the screen, it's either docked or
+    // floating. Sometimes with custom keyboard extensions, the keyboard's position may be off by a
+    // small decimal amount (which is why CGRectIntersectRect can't be used). Round to compare.
+    let intersection = adjustedKeyboardFrame.intersection(screenRect)
+    let intersectionHeight = intersection.height
+    let intersectionWidth = intersection.width
+
+    if round(intersectionHeight) > 0 && intersectionWidth > 0 {
+      let adjustedKeyboardBottom = adjustedKeyboardFrame.maxY
+      let screenHeight = screenRect.height
+
+      if round(adjustedKeyboardBottom) < screenHeight {
+        return .floating
+      }
+      return .docked
+    }
+    return .hidden
+  }
+
+  @objc public func calculateMultitaskingAdjustment(_ screenRect: CGRect, keyboardFrame: CGRect)
+    -> CGFloat
+  {
+    guard let delegate else { return 0 }
+    if !delegate.isViewLoaded() {
+      return 0
+    }
+
+    // In Slide Over mode, the keyboard's frame does not include the space below the app, even
+    // though the keyboard may be at the bottom of the screen. To handle, shift the Y origin by the
+    // amount of space below the app.
+    if delegate.isPadInSlideOverOrStageManagerMode() {
+      let screenHeight = screenRect.height
+      let keyboardBottom = keyboardFrame.maxY
+
+      // Stage Manager mode will also meet the above parameters, but it does not handle the keyboard
+      // positioning the same way, so skip if keyboard is at bottom of page.
+      if screenHeight == keyboardBottom {
+        return 0
+      }
+
+      let offset = screenHeight - delegate.convertViewRect(toScreen: delegate.view().bounds).maxY
+      if offset > 0 {
+        return offset
+      }
+    }
+    return 0
+  }
+
+  @objc public func calculateKeyboardInset(
+    _ keyboardFrame: CGRect, keyboardMode: FlutterKeyboardMode
+  ) -> CGFloat {
+    // Only docked keyboards will have an inset.
+    if keyboardMode != .docked {
+      return 0
+    }
+
+    guard let delegate, delegate.isViewLoaded() else { return 0 }
+    let viewRectRelativeToScreen = delegate.convertViewRect(toScreen: delegate.view().bounds)
+    let intersection = keyboardFrame.intersection(viewRectRelativeToScreen)
+    let portionOfKeyboardInView = intersection.height
+
+    // The keyboard is treated as an inset since we want to effectively reduce the window size by
+    // the keyboard height. The Dart side will compute a value accounting for the keyboard-consuming
+    // bottom padding.
+    let scale = delegate.flutterScreenIfViewLoaded()?.scale ?? 0.0
+    return portionOfKeyboardInView * scale
+  }
+
+  @objc public func startKeyBoardAnimation(_ duration: TimeInterval) {
+    guard let delegate, delegate.isViewLoaded() else { return }
+    let view = delegate.view()
+
+    // When this method is called for the first time, initialize the keyboardAnimationView to get
+    // animation interpolation during animation.
+    if keyboardAnimationView == nil {
+      let animView = UIView()
+      animView.isHidden = true
+      keyboardAnimationView = animView
+    }
+
+    if let keyboardAnimationView = keyboardAnimationView,
+      keyboardAnimationView.superview != view
+    {
+      view.addSubview(keyboardAnimationView)
+    }
+
+    // Remove running animation when start another animation.
+    keyboardAnimationView?.layer.removeAllAnimations()
+
+    // If current physical_view_inset_bottom == targetViewInsetBottom, do nothing.
+    let currentInset = delegate.physicalViewInsetBottom()
+    keyboardAnimationView?.frame = CGRect(x: 0, y: currentInset, width: 0, height: 0)
+
+    // Set animation begin value and DisplayLink tracking values.
+    keyboardAnimationStartTime = CACurrentMediaTime()
+    originalViewInsetBottom = currentInset
+
+    // Invalidate old vsync client if old animation is not completed.
+    invalidateKeyboardAnimationVSyncClient()
+
+    setUpKeyboardAnimationVsyncClient { [weak self] targetTime in
+      self?.handleKeyboardAnimationCallback(withTargetTime: targetTime)
+    }
+
+    let currentVsyncClient = keyboardAnimationVSyncClient
+
+    UIView.animate(
+      withDuration: duration,
+      animations: { [weak self] in
+        guard let strongSelf = self else { return }
+        strongSelf.keyboardAnimationView?.frame = CGRect(
+          x: 0, y: strongSelf.targetViewInsetBottom, width: 0, height: 0)
+        strongSelf.keyboardAnimationView?.layoutIfNeeded()
+
+        let keyboardAnimation = strongSelf.keyboardAnimationView?.layer.animation(
+          forKey: "position")
+        strongSelf.setUpKeyboardSpringAnimationIfNeeded(keyboardAnimation)
+      },
+      completion: { [weak self] finished in
+        guard let strongSelf = self else { return }
+        // Indicates the vsync client captured by this block is the original one, which also
+        // indicates the animation has not been interrupted from its beginning. Moreover,
+        // indicates the animation is over and there is no more to execute.
+        if strongSelf.keyboardAnimationVSyncClient === currentVsyncClient {
+          strongSelf.invalidateKeyboardAnimationVSyncClient()
+          strongSelf.removeKeyboardAnimationView()
+          strongSelf.ensureViewportMetricsIsCorrect()
+        }
+      })
+  }
+
+  @objc public func handleKeyboardAnimationCallback(withTargetTime targetTime: CFTimeInterval) {
+    guard let delegate else { return }
+    if !delegate.isViewLoaded() { return }
+
+    // Bail out if the view for tracking keyboard animation is nil.
+    guard let keyboardAnimationView = keyboardAnimationView else { return }
+
+    // If keyboardAnimationVSyncClient is nil, the animation ends and we should bail out.
+    if keyboardAnimationVSyncClient == nil { return }
+
+    if keyboardAnimationView.superview != delegate.view() {
+      // Ensure the keyboardAnimationView is in the view hierarchy when the animation running.
+      delegate.view().addSubview(keyboardAnimationView)
+    }
+
+    var currentInset: CGFloat = 0
+    if let keyboardSpringAnimation = keyboardSpringAnimation {
+      let timeElapsed = targetTime - keyboardAnimationStartTime
+      currentInset = CGFloat(keyboardSpringAnimation.curveFunction(timeElapsed))
+    } else if let presentationLayer = keyboardAnimationView.layer.presentation() {
+      currentInset = presentationLayer.frame.origin.y
+    }
+
+    delegate.updateViewportMetrics(withInset: currentInset)
+  }
+
+  @objc public func hideKeyboardImmediately() {
+    invalidateKeyboardAnimationVSyncClient()
+    if let keyboardAnimationView = keyboardAnimationView {
+      keyboardAnimationView.layer.removeAllAnimations()
+      removeKeyboardAnimationView()
+      self.keyboardAnimationView = nil
+    }
+    keyboardSpringAnimation = nil
+    targetViewInsetBottom = 0
+    ensureViewportMetricsIsCorrect()
+  }
+
+  @objc public func invalidate() {
+    invalidateKeyboardAnimationVSyncClient()
+    removeKeyboardAnimationView()
+  }
+
+  @objc public func invalidateKeyboardAnimationVSyncClient() {
+    keyboardAnimationVSyncClient?.invalidate()
+    keyboardAnimationVSyncClient = nil
+  }
+
+  @objc public func removeKeyboardAnimationView() {
+    if keyboardAnimationView?.superview != nil {
+      keyboardAnimationView?.removeFromSuperview()
+    }
+  }
+
+  @objc public func setUpKeyboardSpringAnimationIfNeeded(_ keyboardAnimation: CAAnimation?) {
+    // If keyboard animation is nil or not a spring animation, fallback to DisplayLink tracking.
+    guard let keyboardCASpringAnimation = keyboardAnimation as? CASpringAnimation else {
+      keyboardSpringAnimation = nil
+      return
+    }
+
+    // Set up keyboard spring animation details for spring curve animation calculation.
+    keyboardSpringAnimation = SpringAnimation(
+      stiffness: keyboardCASpringAnimation.stiffness,
+      damping: keyboardCASpringAnimation.damping,
+      mass: keyboardCASpringAnimation.mass,
+      initialVelocity: keyboardCASpringAnimation.initialVelocity,
+      fromValue: originalViewInsetBottom,
+      toValue: targetViewInsetBottom
+    )
+  }
+
+  @objc public func setUpKeyboardAnimationVsyncClient(
+    _ animationCallback: FlutterKeyboardAnimationCallback?
+  ) {
+    guard let animationCallback = animationCallback else { return }
+    assert(
+      keyboardAnimationVSyncClient == nil,
+      "keyboardAnimationVSyncClient must be nil when setting up.")
+
+    guard let delegate, let taskRunner = delegate.uiTaskRunner() else { return }
+
+    // Make sure the new viewport metrics get sent after the begin frame event has processed.
+    let vsyncCallback: (CFTimeInterval, CFTimeInterval) -> Void = { startTime, targetTime in
+      let frameInterval = targetTime - startTime
+      let projectedTargetTime = targetTime + frameInterval
+      DispatchQueue.main.async {
+        animationCallback(projectedTargetTime)
+      }
+    }
+
+    keyboardAnimationVSyncClient = VSyncClient(
+      taskRunner: taskRunner,
+      isVariableRefreshRateEnabled: DisplayLinkManager.maxRefreshRateEnabledOnIPhone,
+      maxRefreshRate: DisplayLinkManager.displayRefreshRate,
+      callback: vsyncCallback)
+    keyboardAnimationVSyncClient?.allowPauseAfterVsync = false
+    keyboardAnimationVSyncClient?.await()
+  }
+
+  @objc public func ensureViewportMetricsIsCorrect() {
+    delegate?.updateViewportMetrics(withInset: targetViewInsetBottom)
+  }
+}
diff --git a/engine/src/flutter/testing/symbols/verify_exported.dart b/engine/src/flutter/testing/symbols/verify_exported.dart
index 78aa4f9..1546542 100644
--- a/engine/src/flutter/testing/symbols/verify_exported.dart
+++ b/engine/src/flutter/testing/symbols/verify_exported.dart
@@ -269,7 +269,10 @@
     return switch (type) {
       '(__DATA,__objc_data)' || '(__DATA,__data)' =>
         (name.startsWith(r'_OBJC_METACLASS_$_Flutter') ||
-            name.startsWith(r'_OBJC_CLASS_$_Flutter')),
+            name.startsWith(r'_OBJC_CLASS_$_Flutter') ||
+            ((name.startsWith(r'_OBJC_METACLASS_$__TtC') ||
+                    name.startsWith(r'_OBJC_CLASS_$__TtC')) &&
+                name.contains('InternalFlutterSwift'))),
       _ => false,
     };
   }
