Check Xcode build setting FULL_PRODUCT_NAME for the name of the built app during flutter run (#46928)
diff --git a/dev/devicelab/bin/tasks/module_test_ios.dart b/dev/devicelab/bin/tasks/module_test_ios.dart index 7456149..a0a57c4 100644 --- a/dev/devicelab/bin/tasks/module_test_ios.dart +++ b/dev/devicelab/bin/tasks/module_test_ios.dart
@@ -44,7 +44,7 @@ 'build', 'ios', 'iphoneos', - 'Runner.app', + 'hello.app', )); if (!exists(ephemeralReleaseHostApp)) { @@ -84,7 +84,7 @@ 'build', 'ios', 'iphoneos', - 'Runner.app', + 'hello.app', )); if (!exists(ephemeralProfileHostApp)) { @@ -123,7 +123,7 @@ 'build', 'ios', 'iphonesimulator', - 'Runner.app', + 'hello.app', )); if (!exists(ephemeralDebugHostApp)) { @@ -178,7 +178,7 @@ 'build', 'ios', 'iphoneos', - 'Runner.app', + 'hello.app', ))); if (!ephemeralHostAppWithCocoaPodsBuilt) { @@ -223,7 +223,7 @@ 'build', 'ios', 'iphoneos', - 'Runner.app', + 'hello.app', ))); if (!editableHostAppBuilt) {
diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart index fc3c57a..21ba0d4 100644 --- a/dev/devicelab/lib/tasks/perf_tests.dart +++ b/dev/devicelab/lib/tasks/perf_tests.dart
@@ -402,7 +402,7 @@ watch.start(); await flutter('build', options: options); watch.stop(); - final String appPath = '$cwd/build/ios/Release-iphoneos/Runner.app/'; + final String appPath = '$cwd/build/ios/Release-iphoneos/sample_flutter_app.app/'; // IPAs are created manually, https://flutter.dev/ios-release/ await exec('tar', <String>['-zcf', 'build/app.ipa', appPath]); releaseSizeInBytes = await file('$cwd/build/app.ipa').length();
diff --git a/packages/flutter_tools/bin/xcode_backend.sh b/packages/flutter_tools/bin/xcode_backend.sh index 7f5bb86..b6a1de6 100755 --- a/packages/flutter_tools/bin/xcode_backend.sh +++ b/packages/flutter_tools/bin/xcode_backend.sh
@@ -341,7 +341,6 @@ local framework_dir="$1" shift - local plist_path="${framework_dir}/Info.plist" local executable="$(GetFrameworkExecutablePath "${framework_dir}")" LipoExecutable "${executable}" "$@" } @@ -374,7 +373,7 @@ # Embed App.framework from Flutter into the app (after creating the Frameworks directory # if it doesn't already exist). - local xcode_frameworks_dir=${BUILT_PRODUCTS_DIR}"/"${PRODUCT_NAME}".app/Frameworks" + local xcode_frameworks_dir=${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH} RunCommand mkdir -p -- "${xcode_frameworks_dir}" RunCommand cp -Rv -- "${flutter_ios_out_folder}/App.framework" "${xcode_frameworks_dir}"
diff --git a/packages/flutter_tools/lib/src/application_package.dart b/packages/flutter_tools/lib/src/application_package.dart index b0e1f47..7db7a2f 100644 --- a/packages/flutter_tools/lib/src/application_package.dart +++ b/packages/flutter_tools/lib/src/application_package.dart
@@ -358,18 +358,21 @@ } class BuildableIOSApp extends IOSApp { - BuildableIOSApp(this.project, String projectBundleId) + BuildableIOSApp(this.project, String projectBundleId, this._hostAppBundleName) : super(projectBundleId: projectBundleId); static Future<BuildableIOSApp> fromProject(IosProject project) async { final String projectBundleId = await project.productBundleIdentifier; - return BuildableIOSApp(project, projectBundleId); + final String hostAppBundleName = await project.hostAppBundleName; + return BuildableIOSApp(project, projectBundleId, hostAppBundleName); } final IosProject project; + final String _hostAppBundleName; + @override - String get name => project.hostAppBundleName; + String get name => _hostAppBundleName; @override String get simulatorBundlePath => _buildAppPath('iphonesimulator'); @@ -378,7 +381,7 @@ String get deviceBundlePath => _buildAppPath('iphoneos'); String _buildAppPath(String type) { - return fs.path.join(getIosBuildDirectory(), type, name); + return fs.path.join(getIosBuildDirectory(), type, _hostAppBundleName); } }
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart index 3ac2ecb..5499e36 100644 --- a/packages/flutter_tools/lib/src/ios/mac.dart +++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -736,7 +736,7 @@ final Match match = oldAssets.firstMatch(line); if (match != null) { if (printedStatuses.add(match.group(1))) { - printStatus('Removing obsolete reference to ${match.group(1)} from ${project.hostAppBundleName}'); + printStatus('Removing obsolete reference to ${match.group(1)} from ${project.xcodeProject?.basename}'); } } else { buffer.writeln(line);
diff --git a/packages/flutter_tools/lib/src/ios/simulators.dart b/packages/flutter_tools/lib/src/ios/simulators.dart index 7f24d01..fe6b6ad 100644 --- a/packages/flutter_tools/lib/src/ios/simulators.dart +++ b/packages/flutter_tools/lib/src/ios/simulators.dart
@@ -622,9 +622,8 @@ } // Match the log prefix (in order to shorten it): - // * Xcode 8: Sep 13 15:28:51 cbracken-macpro localhost Runner[37195]: (Flutter) Observatory listening on http://127.0.0.1:57701/ - // * Xcode 9: 2017-09-13 15:26:57.228948-0700 localhost Runner[37195]: (Flutter) Observatory listening on http://127.0.0.1:57701/ - static final RegExp _mapRegex = RegExp(r'\S+ +\S+ +\S+ +(\S+ +)?(\S+)\[\d+\]\)?: (\(.*?\))? *(.*)$'); + // * Xcode 9: 2017-09-13 15:26:57.228948-0700 localhost My App[37195]: (Flutter) Observatory listening on http://127.0.0.1:57701/ + static final RegExp _mapRegex = RegExp(r'\S+ +\S+ +(?:\S+) (.+?(?=\[))\[\d+\]\)?: (\(.*?\))? *(.*)$'); // Jan 31 19:23:28 --- last message repeated 1 time --- static final RegExp _lastMessageSingleRegex = RegExp(r'\S+ +\S+ +\S+ --- last message repeated 1 time ---$'); @@ -635,9 +634,9 @@ String _filterDeviceLine(String string) { final Match match = _mapRegex.matchAsPrefix(string); if (match != null) { - final String category = match.group(2); - final String tag = match.group(3); - final String content = match.group(4); + final String category = match.group(1); + final String tag = match.group(2); + final String content = match.group(3); // Filter out non-Flutter originated noise from the engine. if (_appName != null && category != _appName) {
diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 798caa7..5e264c6 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart
@@ -309,7 +309,7 @@ static final RegExp _productBundleIdPattern = RegExp(r'''^\s*PRODUCT_BUNDLE_IDENTIFIER\s*=\s*(["']?)(.*?)\1;\s*$'''); static const String _productBundleIdVariable = r'$(PRODUCT_BUNDLE_IDENTIFIER)'; - static const String _hostAppBundleName = 'Runner'; + static const String _hostAppProjectName = 'Runner'; Directory get ephemeralDirectory => parent.directory.childDirectory('.ios'); Directory get _editableDirectory => parent.directory.childDirectory('ios'); @@ -330,9 +330,6 @@ /// a Flutter module with an editable host app. Directory get _flutterLibRoot => isModule ? ephemeralDirectory : _editableDirectory; - /// The bundle name of the host app, `Runner.app`. - String get hostAppBundleName => '$_hostAppBundleName.app'; - /// True, if the parent Flutter project is a module project. bool get isModule => parent.isModule; @@ -355,19 +352,19 @@ File get podManifestLock => hostAppRoot.childDirectory('Pods').childFile('Manifest.lock'); /// The 'Info.plist' file of the host app. - File get hostInfoPlist => hostAppRoot.childDirectory(_hostAppBundleName).childFile('Info.plist'); + File get hostInfoPlist => hostAppRoot.childDirectory(_hostAppProjectName).childFile('Info.plist'); @override Directory get symlinks => _flutterLibRoot.childDirectory('.symlinks'); @override - Directory get xcodeProject => hostAppRoot.childDirectory('$_hostAppBundleName.xcodeproj'); + Directory get xcodeProject => hostAppRoot.childDirectory('$_hostAppProjectName.xcodeproj'); @override File get xcodeProjectInfoFile => xcodeProject.childFile('project.pbxproj'); @override - Directory get xcodeWorkspace => hostAppRoot.childDirectory('$_hostAppBundleName.xcworkspace'); + Directory get xcodeWorkspace => hostAppRoot.childDirectory('$_hostAppProjectName.xcworkspace'); /// Xcode workspace shared data directory for the host app. Directory get xcodeWorkspaceSharedData => xcodeWorkspace.childDirectory('xcshareddata'); @@ -408,6 +405,26 @@ return null; } + /// The bundle name of the host app, `My App.app`. + Future<String> get hostAppBundleName async { + // The product name and bundle name are derived from the display name, which the user + // is instructed to change in Xcode as part of deploying to the App Store. + // https://flutter.dev/docs/deployment/ios#review-xcode-project-settings + // It may be expensive, but the only source of truth for the name is + // Xcode's interpretation of the build settings. + String productName; + if (xcode.xcodeProjectInterpreter.isInstalled) { + final Map<String, String> xcodeBuildSettings = await buildSettings; + if (xcodeBuildSettings != null) { + productName = xcodeBuildSettings['FULL_PRODUCT_NAME']; + } + } + if (productName == null) { + printTrace('FULL_PRODUCT_NAME not present, defaulting to $_hostAppProjectName'); + } + return productName ?? '$_hostAppProjectName.app'; + } + /// The build settings for the host app of this project, as a detached map. /// /// Returns null, if iOS tooling is unavailable. @@ -415,11 +432,16 @@ if (!xcode.xcodeProjectInterpreter.isInstalled) { return null; } - _buildSettings ??= await xcode.xcodeProjectInterpreter.getBuildSettings( + Map<String, String> buildSettings = _buildSettings; + buildSettings ??= await xcode.xcodeProjectInterpreter.getBuildSettings( xcodeProject.path, - _hostAppBundleName, + _hostAppProjectName, ); - return _buildSettings; + if (buildSettings != null && buildSettings.isNotEmpty) { + // No timeouts, flakes, or errors. + _buildSettings = buildSettings; + } + return buildSettings; } Map<String, String> _buildSettings; @@ -498,7 +520,7 @@ Directory get pluginRegistrantHost { return isModule ? _flutterLibRoot.childDirectory('Flutter').childDirectory('FlutterPluginRegistrant') - : hostAppRoot.childDirectory(_hostAppBundleName); + : hostAppRoot.childDirectory(_hostAppProjectName); } void _overwriteFromTemplate(String path, Directory target) { @@ -759,7 +781,7 @@ @override final FlutterProject parent; - static const String _hostAppBundleName = 'Runner'; + static const String _hostAppProjectName = 'Runner'; @override bool existsSync() => _macOSDirectory.existsSync(); @@ -803,13 +825,13 @@ File get podManifestLock => _macOSDirectory.childDirectory('Pods').childFile('Manifest.lock'); @override - Directory get xcodeProject => _macOSDirectory.childDirectory('$_hostAppBundleName.xcodeproj'); + Directory get xcodeProject => _macOSDirectory.childDirectory('$_hostAppProjectName.xcodeproj'); @override File get xcodeProjectInfoFile => xcodeProject.childFile('project.pbxproj'); @override - Directory get xcodeWorkspace => _macOSDirectory.childDirectory('$_hostAppBundleName.xcworkspace'); + Directory get xcodeWorkspace => _macOSDirectory.childDirectory('$_hostAppProjectName.xcworkspace'); @override Directory get symlinks => ephemeralDirectory.childDirectory('.symlinks');
diff --git a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl index 2af7139..a79e449 100644 --- a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl +++ b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/project.pbxproj.tmpl
@@ -46,7 +46,7 @@ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146EE1CF9000F007C117D /* {{projectName}}.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "{{projectName}}.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; @@ -93,7 +93,7 @@ 97C146EF1CF9000F007C117D /* Products */ = { isa = PBXGroup; children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, + 97C146EE1CF9000F007C117D /* {{projectName}}.app */, ); name = Products; sourceTree = "<group>"; @@ -142,7 +142,7 @@ ); name = Runner; productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productReference = 97C146EE1CF9000F007C117D /* {{projectName}}.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -324,7 +324,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -454,7 +454,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -477,7 +477,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release;
diff --git a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl similarity index 93% rename from packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme rename to packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl index a28140c..cef7761 100644 --- a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl
@@ -15,7 +15,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -33,7 +33,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -56,7 +56,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -75,7 +75,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference>
diff --git a/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl index 39085ce..3b35346 100644 --- a/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl +++ b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/project.pbxproj.tmpl
@@ -45,7 +45,7 @@ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; }; 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146EE1CF9000F007C117D /* {{projectName}}.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "{{projectName}}.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; @@ -90,7 +90,7 @@ 97C146EF1CF9000F007C117D /* Products */ = { isa = PBXGroup; children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, + 97C146EE1CF9000F007C117D /* {{projectName}}.app */, ); name = Products; sourceTree = "<group>"; @@ -138,7 +138,7 @@ ); name = Runner; productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productReference = 97C146EE1CF9000F007C117D /* {{projectName}}.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -321,7 +321,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -455,7 +455,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -482,7 +482,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic";
diff --git a/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140c..0000000 --- a/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null
@@ -1,91 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Scheme - LastUpgradeVersion = "1020" - version = "1.3"> - <BuildAction - parallelizeBuildables = "YES" - buildImplicitDependencies = "YES"> - <BuildActionEntries> - <BuildActionEntry - buildForTesting = "YES" - buildForRunning = "YES" - buildForProfiling = "YES" - buildForArchiving = "YES" - buildForAnalyzing = "YES"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </BuildActionEntry> - </BuildActionEntries> - </BuildAction> - <TestAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> - <Testables> - </Testables> - <MacroExpansion> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </MacroExpansion> - <AdditionalOptions> - </AdditionalOptions> - </TestAction> - <LaunchAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - launchStyle = "0" - useCustomWorkingDirectory = "NO" - ignoresPersistentStateOnLaunch = "NO" - debugDocumentVersioning = "YES" - debugServiceExtension = "internal" - allowLocationSimulation = "YES"> - <BuildableProductRunnable - runnableDebuggingMode = "0"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </BuildableProductRunnable> - <AdditionalOptions> - </AdditionalOptions> - </LaunchAction> - <ProfileAction - buildConfiguration = "Profile" - shouldUseLaunchSchemeArgsEnv = "YES" - savedToolIdentifier = "" - useCustomWorkingDirectory = "NO" - debugDocumentVersioning = "YES"> - <BuildableProductRunnable - runnableDebuggingMode = "0"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </BuildableProductRunnable> - </ProfileAction> - <AnalyzeAction - buildConfiguration = "Debug"> - </AnalyzeAction> - <ArchiveAction - buildConfiguration = "Release" - revealArchiveInOrganizer = "YES"> - </ArchiveAction> -</Scheme>
diff --git a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl similarity index 93% copy from packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme copy to packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl index a28140c..cef7761 100644 --- a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/flutter_tools/templates/app/ios-swift.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl
@@ -15,7 +15,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -33,7 +33,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -56,7 +56,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -75,7 +75,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference>
diff --git a/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140c..0000000 --- a/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null
@@ -1,91 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Scheme - LastUpgradeVersion = "1020" - version = "1.3"> - <BuildAction - parallelizeBuildables = "YES" - buildImplicitDependencies = "YES"> - <BuildActionEntries> - <BuildActionEntry - buildForTesting = "YES" - buildForRunning = "YES" - buildForProfiling = "YES" - buildForArchiving = "YES" - buildForAnalyzing = "YES"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </BuildActionEntry> - </BuildActionEntries> - </BuildAction> - <TestAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> - <Testables> - </Testables> - <MacroExpansion> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </MacroExpansion> - <AdditionalOptions> - </AdditionalOptions> - </TestAction> - <LaunchAction - buildConfiguration = "Debug" - selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" - selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - launchStyle = "0" - useCustomWorkingDirectory = "NO" - ignoresPersistentStateOnLaunch = "NO" - debugDocumentVersioning = "YES" - debugServiceExtension = "internal" - allowLocationSimulation = "YES"> - <BuildableProductRunnable - runnableDebuggingMode = "0"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </BuildableProductRunnable> - <AdditionalOptions> - </AdditionalOptions> - </LaunchAction> - <ProfileAction - buildConfiguration = "Profile" - shouldUseLaunchSchemeArgsEnv = "YES" - savedToolIdentifier = "" - useCustomWorkingDirectory = "NO" - debugDocumentVersioning = "YES"> - <BuildableProductRunnable - runnableDebuggingMode = "0"> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" - BlueprintName = "Runner" - ReferencedContainer = "container:Runner.xcodeproj"> - </BuildableReference> - </BuildableProductRunnable> - </ProfileAction> - <AnalyzeAction - buildConfiguration = "Debug"> - </AnalyzeAction> - <ArchiveAction - buildConfiguration = "Release" - revealArchiveInOrganizer = "YES"> - </ArchiveAction> -</Scheme>
diff --git a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl similarity index 93% copy from packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme copy to packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl index a28140c..cef7761 100644 --- a/packages/flutter_tools/templates/app/ios-objc.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/flutter_tools/templates/app/ios.tmpl/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme.tmpl
@@ -15,7 +15,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -33,7 +33,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -56,7 +56,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -75,7 +75,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference>
diff --git a/packages/flutter_tools/templates/app/ios.tmpl/Runner/Info.plist.tmpl b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Info.plist.tmpl index d9bd8c7..9e7e9ed 100644 --- a/packages/flutter_tools/templates/app/ios.tmpl/Runner/Info.plist.tmpl +++ b/packages/flutter_tools/templates/app/ios.tmpl/Runner/Info.plist.tmpl
@@ -11,7 +11,7 @@ <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> - <string>{{projectName}}</string> + <string>$(PRODUCT_NAME)</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key>
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 d9bd8c7..9e7e9ed 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
@@ -11,7 +11,7 @@ <key>CFBundleInfoDictionaryVersion</key> <string>6.0</string> <key>CFBundleName</key> - <string>{{projectName}}</string> + <string>$(PRODUCT_NAME)</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key>
diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl index abbd314..0531643 100644 --- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl +++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/project.pbxproj.tmpl
@@ -319,7 +319,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; @@ -447,7 +447,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; @@ -470,7 +470,7 @@ "$(PROJECT_DIR)/Flutter", ); PRODUCT_BUNDLE_IDENTIFIER = {{iosIdentifier}}; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = "{{projectName}}"; VERSIONING_SYSTEM = "apple-generic"; }; name = Release;
diff --git a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme.tmpl similarity index 93% rename from packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme rename to packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme.tmpl index 04a869b..ed7102c 100644 --- a/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/flutter_tools/templates/module/ios/host_app_ephemeral/Runner.xcodeproj.tmpl/xcshareddata/xcschemes/Runner.xcscheme.tmpl
@@ -15,7 +15,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -33,7 +33,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -56,7 +56,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference> @@ -75,7 +75,7 @@ <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "97C146ED1CF9000F007C117D" - BuildableName = "Runner.app" + BuildableName = "{{projectName}}.app" BlueprintName = "Runner" ReferencedContainer = "container:Runner.xcodeproj"> </BuildableReference>
diff --git a/packages/flutter_tools/test/general.shard/ios/devices_test.dart b/packages/flutter_tools/test/general.shard/ios/devices_test.dart index f584891..270a02c 100644 --- a/packages/flutter_tools/test/general.shard/ios/devices_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/devices_test.dart
@@ -20,6 +20,7 @@ import 'package:flutter_tools/src/ios/devices.dart'; import 'package:flutter_tools/src/ios/mac.dart'; import 'package:flutter_tools/src/ios/ios_workflow.dart'; +import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; import 'package:flutter_tools/src/mdns_discovery.dart'; import 'package:flutter_tools/src/project.dart'; @@ -575,23 +576,32 @@ Cache.flutterRoot = '../..'; final CreateCommand command = CreateCommand(); final CommandRunner<void> runner = createTestCommandRunner(command); - await runner.run(<String>[ - 'create', - '--no-pub', - projectDir.path, - ]); + + FakeAsync().run((FakeAsync time) { + runner.run(<String>[ + 'create', + '--no-pub', + projectDir.path, + ]); + time.flushMicrotasks(); + time.elapse(const Duration(seconds: 65)); + }); if (additionalSetup != null) { additionalSetup(); } - final IOSApp app = await AbsoluteBuildableIOSApp.fromProject( - FlutterProject.fromDirectory(projectDir).ios); + final IOSApp app = AbsoluteBuildableIOSApp( + FlutterProject.fromDirectory(projectDir).ios, + 'io.flutter.flutter.app', + 'My Super Awesome App.app', + ); + final IOSDevice device = IOSDevice('123'); // Pre-create the expected build products. targetBuildDir.createSync(recursive: true); - projectDir.childDirectory('build/ios/iphoneos/Runner.app').createSync(recursive: true); + projectDir.childDirectory('build/ios/iphoneos/My Super Awesome App.app').createSync(recursive: true); final Completer<LaunchResult> completer = Completer<LaunchResult>(); FakeAsync().run((FakeAsync time) { @@ -620,6 +630,7 @@ IOSDeploy: () => mockIosDeploy, Platform: () => macPlatform, ProcessManager: () => mockProcessManager, + XcodeProjectInterpreter: () => FakeWithBuildSettingsXcodeProjectInterpreter(), }); } @@ -865,11 +876,11 @@ when(mockIMobileDevice.startLogger('123456')).thenAnswer((Invocation invocation) { final Process mockProcess = MockProcess( stdout: Stream<List<int>>.fromIterable(<List<int>>[''' -Runner(Flutter)[297] <Notice>: A is for ari -Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt MobileGestaltSupport.m:153: pid 123 (Runner) does not have sandbox access for frZQaeyWLUvLjeuEK43hmg and IS NOT appropriately entitled -Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt MobileGestalt.c:550: no access to InverseDeviceID (see <rdar://problem/11744455>) -Runner(Flutter)[297] <Notice>: I is for ichigo -Runner(UIKit)[297] <Notice>: E is for enpitsu" +My Super Awesome App(Flutter)[297] <Notice>: A is for ari +My Super Awesome App(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt MobileGestaltSupport.m:153: pid 123 (Runner) does not have sandbox access for frZQaeyWLUvLjeuEK43hmg and IS NOT appropriately entitled +My Super Awesome App(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt MobileGestalt.c:550: no access to InverseDeviceID (see <rdar://problem/11744455>) +My Super Awesome App(Flutter)[297] <Notice>: I is for ichigo +My Super Awesome App(UIKit)[297] <Notice>: E is for enpitsu" '''.codeUnits]) ); return Future<Process>.value(mockProcess); @@ -890,11 +901,11 @@ when(mockIMobileDevice.startLogger('123456')).thenAnswer((Invocation invocation) { final Process mockProcess = MockProcess( stdout: Stream<List<int>>.fromIterable(<List<int>>[''' -Runner(Flutter)[297] <Notice>: This is a multi-line message, +My Super Awesome App(Flutter)[297] <Notice>: This is a multi-line message, with another Flutter message following it. -Runner(Flutter)[297] <Notice>: This is a multi-line message, +My Super Awesome App(Flutter)[297] <Notice>: This is a multi-line message, with a non-Flutter log message following it. -Runner(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt +My Super Awesome App(libsystem_asl.dylib)[297] <Notice>: libMobileGestalt '''.codeUnits]), ); return Future<Process>.value(mockProcess); @@ -963,13 +974,8 @@ } class AbsoluteBuildableIOSApp extends BuildableIOSApp { - AbsoluteBuildableIOSApp(IosProject project, String projectBundleId) : - super(project, projectBundleId); - - static Future<AbsoluteBuildableIOSApp> fromProject(IosProject project) async { - final String projectBundleId = await project.productBundleIdentifier; - return AbsoluteBuildableIOSApp(project, projectBundleId); - } + AbsoluteBuildableIOSApp(IosProject project, String projectBundleId, String hostAppBundleName) : + super(project, projectBundleId, hostAppBundleName); @override String get deviceBundlePath => @@ -994,3 +1000,31 @@ return _workflows; } } + +class FakeWithBuildSettingsXcodeProjectInterpreter extends XcodeProjectInterpreter { + @override + bool get isInstalled => true; + + @override + String get versionText => 'Xcode 10.2'; + + @override + int get majorVersion => 10; + + @override + int get minorVersion => 2; + + @override + void cleanWorkspace(String workspacePath, String scheme) { + } + + @override + Future<XcodeProjectInfo> getInfo(String projectPath, {String projectFilename}) async { + return XcodeProjectInfo( + <String>['Runner'], + <String>['Debug', 'Release'], + <String>['Runner'], + ); + } +} +
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 7a87dfa..0c5f40f 100644 --- a/packages/flutter_tools/test/general.shard/ios/mac_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/mac_test.dart
@@ -435,7 +435,7 @@ final MockFile pbxprojFile = MockFile(); when(project.xcodeProjectInfoFile).thenReturn(pbxprojFile); - when(project.hostAppBundleName).thenReturn('UnitTestRunner.app'); + when(project.hostAppBundleName).thenAnswer((_) => Future<String>.value('UnitTestRunner.app')); when(pbxprojFile.readAsLinesSync()) .thenAnswer((_) => flutterAssetPbxProjLines); when(pbxprojFile.existsSync())
diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart index 7eb77ef..9f8102d 100644 --- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart
@@ -344,9 +344,9 @@ when(mockProcess.stdout) .thenAnswer((Invocation invocation) { return Stream<List<int>>.fromIterable(<List<int>>[''' -2017-09-13 15:26:57.228948-0700 localhost Runner[37195]: (Flutter) Observatory listening on http://127.0.0.1:57701/ -2017-09-13 15:26:57.228948-0700 localhost Runner[37195]: (Flutter) )))))))))) -2017-09-13 15:26:57.228948-0700 localhost Runner[37195]: (Flutter) #0 Object.noSuchMethod (dart:core-patch/dart:core/object_patch.dart:46)''' +2017-09-13 15:26:57.228948-0700 localhost My Super Awesome App[37195]: (Flutter) Observatory listening on http://127.0.0.1:57701/ +2017-09-13 15:26:57.228948-0700 localhost My Super Awesome App[37195]: (Flutter) )))))))))) +2017-09-13 15:26:57.228948-0700 localhost My Super Awesome App[37195]: (Flutter) #0 Object.noSuchMethod (dart:core-patch/dart:core/object_patch.dart:46)''' .codeUnits]); }); when(mockProcess.stderr)
diff --git a/packages/flutter_tools/test/general.shard/project_test.dart b/packages/flutter_tools/test/general.shard/project_test.dart index c5b6805..ad2c3ba 100644 --- a/packages/flutter_tools/test/general.shard/project_test.dart +++ b/packages/flutter_tools/test/general.shard/project_test.dart
@@ -408,6 +408,39 @@ }); }); + group('application bundle name', () { + MemoryFileSystem fs; + MockXcodeProjectInterpreter mockXcodeProjectInterpreter; + setUp(() { + fs = MemoryFileSystem(); + mockXcodeProjectInterpreter = MockXcodeProjectInterpreter(); + }); + + testUsingContext('app product name defaults to Runner.app', () async { + final FlutterProject project = await someProject(); + expect(await project.ios.hostAppBundleName, 'Runner.app'); + }, overrides: <Type, Generator>{ + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + XcodeProjectInterpreter: () => mockXcodeProjectInterpreter + }); + + testUsingContext('app product name xcodebuild settings', () async { + final FlutterProject project = await someProject(); + when(mockXcodeProjectInterpreter.getBuildSettings(any, any)).thenAnswer((_) { + return Future<Map<String,String>>.value(<String, String>{ + 'FULL_PRODUCT_NAME': 'My App.app' + }); + }); + + expect(await project.ios.hostAppBundleName, 'My App.app'); + }, overrides: <Type, Generator>{ + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + XcodeProjectInterpreter: () => mockXcodeProjectInterpreter + }); + }); + group('organization names set', () { testInMemory('is empty, if project not created', () async { final FlutterProject project = await someProject();
diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart index 539f8ab..db191dc 100644 --- a/packages/flutter_tools/test/src/mocks.dart +++ b/packages/flutter_tools/test/src/mocks.dart
@@ -40,7 +40,7 @@ versionCode: 1, launchActivity: 'io.flutter.android.mock.MockActivity', ), - iOS: BuildableIOSApp(MockIosProject(), MockIosProject.bundleId), + iOS: BuildableIOSApp(MockIosProject(), MockIosProject.bundleId, MockIosProject.appBundleName), ); } @@ -519,12 +519,13 @@ class MockIosProject extends Mock implements IosProject { static const String bundleId = 'com.example.test'; + static const String appBundleName = 'My Super Awesome App.app'; @override Future<String> get productBundleIdentifier async => bundleId; @override - String get hostAppBundleName => 'Runner.app'; + Future<String> get hostAppBundleName async => appBundleName; } class MockAndroidDevice extends Mock implements AndroidDevice {