Skip to content

Commit

Permalink
[tools]build IPA validation bundle identifier using the default "com.…
Browse files Browse the repository at this point in the history
…example" prefix (#116430)

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

* rephrase the warning
  • Loading branch information
hellohuanlin committed Dec 2, 2022
1 parent 22cbef3 commit 162be59
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 81 deletions.
5 changes: 5 additions & 0 deletions dev/devicelab/bin/tasks/ios_content_validation_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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.')) {
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(
Expand Down
4 changes: 4 additions & 0 deletions packages/flutter_tools/lib/src/commands/build_ios.dart
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,10 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand {
if (xcodeProjectSettingsMap.values.any((String? element) => element == null)) {
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
Expand Down
14 changes: 0 additions & 14 deletions packages/flutter_tools/lib/src/ios/mac.dart
Original file line number Diff line number Diff line change
Expand Up @@ -740,13 +740,6 @@ bool _handleIssues(XCResult? xcResult, Logger logger, XcodeBuildExecution? xcode
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;
}

Expand All @@ -760,13 +753,6 @@ bool _missingDevelopmentTeam(XcodeBuildExecution? xcodeBuildExecution) {
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.
//
// As detecting issues in stdout is not usually accurate, this should be used as a fallback when other issue detecting methods failed.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -565,73 +565,6 @@ void main() {
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 {
final BuildCommand command = BuildCommand(
androidSdk: FakeAndroidSdk(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -991,6 +991,84 @@ void main() {
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 {
const String projectIconContentsJsonPath = 'ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json';
Expand Down

0 comments on commit 162be59

Please sign in to comment.