diff --git a/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl b/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl
index 4d224546da..e5332a5951 100644
--- a/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl
+++ b/packages/flutter_tools/templates/app_shared/ios.tmpl/Runner/Info.plist.tmpl
@@ -42,6 +42,6 @@
UIInterfaceOrientationLandscapeRight
UIViewControllerBasedStatusBarAppearance
-
+
diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl
index 23f020ccce..3202215f8a 100644
--- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl
+++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.tmpl/Info.plist.tmpl
@@ -42,6 +42,6 @@
UIInterfaceOrientationLandscapeRight
UIViewControllerBasedStatusBarAppearance
-
+
diff --git a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
index 535e074f9a..3c31a0b383 100755
--- a/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
+++ b/packages/flutter_tools/test/commands.shard/permeable/create_test.dart
@@ -1363,6 +1363,84 @@ void main() {
ProcessManager: () => fakeProcessManager,
});
+ testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for objc iOS project.', () async {
+ Cache.flutterRoot = '../..';
+
+ final CreateCommand command = CreateCommand();
+ final CommandRunner runner = createTestCommandRunner(command);
+
+ await runner.run(['create', '--template=app', '--no-pub', '--org', 'com.foo.bar','--ios-language=objc', '--project-name=my_project', projectDir.path]);
+
+ final String plistPath = globals.fs.path.join('ios', 'Runner', 'Info.plist');
+ final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath));
+ expect(plistFile, exists);
+ final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance');
+ expect(viewControllerBasedStatusBarAppearance, true);
+ });
+
+ testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for objc swift project.', () async {
+ Cache.flutterRoot = '../..';
+
+ final CreateCommand command = CreateCommand();
+ final CommandRunner runner = createTestCommandRunner(command);
+
+ await runner.run(['create', '--template=app', '--no-pub', '--org', 'com.foo.bar','--ios-language=swift', '--project-name=my_project', projectDir.path]);
+
+ final String plistPath = globals.fs.path.join('ios', 'Runner', 'Info.plist');
+ final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath));
+ expect(plistFile, exists);
+ final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance');
+ expect(viewControllerBasedStatusBarAppearance, true);
+ });
+
+ testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for objc iOS module.', () async {
+ Cache.flutterRoot = '../..';
+
+ final CreateCommand command = CreateCommand();
+ final CommandRunner runner = createTestCommandRunner(command);
+
+ await runner.run(['create', '--template=module', '--org', 'com.foo.bar','--ios-language=objc', '--project-name=my_project', projectDir.path]);
+
+ final String plistPath = globals.fs.path.join('.ios', 'Runner', 'Info.plist');
+ final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath));
+ expect(plistFile, exists);
+ final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance');
+ expect(viewControllerBasedStatusBarAppearance, true);
+ }, overrides: {
+ Pub: () => Pub(
+ fileSystem: globals.fs,
+ logger: globals.logger,
+ processManager: globals.processManager,
+ usage: globals.flutterUsage,
+ botDetector: globals.botDetector,
+ platform: globals.platform,
+ ),
+ });
+
+ testUsingContext('UIViewControllerBasedStatusBarAppearance is YES for swift iOS module.', () async {
+ Cache.flutterRoot = '../..';
+
+ final CreateCommand command = CreateCommand();
+ final CommandRunner runner = createTestCommandRunner(command);
+
+ await runner.run(['create', '--template=module', '--org', 'com.foo.bar','--ios-language=swift', '--project-name=my_project', projectDir.path]);
+
+ final String plistPath = globals.fs.path.join('.ios', 'Runner', 'Info.plist');
+ final File plistFile = globals.fs.file(globals.fs.path.join(projectDir.path, plistPath));
+ expect(plistFile, exists);
+ final bool viewControllerBasedStatusBarAppearance = _getBooleanValueFromPlist(plistFile: plistFile, key: 'UIViewControllerBasedStatusBarAppearance');
+ expect(viewControllerBasedStatusBarAppearance, true);
+ }, overrides: {
+ Pub: () => Pub(
+ fileSystem: globals.fs,
+ logger: globals.logger,
+ processManager: globals.processManager,
+ usage: globals.flutterUsage,
+ botDetector: globals.botDetector,
+ platform: globals.platform,
+ ),
+ });
+
testUsingContext('display name is Title Case for objc iOS project.', () async {
Cache.flutterRoot = '../..';
@@ -2973,3 +3051,10 @@ String _getStringValueFromPlist({File plistFile, String key}) {
assert(keyIndex > 0);
return plist[keyIndex+1].replaceAll('', '').replaceAll('', '');
}
+
+bool _getBooleanValueFromPlist({File plistFile, String key}) {
+ final List plist = plistFile.readAsLinesSync().map((String line) => line.trim()).toList();
+ final int keyIndex = plist.indexOf('$key');
+ assert(keyIndex > 0);
+ return plist[keyIndex+1].replaceAll('<', '').replaceAll('/>', '') == 'true';
+}