From 1b53f7beba3a2c7a04321bc00e89a6afd3aeaf83 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 22 Sep 2021 13:23:05 -0700 Subject: [PATCH] Migrate iOS project to Xcode 13 compatibility (#90304) --- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ui/ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../api/ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- packages/flutter_tools/lib/src/ios/mac.dart | 2 + .../project_object_version_migration.dart | 63 ++++++++++ .../flutter_tools/lib/src/xcode_project.dart | 4 + .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- .../ios/ios_project_migration_test.dart | 111 ++++++++++++++++++ .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- 56 files changed, 258 insertions(+), 82 deletions(-) create mode 100644 packages/flutter_tools/lib/src/ios/migrations/project_object_version_migration.dart diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.pbxproj b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.pbxproj index 242f5bd1fd6..5bef0282de1 100644 --- a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.pbxproj +++ b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ @@ -167,7 +167,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { diff --git a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cfdb3..3db53b6e1fb 100644 --- a/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/dev/benchmarks/complex_layout/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ buildXcodeProject({ ProjectBaseConfigurationMigration(app.project, globals.logger), ProjectBuildLocationMigration(app.project, globals.logger), DeploymentTargetMigration(app.project, globals.logger), + ProjectObjectVersionMigration(app.project, globals.logger), ]; final ProjectMigration migration = ProjectMigration(migrators); diff --git a/packages/flutter_tools/lib/src/ios/migrations/project_object_version_migration.dart b/packages/flutter_tools/lib/src/ios/migrations/project_object_version_migration.dart new file mode 100644 index 00000000000..39f8ccdd00b --- /dev/null +++ b/packages/flutter_tools/lib/src/ios/migrations/project_object_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'; + +/// Migrate the Xcode project for Xcode 13 compatibility to avoid an "Update to recommended settings" Xcode warning. +class ProjectObjectVersionMigration extends ProjectMigrator { + ProjectObjectVersionMigration( + IosProject project, + Logger logger, + ) : _xcodeProjectInfoFile = project.xcodeProjectInfoFile, + _xcodeProjectSchemeFile = project.xcodeProjectSchemeFile, + super(logger); + + final File _xcodeProjectInfoFile; + final File _xcodeProjectSchemeFile; + + @override + bool migrate() { + if (_xcodeProjectInfoFile.existsSync()) { + processFileLines(_xcodeProjectInfoFile); + } else { + logger.printTrace('Xcode project not found, skipping Xcode compatibility migration.'); + } + if (_xcodeProjectSchemeFile.existsSync()) { + processFileLines(_xcodeProjectSchemeFile); + } else { + logger.printTrace('Runner scheme not found, skipping Xcode compatibility migration.'); + } + + return true; + } + + @override + String? migrateLine(String line) { + String updatedString = line; + final Map originalToReplacement = { + // objectVersion has only been 46 and 50 in the iOS template. + 'objectVersion = 46;': 'objectVersion = 50;', + // LastUpgradeCheck is in the Xcode project file, not scheme file. + // Value has been 0730, 0800, 1020, and 1300 in the template. + RegExp(r'LastUpgradeCheck = \d+;'): 'LastUpgradeCheck = 1300;', + // LastUpgradeVersion is in the scheme file, not Xcode project file. + RegExp(r'LastUpgradeVersion = "\d+"'): 'LastUpgradeVersion = "1300"', + }; + + originalToReplacement.forEach((Pattern original, String replacement) { + if (line.contains(original)) { + updatedString = line.replaceAll(original, replacement); + if (!migrationRequired && updatedString != line) { + // Only print once. + logger.printStatus('Updating project for Xcode compatibility.'); + } + } + }); + + return updatedString; + } +} diff --git a/packages/flutter_tools/lib/src/xcode_project.dart b/packages/flutter_tools/lib/src/xcode_project.dart index c39349002f4..f1df7932811 100644 --- a/packages/flutter_tools/lib/src/xcode_project.dart +++ b/packages/flutter_tools/lib/src/xcode_project.dart @@ -37,6 +37,10 @@ abstract class XcodeBasedProject extends FlutterProjectPlatform { /// The 'project.pbxproj' file of [xcodeProject]. File get xcodeProjectInfoFile => xcodeProject.childFile('project.pbxproj'); + /// The 'Runner.xcscheme' file of [xcodeProject]. + File get xcodeProjectSchemeFile => + xcodeProject.childDirectory('xcshareddata').childDirectory('xcschemes').childFile('Runner.xcscheme'); + File get xcodeProjectWorkspaceData => xcodeProject .childDirectory('project.xcworkspace') diff --git a/packages/flutter_tools/templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index a28140cfdb3..c87d15a3352 100644 --- a/packages/flutter_tools/templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/flutter_tools/templates/app_shared/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ - - - - + + - - +'''); + + final ProjectObjectVersionMigration iosProjectMigration = ProjectObjectVersionMigration( + project, + testLogger, + ); + expect(iosProjectMigration.migrate(), isTrue); + + expect(xcodeProjectInfoFile.readAsStringSync(), ''' + classes = { + }; + objectVersion = 50; + objects = { + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = ""; +'''); + + expect(xcodeProjectSchemeFile.readAsStringSync(), ''' + +'''); + // Only print once even though 3 lines were changed. + expect('Updating project for Xcode compatibility'.allMatches(testLogger.statusText).length, 1); + }); + }); }); } @@ -613,6 +721,9 @@ class FakeIosProject extends Fake implements IosProject { @override File xcodeProjectInfoFile = MemoryFileSystem.test().file('xcodeProjectInfoFile'); + @override + File xcodeProjectSchemeFile = MemoryFileSystem.test().file('xcodeProjectSchemeFile'); + @override File appFrameworkInfoPlist = MemoryFileSystem.test().file('appFrameworkInfoPlist'); } diff --git a/packages/integration_test/example/ios/Runner.xcodeproj/project.pbxproj b/packages/integration_test/example/ios/Runner.xcodeproj/project.pbxproj index a519162de38..85e26abb911 100644 --- a/packages/integration_test/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/integration_test/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ @@ -228,7 +228,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1020; + LastUpgradeCheck = 1300; ORGANIZATIONNAME = "The Chromium Authors"; TargetAttributes = { 769541C723A0351900E5C350 = { diff --git a/packages/integration_test/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/integration_test/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 72fa1469f5e..1e6676d02b0 100644 --- a/packages/integration_test/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/integration_test/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@