diff --git a/packages/path_provider/path_provider_ios/CHANGELOG.md b/packages/path_provider/path_provider_ios/CHANGELOG.md
index 1940f5c..8569c1b 100644
--- a/packages/path_provider/path_provider_ios/CHANGELOG.md
+++ b/packages/path_provider/path_provider_ios/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.0.10
+
+* Switches backend to pigeon.
+
 ## 2.0.9
 
 * Fixes library_private_types_in_public_api, sort_child_properties_last and use_key_in_widget_constructors
diff --git a/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj b/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj
index fec246b..601985b 100644
--- a/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 50;
+	objectVersion = 46;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -512,6 +512,7 @@
 					"$(PROJECT_DIR)/Flutter",
 				);
 				INFOPLIST_FILE = Runner/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
@@ -533,6 +534,7 @@
 					"$(PROJECT_DIR)/Flutter",
 				);
 				INFOPLIST_FILE = Runner/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
 				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
diff --git a/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m b/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m
index ac6a1be..82b8df5 100644
--- a/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m
+++ b/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m
@@ -3,47 +3,41 @@
 // found in the LICENSE file.
 
 #import "FLTPathProviderPlugin.h"
+#import "messages.g.h"
 
-NSString *GetDirectoryOfType(NSSearchPathDirectory dir) {
+static NSString *GetDirectoryOfType(NSSearchPathDirectory dir) {
   NSArray *paths = NSSearchPathForDirectoriesInDomains(dir, NSUserDomainMask, YES);
   return paths.firstObject;
 }
 
+@interface FLTPathProviderPlugin () <FLTPathProviderApi>
+@end
+
 @implementation FLTPathProviderPlugin
 
 + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
-  FlutterMethodChannel *channel =
-      [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/path_provider_ios"
-                                  binaryMessenger:registrar.messenger];
-  [channel setMethodCallHandler:^(FlutterMethodCall *call, FlutterResult result) {
-    if ([@"getTemporaryDirectory" isEqualToString:call.method]) {
-      result([self getTemporaryDirectory]);
-    } else if ([@"getApplicationDocumentsDirectory" isEqualToString:call.method]) {
-      result([self getApplicationDocumentsDirectory]);
-    } else if ([@"getApplicationSupportDirectory" isEqualToString:call.method]) {
-      result([self getApplicationSupportDirectory]);
-    } else if ([@"getLibraryDirectory" isEqualToString:call.method]) {
-      result([self getLibraryDirectory]);
-    } else {
-      result(FlutterMethodNotImplemented);
-    }
-  }];
+  FLTPathProviderPlugin *plugin = [[FLTPathProviderPlugin alloc] init];
+  FLTPathProviderApiSetup(registrar.messenger, plugin);
 }
 
-+ (NSString *)getTemporaryDirectory {
-  return GetDirectoryOfType(NSCachesDirectory);
-}
-
-+ (NSString *)getApplicationDocumentsDirectory {
+- (nullable NSString *)getApplicationDocumentsPathWithError:
+    (FlutterError *_Nullable __autoreleasing *_Nonnull)error {
   return GetDirectoryOfType(NSDocumentDirectory);
 }
 
-+ (NSString *)getApplicationSupportDirectory {
+- (nullable NSString *)getApplicationSupportPathWithError:
+    (FlutterError *_Nullable __autoreleasing *_Nonnull)error {
   return GetDirectoryOfType(NSApplicationSupportDirectory);
 }
 
-+ (NSString *)getLibraryDirectory {
+- (nullable NSString *)getLibraryPathWithError:
+    (FlutterError *_Nullable __autoreleasing *_Nonnull)error {
   return GetDirectoryOfType(NSLibraryDirectory);
 }
 
+- (nullable NSString *)getTemporaryPathWithError:
+    (FlutterError *_Nullable __autoreleasing *_Nonnull)error {
+  return GetDirectoryOfType(NSCachesDirectory);
+}
+
 @end
diff --git a/packages/path_provider/path_provider_ios/ios/Classes/messages.g.h b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.h
new file mode 100644
index 0000000..b6c1d4d
--- /dev/null
+++ b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.h
@@ -0,0 +1,28 @@
+// 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.
+// Autogenerated from Pigeon (v3.1.5), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+#import <Foundation/Foundation.h>
+@protocol FlutterBinaryMessenger;
+@protocol FlutterMessageCodec;
+@class FlutterError;
+@class FlutterStandardTypedData;
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// The codec used by FLTPathProviderApi.
+NSObject<FlutterMessageCodec> *FLTPathProviderApiGetCodec(void);
+
+@protocol FLTPathProviderApi
+- (nullable NSString *)getTemporaryPathWithError:(FlutterError *_Nullable *_Nonnull)error;
+- (nullable NSString *)getApplicationSupportPathWithError:(FlutterError *_Nullable *_Nonnull)error;
+- (nullable NSString *)getLibraryPathWithError:(FlutterError *_Nullable *_Nonnull)error;
+- (nullable NSString *)getApplicationDocumentsPathWithError:
+    (FlutterError *_Nullable *_Nonnull)error;
+@end
+
+extern void FLTPathProviderApiSetup(id<FlutterBinaryMessenger> binaryMessenger,
+                                    NSObject<FLTPathProviderApi> *_Nullable api);
+
+NS_ASSUME_NONNULL_END
diff --git a/packages/path_provider/path_provider_ios/ios/Classes/messages.g.m b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.m
new file mode 100644
index 0000000..2589df1
--- /dev/null
+++ b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.m
@@ -0,0 +1,138 @@
+// 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.
+// Autogenerated from Pigeon (v3.1.5), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+#import "messages.g.h"
+#import <Flutter/Flutter.h>
+
+#if !__has_feature(objc_arc)
+#error File requires ARC to be enabled.
+#endif
+
+static NSDictionary<NSString *, id> *wrapResult(id result, FlutterError *error) {
+  NSDictionary *errorDict = (NSDictionary *)[NSNull null];
+  if (error) {
+    errorDict = @{
+      @"code" : (error.code ?: [NSNull null]),
+      @"message" : (error.message ?: [NSNull null]),
+      @"details" : (error.details ?: [NSNull null]),
+    };
+  }
+  return @{
+    @"result" : (result ?: [NSNull null]),
+    @"error" : errorDict,
+  };
+}
+
+@interface FLTPathProviderApiCodecReader : FlutterStandardReader
+@end
+@implementation FLTPathProviderApiCodecReader
+@end
+
+@interface FLTPathProviderApiCodecWriter : FlutterStandardWriter
+@end
+@implementation FLTPathProviderApiCodecWriter
+@end
+
+@interface FLTPathProviderApiCodecReaderWriter : FlutterStandardReaderWriter
+@end
+@implementation FLTPathProviderApiCodecReaderWriter
+- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data {
+  return [[FLTPathProviderApiCodecWriter alloc] initWithData:data];
+}
+- (FlutterStandardReader *)readerWithData:(NSData *)data {
+  return [[FLTPathProviderApiCodecReader alloc] initWithData:data];
+}
+@end
+
+NSObject<FlutterMessageCodec> *FLTPathProviderApiGetCodec() {
+  static dispatch_once_t sPred = 0;
+  static FlutterStandardMessageCodec *sSharedObject = nil;
+  dispatch_once(&sPred, ^{
+    FLTPathProviderApiCodecReaderWriter *readerWriter =
+        [[FLTPathProviderApiCodecReaderWriter alloc] init];
+    sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter];
+  });
+  return sSharedObject;
+}
+
+void FLTPathProviderApiSetup(id<FlutterBinaryMessenger> binaryMessenger,
+                             NSObject<FLTPathProviderApi> *api) {
+  {
+    FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc]
+           initWithName:@"dev.flutter.pigeon.PathProviderApi.getTemporaryPath"
+        binaryMessenger:binaryMessenger
+                  codec:FLTPathProviderApiGetCodec()];
+    if (api) {
+      NSCAssert(
+          [api respondsToSelector:@selector(getTemporaryPathWithError:)],
+          @"FLTPathProviderApi api (%@) doesn't respond to @selector(getTemporaryPathWithError:)",
+          api);
+      [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
+        FlutterError *error;
+        NSString *output = [api getTemporaryPathWithError:&error];
+        callback(wrapResult(output, error));
+      }];
+    } else {
+      [channel setMessageHandler:nil];
+    }
+  }
+  {
+    FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc]
+           initWithName:@"dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath"
+        binaryMessenger:binaryMessenger
+                  codec:FLTPathProviderApiGetCodec()];
+    if (api) {
+      NSCAssert([api respondsToSelector:@selector(getApplicationSupportPathWithError:)],
+                @"FLTPathProviderApi api (%@) doesn't respond to "
+                @"@selector(getApplicationSupportPathWithError:)",
+                api);
+      [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
+        FlutterError *error;
+        NSString *output = [api getApplicationSupportPathWithError:&error];
+        callback(wrapResult(output, error));
+      }];
+    } else {
+      [channel setMessageHandler:nil];
+    }
+  }
+  {
+    FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc]
+           initWithName:@"dev.flutter.pigeon.PathProviderApi.getLibraryPath"
+        binaryMessenger:binaryMessenger
+                  codec:FLTPathProviderApiGetCodec()];
+    if (api) {
+      NSCAssert(
+          [api respondsToSelector:@selector(getLibraryPathWithError:)],
+          @"FLTPathProviderApi api (%@) doesn't respond to @selector(getLibraryPathWithError:)",
+          api);
+      [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
+        FlutterError *error;
+        NSString *output = [api getLibraryPathWithError:&error];
+        callback(wrapResult(output, error));
+      }];
+    } else {
+      [channel setMessageHandler:nil];
+    }
+  }
+  {
+    FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc]
+           initWithName:@"dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath"
+        binaryMessenger:binaryMessenger
+                  codec:FLTPathProviderApiGetCodec()];
+    if (api) {
+      NSCAssert([api respondsToSelector:@selector(getApplicationDocumentsPathWithError:)],
+                @"FLTPathProviderApi api (%@) doesn't respond to "
+                @"@selector(getApplicationDocumentsPathWithError:)",
+                api);
+      [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
+        FlutterError *error;
+        NSString *output = [api getApplicationDocumentsPathWithError:&error];
+        callback(wrapResult(output, error));
+      }];
+    } else {
+      [channel setMessageHandler:nil];
+    }
+  }
+}
diff --git a/packages/path_provider/path_provider_ios/lib/messages.g.dart b/packages/path_provider/path_provider_ios/lib/messages.g.dart
new file mode 100644
index 0000000..1914119
--- /dev/null
+++ b/packages/path_provider/path_provider_ios/lib/messages.g.dart
@@ -0,0 +1,124 @@
+// 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.
+// Autogenerated from Pigeon (v3.1.5), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name
+// @dart = 2.12
+import 'dart:async';
+import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List;
+
+import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer;
+import 'package:flutter/services.dart';
+
+class _PathProviderApiCodec extends StandardMessageCodec {
+  const _PathProviderApiCodec();
+}
+
+class PathProviderApi {
+  /// Constructor for [PathProviderApi].  The [binaryMessenger] named argument is
+  /// available for dependency injection.  If it is left null, the default
+  /// BinaryMessenger will be used which routes to the host platform.
+  PathProviderApi({BinaryMessenger? binaryMessenger})
+      : _binaryMessenger = binaryMessenger;
+
+  final BinaryMessenger? _binaryMessenger;
+
+  static const MessageCodec<Object?> codec = _PathProviderApiCodec();
+
+  Future<String?> getTemporaryPath() async {
+    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+        'dev.flutter.pigeon.PathProviderApi.getTemporaryPath', codec,
+        binaryMessenger: _binaryMessenger);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(null) as Map<Object?, Object?>?;
+    if (replyMap == null) {
+      throw PlatformException(
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+      );
+    } else if (replyMap['error'] != null) {
+      final Map<Object?, Object?> error =
+          (replyMap['error'] as Map<Object?, Object?>?)!;
+      throw PlatformException(
+        code: (error['code'] as String?)!,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
+    } else {
+      return (replyMap['result'] as String?);
+    }
+  }
+
+  Future<String?> getApplicationSupportPath() async {
+    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+        'dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath', codec,
+        binaryMessenger: _binaryMessenger);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(null) as Map<Object?, Object?>?;
+    if (replyMap == null) {
+      throw PlatformException(
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+      );
+    } else if (replyMap['error'] != null) {
+      final Map<Object?, Object?> error =
+          (replyMap['error'] as Map<Object?, Object?>?)!;
+      throw PlatformException(
+        code: (error['code'] as String?)!,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
+    } else {
+      return (replyMap['result'] as String?);
+    }
+  }
+
+  Future<String?> getLibraryPath() async {
+    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+        'dev.flutter.pigeon.PathProviderApi.getLibraryPath', codec,
+        binaryMessenger: _binaryMessenger);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(null) as Map<Object?, Object?>?;
+    if (replyMap == null) {
+      throw PlatformException(
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+      );
+    } else if (replyMap['error'] != null) {
+      final Map<Object?, Object?> error =
+          (replyMap['error'] as Map<Object?, Object?>?)!;
+      throw PlatformException(
+        code: (error['code'] as String?)!,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
+    } else {
+      return (replyMap['result'] as String?);
+    }
+  }
+
+  Future<String?> getApplicationDocumentsPath() async {
+    final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+        'dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath', codec,
+        binaryMessenger: _binaryMessenger);
+    final Map<Object?, Object?>? replyMap =
+        await channel.send(null) as Map<Object?, Object?>?;
+    if (replyMap == null) {
+      throw PlatformException(
+        code: 'channel-error',
+        message: 'Unable to establish connection on channel.',
+      );
+    } else if (replyMap['error'] != null) {
+      final Map<Object?, Object?> error =
+          (replyMap['error'] as Map<Object?, Object?>?)!;
+      throw PlatformException(
+        code: (error['code'] as String?)!,
+        message: error['message'] as String?,
+        details: error['details'],
+      );
+    } else {
+      return (replyMap['result'] as String?);
+    }
+  }
+}
diff --git a/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart b/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart
index 88becf2..05be053 100644
--- a/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart
+++ b/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart
@@ -4,16 +4,13 @@
 
 import 'dart:io';
 
-import 'package:flutter/foundation.dart' show visibleForTesting;
-import 'package:flutter/services.dart';
 import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
+import 'messages.g.dart';
 
 /// The iOS implementation of [PathProviderPlatform].
 class PathProviderIOS extends PathProviderPlatform {
   /// The method channel used to interact with the native platform.
-  @visibleForTesting
-  MethodChannel methodChannel =
-      const MethodChannel('plugins.flutter.io/path_provider_ios');
+  final PathProviderApi _pathProvider = PathProviderApi();
 
   /// Registers this class as the default instance of [PathProviderPlatform]
   static void registerWith() {
@@ -22,13 +19,12 @@
 
   @override
   Future<String?> getTemporaryPath() async {
-    return methodChannel.invokeMethod<String>('getTemporaryDirectory');
+    return _pathProvider.getTemporaryPath();
   }
 
   @override
   Future<String?> getApplicationSupportPath() async {
-    final String? path = await methodChannel
-        .invokeMethod<String>('getApplicationSupportDirectory');
+    final String? path = await _pathProvider.getApplicationSupportPath();
     if (path != null) {
       // Ensure the directory exists before returning it, for consistency with
       // other platforms.
@@ -39,13 +35,12 @@
 
   @override
   Future<String?> getLibraryPath() async {
-    return methodChannel.invokeMethod<String>('getLibraryDirectory');
+    return _pathProvider.getLibraryPath();
   }
 
   @override
   Future<String?> getApplicationDocumentsPath() async {
-    return methodChannel
-        .invokeMethod<String>('getApplicationDocumentsDirectory');
+    return _pathProvider.getApplicationDocumentsPath();
   }
 
   @override
diff --git a/packages/path_provider/path_provider_ios/pigeons/copyright.txt b/packages/path_provider/path_provider_ios/pigeons/copyright.txt
new file mode 100644
index 0000000..1236b63
--- /dev/null
+++ b/packages/path_provider/path_provider_ios/pigeons/copyright.txt
@@ -0,0 +1,3 @@
+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.
diff --git a/packages/path_provider/path_provider_ios/pigeons/messages.dart b/packages/path_provider/path_provider_ios/pigeons/messages.dart
new file mode 100644
index 0000000..2ed7991
--- /dev/null
+++ b/packages/path_provider/path_provider_ios/pigeons/messages.dart
@@ -0,0 +1,21 @@
+// 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 'package:pigeon/pigeon.dart';
+
+@ConfigurePigeon(PigeonOptions(
+  input: 'pigeons/messages.dart',
+  objcOptions: ObjcOptions(prefix: 'FLT'),
+  objcHeaderOut: 'ios/Classes/messages.g.h',
+  objcSourceOut: 'ios/Classes/messages.g.m',
+  dartOut: 'lib/messages.g.dart',
+  dartTestOut: 'test/messages_test.g.dart',
+  copyrightHeader: 'pigeons/copyright.txt',
+))
+@HostApi(dartHostTestHandler: 'TestPathProviderApi')
+abstract class PathProviderApi {
+  String? getTemporaryPath();
+  String? getApplicationSupportPath();
+  String? getLibraryPath();
+  String? getApplicationDocumentsPath();
+}
diff --git a/packages/path_provider/path_provider_ios/pubspec.yaml b/packages/path_provider/path_provider_ios/pubspec.yaml
index d6c7de1..16d2f2e 100644
--- a/packages/path_provider/path_provider_ios/pubspec.yaml
+++ b/packages/path_provider/path_provider_ios/pubspec.yaml
@@ -2,11 +2,11 @@
 description: iOS implementation of the path_provider plugin.
 repository: https://github.com/flutter/plugins/tree/main/packages/path_provider/path_provider_ios
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22
-version: 2.0.9
+version: 2.0.10
 
 environment:
   sdk: ">=2.14.0 <3.0.0"
-  flutter: ">=2.8.0"
+  flutter: ">=3.0.0"
 
 flutter:
   plugin:
@@ -29,5 +29,6 @@
   integration_test:
     sdk: flutter
   path: ^1.8.0
+  pigeon: ^3.1.5
   plugin_platform_interface: ^2.0.0
   test: ^1.16.0
diff --git a/packages/path_provider/path_provider_ios/test/messages_test.g.dart b/packages/path_provider/path_provider_ios/test/messages_test.g.dart
new file mode 100644
index 0000000..d1c9ff8
--- /dev/null
+++ b/packages/path_provider/path_provider_ios/test/messages_test.g.dart
@@ -0,0 +1,88 @@
+// 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.
+// Autogenerated from Pigeon (v3.1.5), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis
+// ignore_for_file: avoid_relative_lib_imports
+// @dart = 2.12
+import 'dart:async';
+import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List;
+import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer;
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import '../lib/messages.g.dart';
+
+class _TestPathProviderApiCodec extends StandardMessageCodec {
+  const _TestPathProviderApiCodec();
+}
+
+abstract class TestPathProviderApi {
+  static const MessageCodec<Object?> codec = _TestPathProviderApiCodec();
+
+  String? getTemporaryPath();
+  String? getApplicationSupportPath();
+  String? getLibraryPath();
+  String? getApplicationDocumentsPath();
+  static void setup(TestPathProviderApi? api,
+      {BinaryMessenger? binaryMessenger}) {
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PathProviderApi.getTemporaryPath', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          // ignore message
+          final String? output = api.getTemporaryPath();
+          return <Object?, Object?>{'result': output};
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          // ignore message
+          final String? output = api.getApplicationSupportPath();
+          return <Object?, Object?>{'result': output};
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PathProviderApi.getLibraryPath', codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          // ignore message
+          final String? output = api.getLibraryPath();
+          return <Object?, Object?>{'result': output};
+        });
+      }
+    }
+    {
+      final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
+          'dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath',
+          codec,
+          binaryMessenger: binaryMessenger);
+      if (api == null) {
+        channel.setMockMessageHandler(null);
+      } else {
+        channel.setMockMessageHandler((Object? message) async {
+          // ignore message
+          final String? output = api.getApplicationDocumentsPath();
+          return <Object?, Object?>{'result': output};
+        });
+      }
+    }
+  }
+}
diff --git a/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart b/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart
index 40f81c5..16a7cd8 100644
--- a/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart
+++ b/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart
@@ -4,17 +4,35 @@
 
 import 'dart:io';
 
-import 'package:flutter/services.dart';
 import 'package:flutter_test/flutter_test.dart';
 import 'package:path/path.dart' as p;
 import 'package:path_provider_ios/path_provider_ios.dart';
+import 'messages_test.g.dart';
+
+class _Api implements TestPathProviderApi {
+  String? applicationDocumentsPath;
+  String? applicationSupportPath;
+  String? libraryPath;
+  String? temporaryPath;
+
+  @override
+  String? getApplicationDocumentsPath() => applicationDocumentsPath;
+
+  @override
+  String? getApplicationSupportPath() => applicationSupportPath;
+
+  @override
+  String? getLibraryPath() => libraryPath;
+
+  @override
+  String? getTemporaryPath() => temporaryPath;
+}
 
 void main() {
   TestWidgetsFlutterBinding.ensureInitialized();
 
   group('PathProviderIOS', () {
     late PathProviderIOS pathProvider;
-    late List<MethodCall> log;
     // These unit tests use the actual filesystem, since an injectable
     // filesystem would add a runtime dependency to the package, so everything
     // is contained to a temporary directory.
@@ -24,6 +42,7 @@
     late String applicationSupportPath;
     late String libraryPath;
     late String applicationDocumentsPath;
+    late _Api api;
 
     setUp(() async {
       pathProvider = PathProviderIOS();
@@ -37,24 +56,12 @@
       applicationDocumentsPath =
           p.join(basePath, 'application', 'documents', 'path');
 
-      log = <MethodCall>[];
-      TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger
-          .setMockMethodCallHandler(pathProvider.methodChannel,
-              (MethodCall methodCall) async {
-        log.add(methodCall);
-        switch (methodCall.method) {
-          case 'getTemporaryDirectory':
-            return temporaryPath;
-          case 'getApplicationSupportDirectory':
-            return applicationSupportPath;
-          case 'getLibraryDirectory':
-            return libraryPath;
-          case 'getApplicationDocumentsDirectory':
-            return applicationDocumentsPath;
-          default:
-            return null;
-        }
-      });
+      api = _Api();
+      api.applicationDocumentsPath = applicationDocumentsPath;
+      api.applicationSupportPath = applicationSupportPath;
+      api.libraryPath = libraryPath;
+      api.temporaryPath = temporaryPath;
+      TestPathProviderApi.setup(api);
     });
 
     tearDown(() {
@@ -63,21 +70,11 @@
 
     test('getTemporaryPath', () async {
       final String? path = await pathProvider.getTemporaryPath();
-      expect(
-        log,
-        <Matcher>[isMethodCall('getTemporaryDirectory', arguments: null)],
-      );
       expect(path, temporaryPath);
     });
 
     test('getApplicationSupportPath', () async {
       final String? path = await pathProvider.getApplicationSupportPath();
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall('getApplicationSupportDirectory', arguments: null)
-        ],
-      );
       expect(path, applicationSupportPath);
     });
 
@@ -89,21 +86,11 @@
 
     test('getLibraryPath', () async {
       final String? path = await pathProvider.getLibraryPath();
-      expect(
-        log,
-        <Matcher>[isMethodCall('getLibraryDirectory', arguments: null)],
-      );
       expect(path, libraryPath);
     });
 
     test('getApplicationDocumentsPath', () async {
       final String? path = await pathProvider.getApplicationDocumentsPath();
-      expect(
-        log,
-        <Matcher>[
-          isMethodCall('getApplicationDocumentsDirectory', arguments: null)
-        ],
-      );
       expect(path, applicationDocumentsPath);
     });
 
