[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
This commit is contained in:
parent
22cbef3050
commit
162be5933b
@ -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 {
|
|||||||
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
|
|||||||
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) {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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';
|
||||||
|
Loading…
x
Reference in New Issue
Block a user