Unverified Commit 162be593 authored by hellohuanlin's avatar hellohuanlin Committed by GitHub

[tools]build IPA validation bundle identifier using the default "com.example" prefix (#116430)

* [tools]build IPA validation bundle identifier using default com.example

* rephrase the warning
parent 22cbef30
...@@ -53,6 +53,11 @@ Future<void> main() async { ...@@ -53,6 +53,11 @@ Future<void> main() async {
if (!output.contains('Warning: Launch image is set to the default placeholder. Replace with unique launch images.')) { if (!output.contains('Warning: Launch image is set to the default placeholder. Replace with unique launch images.')) {
throw TaskResult.failure('Must validate template launch image.'); throw TaskResult.failure('Must validate template launch image.');
} }
// The project is still using com.example as bundle identifier prefix.
if (!output.contains('Warning: Your application still contains the default "com.example" bundle identifier.')) {
throw TaskResult.failure('Must validate the default bundle identifier prefix');
}
}); });
final String archivePath = path.join( final String archivePath = path.join(
......
...@@ -350,6 +350,10 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand { ...@@ -350,6 +350,10 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand {
if (xcodeProjectSettingsMap.values.any((String? element) => element == null)) { if (xcodeProjectSettingsMap.values.any((String? element) => element == null)) {
messageBuffer.writeln('\nYou must set up the missing settings.'); messageBuffer.writeln('\nYou must set up the missing settings.');
} }
if (xcodeProjectSettingsMap['Bundle Identifier']?.startsWith('com.example') ?? false) {
messageBuffer.writeln('\nWarning: Your application still contains the default "com.example" bundle identifier.');
}
} }
@override @override
......
...@@ -740,13 +740,6 @@ bool _handleIssues(XCResult? xcResult, Logger logger, XcodeBuildExecution? xcode ...@@ -740,13 +740,6 @@ bool _handleIssues(XCResult? xcResult, Logger logger, XcodeBuildExecution? xcode
logger.printError("Also try selecting 'Product > Build' to fix the problem."); logger.printError("Also try selecting 'Product > Build' to fix the problem.");
} }
if (!issueDetected && _needUpdateSigningIdentifier(xcodeBuildExecution)) {
issueDetected = true;
logger.printError('');
logger.printError('It appears that your application still contains the default signing identifier.');
logger.printError("Try replacing 'com.example' with your signing id in Xcode:");
logger.printError(' open ios/Runner.xcworkspace');
}
return issueDetected; return issueDetected;
} }
...@@ -760,13 +753,6 @@ bool _missingDevelopmentTeam(XcodeBuildExecution? xcodeBuildExecution) { ...@@ -760,13 +753,6 @@ bool _missingDevelopmentTeam(XcodeBuildExecution? xcodeBuildExecution) {
xcodeBuildExecution.buildSettings.containsKey); xcodeBuildExecution.buildSettings.containsKey);
} }
// Return `true` if the signing identifier needs to be updated.
bool _needUpdateSigningIdentifier(XcodeBuildExecution? xcodeBuildExecution) {
return xcodeBuildExecution != null
&& xcodeBuildExecution.environmentType == EnvironmentType.physical
&& (xcodeBuildExecution.buildSettings['PRODUCT_BUNDLE_IDENTIFIER']?.contains('com.example') ?? false);
}
// Detects and handles errors from stdout. // Detects and handles errors from stdout.
// //
// As detecting issues in stdout is not usually accurate, this should be used as a fallback when other issue detecting methods failed. // As detecting issues in stdout is not usually accurate, this should be used as a fallback when other issue detecting methods failed.
......
...@@ -565,73 +565,6 @@ void main() { ...@@ -565,73 +565,6 @@ void main() {
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
}); });
testUsingContext('Default bundle identifier error should be hidden if there is another xcresult issue.', () async {
final BuildCommand command = BuildCommand(
androidSdk: FakeAndroidSdk(),
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
fileSystem: MemoryFileSystem.test(),
logger: BufferLogger.test(),
osUtils: FakeOperatingSystemUtils(),
);
createMinimalMockProjectFiles();
await expectLater(
createTestCommandRunner(command).run(const <String>['build', 'ios', '--no-pub']),
throwsToolExit(),
);
expect(testLogger.errorText, contains("Use of undeclared identifier 'asdas'"));
expect(testLogger.errorText, contains('/Users/m/Projects/test_create/ios/Runner/AppDelegate.m:7:56'));
expect(testLogger.errorText, isNot(contains('It appears that your application still contains the default signing identifier.')));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
xattrCommand,
setUpFakeXcodeBuildHandler(exitCode: 1, onRun: () {
fileSystem.systemTempDirectory.childDirectory(_xcBundleFilePath).createSync();
}),
setUpXCResultCommand(stdout: kSampleResultJsonWithIssues),
setUpRsyncCommand(),
]),
Platform: () => macosPlatform,
EnvironmentType: () => EnvironmentType.physical,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(productBundleIdentifier: 'com.example'),
});
testUsingContext('Show default bundle identifier error if there are no other errors.', () async {
final BuildCommand command = BuildCommand(
androidSdk: FakeAndroidSdk(),
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
fileSystem: MemoryFileSystem.test(),
logger: BufferLogger.test(),
osUtils: FakeOperatingSystemUtils(),
);
createMinimalMockProjectFiles();
await expectLater(
createTestCommandRunner(command).run(const <String>['build', 'ios', '--no-pub']),
throwsToolExit(),
);
expect(testLogger.errorText, contains('It appears that your application still contains the default signing identifier.'));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
xattrCommand,
setUpFakeXcodeBuildHandler(exitCode: 1, onRun: () {
fileSystem.systemTempDirectory.childDirectory(_xcBundleFilePath).createSync();
}),
setUpXCResultCommand(stdout: kSampleResultJsonNoIssues),
setUpRsyncCommand(),
]),
Platform: () => macosPlatform,
EnvironmentType: () => EnvironmentType.physical,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(productBundleIdentifier: 'com.example'),
});
testUsingContext('Display xcresult issues with no provisioning profile.', () async { testUsingContext('Display xcresult issues with no provisioning profile.', () async {
final BuildCommand command = BuildCommand( final BuildCommand command = BuildCommand(
androidSdk: FakeAndroidSdk(), androidSdk: FakeAndroidSdk(),
......
...@@ -991,6 +991,84 @@ void main() { ...@@ -991,6 +991,84 @@ void main() {
PlistParser: () => plistUtils, PlistParser: () => plistUtils,
}); });
testUsingContext(
'Validate basic Xcode settings with default bundle identifier prefix', () async {
const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist';
fakeProcessManager.addCommands(<FakeCommand>[
xattrCommand,
setUpFakeXcodeBuildHandler(onRun: () {
fileSystem.file(plistPath).createSync(recursive: true);
}),
exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist),
]);
createMinimalMockProjectFiles();
plistUtils.fileContents[plistPath] = <String,String>{
'CFBundleIdentifier': 'com.example.my_app',
};
final BuildCommand command = BuildCommand(
androidSdk: FakeAndroidSdk(),
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
fileSystem: MemoryFileSystem.test(),
logger: BufferLogger.test(),
osUtils: FakeOperatingSystemUtils(),
);
await createTestCommandRunner(command).run(
<String>['build', 'ipa', '--no-pub']);
expect(
testLogger.statusText,
contains('Warning: Your application still contains the default "com.example" bundle identifier.')
);
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => fakeProcessManager,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
PlistParser: () => plistUtils,
});
testUsingContext(
'Validate basic Xcode settings with custom bundle identifier prefix', () async {
const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist';
fakeProcessManager.addCommands(<FakeCommand>[
xattrCommand,
setUpFakeXcodeBuildHandler(onRun: () {
fileSystem.file(plistPath).createSync(recursive: true);
}),
exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist),
]);
createMinimalMockProjectFiles();
plistUtils.fileContents[plistPath] = <String,String>{
'CFBundleIdentifier': 'com.my_company.my_app',
};
final BuildCommand command = BuildCommand(
androidSdk: FakeAndroidSdk(),
buildSystem: TestBuildSystem.all(BuildResult(success: true)),
fileSystem: MemoryFileSystem.test(),
logger: BufferLogger.test(),
osUtils: FakeOperatingSystemUtils(),
);
await createTestCommandRunner(command).run(
<String>['build', 'ipa', '--no-pub']);
expect(
testLogger.statusText,
isNot(contains('Warning: Your application still contains the default "com.example" bundle identifier.'))
);
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => fakeProcessManager,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
PlistParser: () => plistUtils,
});
testUsingContext('Validate template app icons with conflicts', () async { testUsingContext('Validate template app icons with conflicts', () async {
const String projectIconContentsJsonPath = 'ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json'; const String projectIconContentsJsonPath = 'ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json';
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment