Build iOS apps using Swift Packages (#58522)

diff --git a/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/benchmarks/macrobenchmarks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/benchmarks/test_apps/stocks/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/devicelab/bin/tasks/ios_app_with_extensions_test.dart b/dev/devicelab/bin/tasks/ios_app_with_extensions_test.dart
index 4349a18..12bd058 100644
--- a/dev/devicelab/bin/tasks/ios_app_with_extensions_test.dart
+++ b/dev/devicelab/bin/tasks/ios_app_with_extensions_test.dart
@@ -12,7 +12,7 @@
 
 Future<void> main() async {
   await task(() async {
-    section('Copy test Flutter App with WatchOS Companion');
+    section('Copy app with watchOS companion and Swift Package');
 
     String watchDeviceID;
     String phoneDeviceID;
@@ -47,7 +47,7 @@
 
       if (!appReleaseBuilt) {
         return TaskResult.failure(
-            'Failed to build flutter iOS app with WatchOS companion in release mode.');
+            'Failed to build flutter iOS app with watchOS companion and Swift Package in release mode.');
       }
 
       section('Create debug build');
@@ -69,7 +69,7 @@
 
       if (!appDebugBuilt) {
         return TaskResult.failure(
-            'Failed to build flutter iOS app with WatchOS companion in debug mode.');
+            'Failed to build flutter iOS app with watchOS companion and Swift Package in debug mode.');
       }
 
       section('Create build for a simulator device');
@@ -183,7 +183,7 @@
 
       if (!appSimulatorBuilt) {
         return TaskResult.failure(
-            'Failed to build flutter iOS app with WatchOS companion in debug mode for simulated device.');
+            'Failed to build flutter iOS app with watchOS companion and Swift Package in debug mode for simulated device.');
       }
 
       section('Run app on simulator device');
@@ -229,7 +229,7 @@
 
       if (exitCode != 0)
         return TaskResult.failure(
-            'Failed to start flutter iOS app with WatchOS companion on simulated device.');
+            'Failed to start flutter iOS app with watchOS companion and Swift Package on simulated device.');
 
       return TaskResult.success(null);
     } catch (e) {
diff --git a/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/channels/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/codegen/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/codegen/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/codegen/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/codegen/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/external_ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/flavors/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.pbxproj b/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.pbxproj
index 26c9e79..c5525fd 100644
--- a/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.pbxproj
+++ b/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.pbxproj
@@ -262,9 +262,14 @@
 			files = (
 			);
 			inputPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
+				"${PODS_ROOT}/../Flutter/Flutter.framework",
+				"${BUILT_PRODUCTS_DIR}/device_info/device_info.framework",
 			);
 			name = "[CP] Embed Pods Frameworks";
 			outputPaths = (
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework",
+				"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
diff --git a/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/flutter_driver_screenshot_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/flutter_gallery/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/ios_app_with_extensions/README.md b/dev/integration_tests/ios_app_with_extensions/README.md
index b7eb354..7c45d78 100644
--- a/dev/integration_tests/ios_app_with_extensions/README.md
+++ b/dev/integration_tests/ios_app_with_extensions/README.md
@@ -3,3 +3,4 @@
 Integration test to test building an iOS app with
 non-Flutter features:
 - watchOS app and extension
+- Swift Package
diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.pbxproj b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.pbxproj
index 2e18f9e..ed4b7d1 100644
--- a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.pbxproj
+++ b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 50;
+	objectVersion = 52;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -22,6 +22,7 @@
 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+		F735C5C42485E50A002BE868 /* PlayingCard in Frameworks */ = {isa = PBXBuildFile; productRef = F735C5C32485E50A002BE868 /* PlayingCard */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -115,6 +116,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				F735C5C42485E50A002BE868 /* PlayingCard in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -262,6 +264,9 @@
 				49C15B68243E340F0025F804 /* PBXTargetDependency */,
 			);
 			name = Runner;
+			packageProductDependencies = (
+				F735C5C32485E50A002BE868 /* PlayingCard */,
+			);
 			productName = Runner;
 			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
 			productType = "com.apple.product-type.application";
@@ -297,6 +302,9 @@
 				Base,
 			);
 			mainGroup = 97C146E51CF9000F007C117D;
+			packageReferences = (
+				F735C5C22485E50A002BE868 /* XCRemoteSwiftPackageReference "example-package-playingcard" */,
+			);
 			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
 			projectDirPath = "";
 			projectRoot = "";
@@ -907,6 +915,25 @@
 			defaultConfigurationName = Release;
 		};
 /* End XCConfigurationList section */
+
+/* Begin XCRemoteSwiftPackageReference section */
+		F735C5C22485E50A002BE868 /* XCRemoteSwiftPackageReference "example-package-playingcard" */ = {
+			isa = XCRemoteSwiftPackageReference;
+			repositoryURL = "https://github.com/apple/example-package-playingcard.git";
+			requirement = {
+				kind = upToNextMajorVersion;
+				minimumVersion = 3.0.5;
+			};
+		};
+/* End XCRemoteSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+		F735C5C32485E50A002BE868 /* PlayingCard */ = {
+			isa = XCSwiftPackageProductDependency;
+			package = F735C5C22485E50A002BE868 /* XCRemoteSwiftPackageReference "example-package-playingcard" */;
+			productName = PlayingCard;
+		};
+/* End XCSwiftPackageProductDependency section */
 	};
 	rootObject = 97C146E61CF9000F007C117D /* Project object */;
 }
diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..b74fdf6
--- /dev/null
+++ b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,16 @@
+{
+  "object": {
+    "pins": [
+      {
+        "package": "PlayingCard",
+        "repositoryURL": "https://github.com/apple/example-package-playingcard.git",
+        "state": {
+          "branch": null,
+          "revision": "39ddabb01e8102ab548a8c6bb3eb20b15f3b4fbc",
+          "version": "3.0.5"
+        }
+      }
+    ]
+  },
+  "version": 1
+}
diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved
new file mode 100644
index 0000000..b74fdf6
--- /dev/null
+++ b/dev/integration_tests/ios_app_with_extensions/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -0,0 +1,16 @@
+{
+  "object": {
+    "pins": [
+      {
+        "package": "PlayingCard",
+        "repositoryURL": "https://github.com/apple/example-package-playingcard.git",
+        "state": {
+          "branch": null,
+          "revision": "39ddabb01e8102ab548a8c6bb3eb20b15f3b4fbc",
+          "version": "3.0.5"
+        }
+      }
+    ]
+  },
+  "version": 1
+}
diff --git a/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/ios_platform_view_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/non_nullable/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/platform_interaction/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/release_smoke_test/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 21a3cc1..d4d9ba1 100644
--- a/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/integration_tests/ui/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,9 +2,9 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
    <FileRef
-      location = "group:Pods/Pods.xcodeproj">
+      location = "self:Pods/Pods.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/dev/manual_tests/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 21a3cc1..d4d9ba1 100644
--- a/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/catalog/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,9 +2,9 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
    <FileRef
-      location = "group:Pods/Pods.xcodeproj">
+      location = "self:Pods/Pods.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 21a3cc1..d4d9ba1 100644
--- a/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/flutter_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,9 +2,9 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
    <FileRef
-      location = "group:Pods/Pods.xcodeproj">
+      location = "self:Pods/Pods.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/hello_world/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/image_list/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/layers/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/platform_channel/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/platform_channel_swift/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/examples/platform_view/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index f2f088d..4d4a838 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -26,6 +26,7 @@
 import 'code_signing.dart';
 import 'migrations/ios_migrator.dart';
 import 'migrations/project_base_configuration_migration.dart';
+import 'migrations/project_build_location_migration.dart';
 import 'migrations/remove_framework_link_and_embedding_migration.dart';
 import 'migrations/xcode_build_system_migration.dart';
 import 'xcodeproj.dart';
@@ -97,6 +98,7 @@
     RemoveFrameworkLinkAndEmbeddingMigration(app.project, globals.logger, globals.xcode, globals.flutterUsage),
     XcodeBuildSystemMigration(app.project, globals.logger),
     ProjectBaseConfigurationMigration(app.project, globals.logger),
+    ProjectBuildLocationMigration(app.project, globals.logger),
   ];
 
   final IOSMigration migration = IOSMigration(migrators);
diff --git a/packages/flutter_tools/lib/src/ios/migrations/project_base_configuration_migration.dart b/packages/flutter_tools/lib/src/ios/migrations/project_base_configuration_migration.dart
index 71c95f2..903ed2c 100644
--- a/packages/flutter_tools/lib/src/ios/migrations/project_base_configuration_migration.dart
+++ b/packages/flutter_tools/lib/src/ios/migrations/project_base_configuration_migration.dart
@@ -84,7 +84,7 @@
     newProjectContents = newProjectContents.replaceAll(releaseBaseConfigurationOriginal, releaseBaseConfigurationReplacement);
     if (originalProjectContents != newProjectContents) {
       logger.printStatus('Project base configurations detected, removing.');
-      _xcodeProjectInfoFile.writeAsStringSync(newProjectContents.toString());
+      _xcodeProjectInfoFile.writeAsStringSync(newProjectContents);
     }
     return true;
   }
diff --git a/packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart b/packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart
new file mode 100644
index 0000000..5ba9b10
--- /dev/null
+++ b/packages/flutter_tools/lib/src/ios/migrations/project_build_location_migration.dart
@@ -0,0 +1,38 @@
+// Copyright 2014 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 '../../base/file_system.dart';
+import '../../base/logger.dart';
+import '../../project.dart';
+import 'ios_migrator.dart';
+
+// Update the xcodeproj build location. Legacy build location does not work with Swift Packages.
+class ProjectBuildLocationMigration extends IOSMigrator {
+  ProjectBuildLocationMigration(
+    IosProject project,
+    Logger logger,
+  ) : _xcodeProjectWorkspaceData = project.xcodeProjectWorkspaceData,
+      super(logger);
+
+  final File _xcodeProjectWorkspaceData;
+
+  @override
+  bool migrate() {
+    if (!_xcodeProjectWorkspaceData.existsSync()) {
+      logger.printTrace('Xcode project workspace data not found, skipping build location migration.');
+      return true;
+    }
+
+    processFileLines(_xcodeProjectWorkspaceData);
+    return true;
+  }
+
+  @override
+  String migrateLine(String line) {
+    const String legacyBuildLocation = 'location = "group:';
+    const String defaultBuildLocation = 'location = "self:';
+
+    return line.replaceAll(legacyBuildLocation, defaultBuildLocation);
+  }
+}
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart
index 722ea7b..0b95dc4 100644
--- a/packages/flutter_tools/lib/src/project.dart
+++ b/packages/flutter_tools/lib/src/project.dart
@@ -398,6 +398,11 @@
   @override
   File get xcodeProjectInfoFile => xcodeProject.childFile('project.pbxproj');
 
+  File get xcodeProjectWorkspaceData =>
+    xcodeProject
+    .childDirectory('project.xcworkspace')
+    .childFile('contents.xcworkspacedata');
+
   @override
   Directory get xcodeWorkspace => hostAppRoot.childDirectory('$_hostAppProjectName.xcworkspace');
 
diff --git a/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata
index 1d526a1..6cec59c 100644
--- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata
+++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.xcworkspace/contents.xcworkspacedata
@@ -2,6 +2,6 @@
 <Workspace
    version = "1.0">
    <FileRef
-      location = "group:Runner.xcodeproj">
+      location = "self:Runner.xcodeproj">
    </FileRef>
 </Workspace>
diff --git a/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart
index 8fb672e..af7b1dc 100644
--- a/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart
+++ b/packages/flutter_tools/test/general.shard/ios/ios_project_migration_test.dart
@@ -5,10 +5,9 @@
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
 import 'package:flutter_tools/src/base/logger.dart';
-import 'package:flutter_tools/src/base/platform.dart';
-import 'package:flutter_tools/src/base/terminal.dart';
 import 'package:flutter_tools/src/ios/migrations/ios_migrator.dart';
 import 'package:flutter_tools/src/ios/migrations/project_base_configuration_migration.dart';
+import 'package:flutter_tools/src/ios/migrations/project_build_location_migration.dart';
 import 'package:flutter_tools/src/ios/migrations/remove_framework_link_and_embedding_migration.dart';
 import 'package:flutter_tools/src/ios/migrations/xcode_build_system_migration.dart';
 import 'package:flutter_tools/src/macos/xcode.dart';
@@ -49,15 +48,7 @@
         memoryFileSystem = MemoryFileSystem();
         mockXcode = MockXcode();
         xcodeProjectInfoFile = memoryFileSystem.file('project.pbxproj');
-
-        testLogger = BufferLogger(
-          terminal: AnsiTerminal(
-            stdio: null,
-            platform: const LocalPlatform(),
-          ),
-          outputPreferences: OutputPreferences.test(),
-        );
-
+        testLogger = BufferLogger.test();
         mockIosProject = MockIosProject();
         when(mockIosProject.xcodeProjectInfoFile).thenReturn(xcodeProjectInfoFile);
       });
@@ -268,15 +259,7 @@
       setUp(() {
         memoryFileSystem = MemoryFileSystem();
         xcodeWorkspaceSharedSettings = memoryFileSystem.file('WorkspaceSettings.xcsettings');
-
-        testLogger = BufferLogger(
-          terminal: AnsiTerminal(
-            stdio: null,
-            platform: const LocalPlatform(),
-          ),
-          outputPreferences: OutputPreferences.test(),
-        );
-
+        testLogger = BufferLogger.test();
         mockIosProject = MockIosProject();
         when(mockIosProject.xcodeWorkspaceSharedSettings).thenReturn(xcodeWorkspaceSharedSettings);
       });
@@ -339,6 +322,87 @@
       });
     });
 
+    group('Xcode default build location', () {
+      MemoryFileSystem memoryFileSystem;
+      BufferLogger testLogger;
+      MockIosProject mockIosProject;
+      File xcodeProjectWorkspaceData;
+
+      setUp(() {
+        memoryFileSystem = MemoryFileSystem();
+        xcodeProjectWorkspaceData = memoryFileSystem.file('contents.xcworkspacedata');
+        testLogger = BufferLogger.test();
+        mockIosProject = MockIosProject();
+        when(mockIosProject.xcodeProjectWorkspaceData).thenReturn(xcodeProjectWorkspaceData);
+      });
+
+      testWithoutContext('skipped if files are missing', () {
+        final ProjectBuildLocationMigration iosProjectMigration = ProjectBuildLocationMigration(
+          mockIosProject,
+          testLogger,
+        );
+        expect(iosProjectMigration.migrate(), isTrue);
+        expect(xcodeProjectWorkspaceData.existsSync(), isFalse);
+
+        expect(testLogger.traceText, contains('Xcode project workspace data not found, skipping build location migration.'));
+        expect(testLogger.statusText, isEmpty);
+      });
+
+      testWithoutContext('skipped if nothing to upgrade', () {
+        const String contents = '''
+ <?xml version="1.0" encoding="UTF-8"?>
+ <Workspace
+    version = "1.0">
+    <FileRef
+      location = "self:">
+    </FileRef>
+ </Workspace>''';
+        xcodeProjectWorkspaceData.writeAsStringSync(contents);
+
+        final ProjectBuildLocationMigration iosProjectMigration = ProjectBuildLocationMigration(
+          mockIosProject,
+          testLogger,
+        );
+        expect(iosProjectMigration.migrate(), isTrue);
+        expect(xcodeProjectWorkspaceData.existsSync(), isTrue);
+        expect(testLogger.statusText, isEmpty);
+      });
+
+      testWithoutContext('Xcode project is migrated', () {
+        const String contents = '''
+ <?xml version="1.0" encoding="UTF-8"?>
+ <Workspace
+    version = "1.0">
+    <FileRef
+      location = "group:Runner.xcodeproj">
+    </FileRef>
+    <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+    </FileRef>
+ </Workspace>''';
+        xcodeProjectWorkspaceData.writeAsStringSync(contents);
+
+        final ProjectBuildLocationMigration iosProjectMigration = ProjectBuildLocationMigration(
+          mockIosProject,
+          testLogger,
+        );
+        expect(iosProjectMigration.migrate(), isTrue);
+        expect(xcodeProjectWorkspaceData.readAsStringSync(), '''
+ <?xml version="1.0" encoding="UTF-8"?>
+ <Workspace
+    version = "1.0">
+    <FileRef
+      location = "self:Runner.xcodeproj">
+    </FileRef>
+    <FileRef
+      location = "self:Pods/Pods.xcodeproj">
+    </FileRef>
+ </Workspace>
+''');
+        expect(testLogger.statusText, contains('Upgrading contents.xcworkspacedata'));
+      });
+    });
+
     group('remove Runner project base configuration', () {
       MemoryFileSystem memoryFileSystem;
       BufferLogger testLogger;
@@ -348,15 +412,7 @@
       setUp(() {
         memoryFileSystem = MemoryFileSystem();
         xcodeProjectInfoFile = memoryFileSystem.file('project.pbxproj');
-
-        testLogger = BufferLogger(
-          terminal: AnsiTerminal(
-            stdio: null,
-            platform: const LocalPlatform(),
-          ),
-          outputPreferences: OutputPreferences.test(),
-        );
-
+        testLogger = BufferLogger.test();
         mockIosProject = MockIosProject();
         when(mockIosProject.xcodeProjectInfoFile).thenReturn(xcodeProjectInfoFile);
       });