From 6a3ea7eb83e2deba46667ca416b9b07141795966 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Tue, 23 Nov 2021 17:38:02 -0800 Subject: [PATCH] Update Xcode toolsVersion encoded in generated Main.storyboard (#94084) --- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ui/ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../api/ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- .../ios/Runner/Base.lproj/Main.storyboard | 4 +- packages/flutter_tools/lib/src/ios/mac.dart | 2 + .../storyboard_version_migration.dart | 63 +++++++++++++ .../flutter_tools/lib/src/xcode_project.dart | 5 + .../Runner/Base.lproj/Main.storyboard | 9 +- .../Runner.tmpl/Base.lproj/Main.storyboard | 9 +- .../ios/ios_project_migration_test.dart | 92 +++++++++++++++++++ .../ios/Runner/Base.lproj/Main.storyboard | 4 +- 30 files changed, 220 insertions(+), 56 deletions(-) create mode 100644 packages/flutter_tools/lib/src/ios/migrations/storyboard_version_migration.dart diff --git a/dev/benchmarks/complex_layout/ios/Runner/Base.lproj/Main.storyboard b/dev/benchmarks/complex_layout/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/benchmarks/complex_layout/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/benchmarks/complex_layout/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/benchmarks/macrobenchmarks/ios/Runner/Base.lproj/Main.storyboard b/dev/benchmarks/macrobenchmarks/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/benchmarks/macrobenchmarks/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/benchmarks/macrobenchmarks/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/benchmarks/microbenchmarks/ios/Runner/Base.lproj/Main.storyboard b/dev/benchmarks/microbenchmarks/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/benchmarks/microbenchmarks/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/benchmarks/microbenchmarks/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/benchmarks/platform_views_layout/ios/Runner/Base.lproj/Main.storyboard b/dev/benchmarks/platform_views_layout/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/benchmarks/platform_views_layout/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/benchmarks/platform_views_layout/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner/Base.lproj/Main.storyboard b/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/benchmarks/platform_views_layout_hybrid_composition/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/benchmarks/test_apps/stocks/ios/Runner/Base.lproj/Main.storyboard b/dev/benchmarks/test_apps/stocks/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/benchmarks/test_apps/stocks/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/benchmarks/test_apps/stocks/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/channels/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/channels/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/channels/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/channels/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/external_ui/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/external_ui/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/external_ui/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/external_ui/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/flavors/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/flavors/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/flavors/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/flavors/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/flutter_gallery/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/flutter_gallery/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/flutter_gallery/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/flutter_gallery/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/ios_app_with_extensions/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/ios_app_with_extensions/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/ios_app_with_extensions/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/ios_app_with_extensions/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/ios_platform_view_tests/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/ios_platform_view_tests/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/ios_platform_view_tests/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/ios_platform_view_tests/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/non_nullable/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/non_nullable/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/non_nullable/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/non_nullable/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/platform_interaction/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/platform_interaction/ios/Runner/Base.lproj/Main.storyboard index 08685c4b69f..27fa7a64cb7 100644 --- a/dev/integration_tests/platform_interaction/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/platform_interaction/ios/Runner/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + diff --git a/dev/integration_tests/release_smoke_test/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/release_smoke_test/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/release_smoke_test/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/release_smoke_test/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/integration_tests/ui/ios/Runner/Base.lproj/Main.storyboard b/dev/integration_tests/ui/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/integration_tests/ui/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/integration_tests/ui/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/dev/manual_tests/ios/Runner/Base.lproj/Main.storyboard b/dev/manual_tests/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/dev/manual_tests/ios/Runner/Base.lproj/Main.storyboard +++ b/dev/manual_tests/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/examples/api/ios/Runner/Base.lproj/Main.storyboard b/examples/api/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/examples/api/ios/Runner/Base.lproj/Main.storyboard +++ b/examples/api/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/examples/hello_world/ios/Runner/Base.lproj/Main.storyboard b/examples/hello_world/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/examples/hello_world/ios/Runner/Base.lproj/Main.storyboard +++ b/examples/hello_world/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/examples/image_list/ios/Runner/Base.lproj/Main.storyboard b/examples/image_list/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/examples/image_list/ios/Runner/Base.lproj/Main.storyboard +++ b/examples/image_list/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/examples/layers/ios/Runner/Base.lproj/Main.storyboard b/examples/layers/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/examples/layers/ios/Runner/Base.lproj/Main.storyboard +++ b/examples/layers/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/examples/platform_channel/ios/Runner/Base.lproj/Main.storyboard b/examples/platform_channel/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/examples/platform_channel/ios/Runner/Base.lproj/Main.storyboard +++ b/examples/platform_channel/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/examples/platform_channel_swift/ios/Runner/Base.lproj/Main.storyboard b/examples/platform_channel_swift/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/examples/platform_channel_swift/ios/Runner/Base.lproj/Main.storyboard +++ b/examples/platform_channel_swift/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 1b467bcda7b..135b5b030ac 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -29,6 +29,7 @@ import 'migrations/project_base_configuration_migration.dart'; import 'migrations/project_build_location_migration.dart'; import 'migrations/project_object_version_migration.dart'; import 'migrations/remove_framework_link_and_embedding_migration.dart'; +import 'migrations/storyboard_version_migration.dart'; import 'migrations/xcode_build_system_migration.dart'; import 'xcode_build_settings.dart'; import 'xcodeproj.dart'; @@ -122,6 +123,7 @@ Future buildXcodeProject({ ProjectBuildLocationMigration(app.project, globals.logger), DeploymentTargetMigration(app.project, globals.logger), ProjectObjectVersionMigration(app.project, globals.logger), + StoryboardVersionMigration(app.project, globals.logger), ]; final ProjectMigration migration = ProjectMigration(migrators); diff --git a/packages/flutter_tools/lib/src/ios/migrations/storyboard_version_migration.dart b/packages/flutter_tools/lib/src/ios/migrations/storyboard_version_migration.dart new file mode 100644 index 00000000000..9075172fcb6 --- /dev/null +++ b/packages/flutter_tools/lib/src/ios/migrations/storyboard_version_migration.dart @@ -0,0 +1,63 @@ +// 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 '../../base/project_migrator.dart'; +import '../../xcode_project.dart'; + +// Update Main.storyboard tools versions to avoid Xcode UI hang. +class StoryboardVersionMigration extends ProjectMigrator { + StoryboardVersionMigration( + IosProject project, + Logger logger, + ) : _mainStoryboard = project.xcodeMainStoryboard, + super(logger); + + final File _mainStoryboard; + + @override + bool migrate() { + if (_mainStoryboard.existsSync()) { + processFileLines(_mainStoryboard); + } else { + logger.printTrace('Xcode project main storyboard not found, skipping version migration.'); + } + + return true; + } + + @override + String migrateLine(String line) { + String updatedString = line; + final List originalDocumentHeaders = [ + // https://github.com/flutter/flutter/commit/5f6e9cb39c + ' _flutterLibRoot.childDirectory('Flutter').childFile('AppFrameworkInfo.plist'); + File get xcodeMainStoryboard => _flutterLibRoot + .childDirectory('Runner') + .childDirectory('Base.lproj') + .childFile('Main.storyboard'); + Directory get symlinks => _flutterLibRoot.childDirectory('.symlinks'); /// Do all plugins support arm64 simulators to run natively on an ARM Mac? diff --git a/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Base.lproj/Main.storyboard b/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Base.lproj/Main.storyboard index f3c28516fb3..3cbfb9264a1 100644 --- a/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Base.lproj/Main.storyboard +++ b/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,9 @@ - - + + - - + + + diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard index f3c28516fb3..3cbfb9264a1 100644 --- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard +++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Base.lproj/Main.storyboard @@ -1,8 +1,9 @@ - - + + - - + + + 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 e44d65d06d5..ebedfc43070 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 @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/ios/migrations/project_base_configuration_migr import 'package:flutter_tools/src/ios/migrations/project_build_location_migration.dart'; import 'package:flutter_tools/src/ios/migrations/project_object_version_migration.dart'; import 'package:flutter_tools/src/ios/migrations/remove_framework_link_and_embedding_migration.dart'; +import 'package:flutter_tools/src/ios/migrations/storyboard_version_migration.dart'; import 'package:flutter_tools/src/ios/migrations/xcode_build_system_migration.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/xcode_project.dart'; @@ -708,6 +709,94 @@ keep this 3 expect('Updating project for Xcode compatibility'.allMatches(testLogger.statusText).length, 1); }); }); + + group('update Main.storyboard tools version', () { + late MemoryFileSystem memoryFileSystem; + late BufferLogger testLogger; + late FakeIosProject project; + late File xcodeMainStoryboard; + + setUp(() { + memoryFileSystem = MemoryFileSystem(); + testLogger = BufferLogger.test(); + project = FakeIosProject(); + xcodeMainStoryboard = memoryFileSystem.file('Main.storyboard'); + project.xcodeMainStoryboard = xcodeMainStoryboard; + }); + + testWithoutContext('skipped if files are missing', () { + final StoryboardVersionMigration iosProjectMigration = StoryboardVersionMigration( + project, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + expect(xcodeMainStoryboard.existsSync(), isFalse); + + expect(testLogger.traceText, contains('Xcode project main storyboard not found, skipping version migration')); + expect(testLogger.statusText, isEmpty); + }); + + testWithoutContext('skipped if nothing to upgrade', () { + const String xcodeMainStoryboardContents = ''' + + + + + + + + '''; + xcodeMainStoryboard.writeAsStringSync(xcodeMainStoryboardContents); + + final DateTime projectLastModified = xcodeMainStoryboard.lastModifiedSync(); + + final StoryboardVersionMigration iosProjectMigration = StoryboardVersionMigration( + project, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + + expect(xcodeMainStoryboard.lastModifiedSync(), projectLastModified); + expect(xcodeMainStoryboard.readAsStringSync(), xcodeMainStoryboardContents); + + expect(testLogger.statusText, isEmpty); + }); + + testWithoutContext('storyboard is migrated to Xcode 12.3 tools version', () { + xcodeMainStoryboard.writeAsStringSync(''' + + + + + + + + + + +'''); + + final StoryboardVersionMigration iosProjectMigration = StoryboardVersionMigration( + project, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + + expect(xcodeMainStoryboard.readAsStringSync(), ''' + + + + + + + + + + +'''); + expect(testLogger.statusText, contains('Updating iOS Main.storyboard tools version')); + }); + }); }); } @@ -726,6 +815,9 @@ class FakeIosProject extends Fake implements IosProject { @override File appFrameworkInfoPlist = MemoryFileSystem.test().file('appFrameworkInfoPlist'); + + @override + File xcodeMainStoryboard = MemoryFileSystem.test().file('xcodeProjectMainStoryboard'); } class FakeIOSMigrator extends ProjectMigrator { diff --git a/packages/integration_test/example/ios/Runner/Base.lproj/Main.storyboard b/packages/integration_test/example/ios/Runner/Base.lproj/Main.storyboard index f3c28516fb3..eb9c41913ea 100644 --- a/packages/integration_test/example/ios/Runner/Base.lproj/Main.storyboard +++ b/packages/integration_test/example/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - +