diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 200120f8dde..d61c40d1e50 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart @@ -918,6 +918,12 @@ _XCResultIssueHandlingResult _handleXCResultIssue({ missingModule: missingModule, ); } + } else if (message.toLowerCase().contains('has been modified since')) { + return _XCResultIssueHandlingResult( + requiresProvisioningProfile: false, + hasProvisioningProfileIssue: false, + modifiedPrecompiledSource: true, + ); } return _XCResultIssueHandlingResult( requiresProvisioningProfile: false, @@ -937,6 +943,7 @@ Future _handleIssues( var requiresProvisioningProfile = false; var hasProvisioningProfileIssue = false; var issueDetected = false; + var modifiedPrecompiledSource = false; String? missingPlatform; final duplicateModules = []; final missingModules = []; @@ -962,6 +969,7 @@ Future _handleIssues( if (handlingResult.missingModule != null) { missingModules.add(handlingResult.missingModule!); } + modifiedPrecompiledSource = handlingResult.modifiedPrecompiledSource; issueDetected = true; } } else if (xcResult != null) { @@ -1032,6 +1040,13 @@ Future _handleIssues( ); } } + } else if (modifiedPrecompiledSource) { + logger.printError( + '════════════════════════════════════════════════════════════════════════════════\n' + 'A precompiled file has been changed since last built. Please run "flutter clean" to clear ' + 'the cache.\n' + '════════════════════════════════════════════════════════════════════════════════', + ); } return issueDetected; } @@ -1169,6 +1184,7 @@ class _XCResultIssueHandlingResult { this.missingPlatform, this.duplicateModule, this.missingModule, + this.modifiedPrecompiledSource = false, }); /// An issue indicates that user didn't provide the provisioning profile. @@ -1186,6 +1202,10 @@ class _XCResultIssueHandlingResult { /// An issue indicates a module was imported but not found, potentially due /// to it being Swift Package Manager compatible only. final String? missingModule; + + /// An issue indicates that a source file, such as a header in the Flutter framework, has + /// changed since last built. This requires "flutter clean" to resolve. + final bool modifiedPrecompiledSource; } const _kResultBundlePath = 'temporary_xcresult_bundle'; diff --git a/packages/flutter_tools/test/general.shard/ios/mac_test.dart b/packages/flutter_tools/test/general.shard/ios/mac_test.dart index b1598f53723..12a2aed2a5f 100644 --- a/packages/flutter_tools/test/general.shard/ios/mac_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/mac_test.dart @@ -670,6 +670,56 @@ duplicate symbol '_$s29plugin_1_name23PluginNamePluginC9setDouble3key5valueySS_S Pub: ThrowingPub.new, }, ); + + testWithoutContext('parses file has been modified error', () async { + const buildCommands = ['xcrun', 'cc', 'blah']; + final buildResult = XcodeBuildResult( + success: false, + stdout: '', + xcodeBuildExecution: XcodeBuildExecution( + buildCommands: buildCommands, + appDirectory: '/blah/blah', + environmentType: EnvironmentType.physical, + buildSettings: buildSettings, + ), + xcResult: XCResult.test( + issues: [ + XCResultIssue.test( + message: + "File 'path/to/Flutter.framework/Headers/FlutterPlugin.h' has been modified since " + "the precompiled header 'path/to/Runner.build/Objects-normal/arm64/Runner-primary-Bridging-header.pch'" + ' was built: size changed (was 18306, now 16886)', + subType: 'Error', + ), + XCResultIssue.test( + message: + "File 'path/to/Flutter.framework/Headers/FlutterEngine.h' has been modified since " + "the precompiled header 'path/to/Runner.build/Objects-normal/arm64/Runner-primary-Bridging-header.pch'" + ' was built: size changed (was 18306, now 16886)', + subType: 'Error', + ), + ], + ), + ); + final fs = MemoryFileSystem.test(); + final project = FakeFlutterProject(fileSystem: fs, usesSwiftPackageManager: true); + project.ios.podfile.createSync(recursive: true); + await diagnoseXcodeBuildFailure( + buildResult, + logger: logger, + analytics: fakeAnalytics, + fileSystem: fs, + platform: FlutterDarwinPlatform.ios, + project: project, + ); + expect( + logger.errorText, + contains( + 'A precompiled file has been changed since last built. Please run "flutter clean" to ' + 'clear the cache.', + ), + ); + }); }); group('Upgrades project.pbxproj for old asset usage', () {