Unverified Commit aab9a76e authored by Dan Field's avatar Dan Field Committed by GitHub

Revert "Allow any iOS app to be added to an existing host app (#70647)" (#70739)

This reverts commit abdd65fc.
parent abdd65fc
...@@ -17,437 +17,390 @@ Future<void> main() async { ...@@ -17,437 +17,390 @@ Future<void> main() async {
section('Create module project'); section('Create module project');
final Directory tempDir = Directory.systemTemp.createTempSync('flutter_module_test.'); final Directory tempDir = Directory.systemTemp.createTempSync('flutter_module_test.');
final Directory projectDir = Directory(path.join(tempDir.path, 'hello'));
try { try {
await inDirectory(tempDir, () async { await inDirectory(tempDir, () async {
section('Test module template');
final Directory moduleProjectDir =
Directory(path.join(tempDir.path, 'hello_module'));
await flutter( await flutter(
'create', 'create',
options: <String>['--org', 'io.flutter.devicelab', '--template', 'module', 'hello'],
);
});
section('Add plugins');
final File pubspec = File(path.join(projectDir.path, 'pubspec.yaml'));
String content = pubspec.readAsStringSync();
content = content.replaceFirst(
'\ndependencies:\n',
'\ndependencies:\n device_info: 0.4.1\n package_info: 0.4.0+9\n',
);
pubspec.writeAsStringSync(content, flush: true);
await inDirectory(projectDir, () async {
await flutter(
'packages',
options: <String>['get'],
);
});
// First, build the module in Debug to copy the debug version of Flutter.framework.
// This proves "flutter build ios-framework" re-copies the relevant Flutter.framework,
// otherwise building plugins with bitcode will fail linking because the debug version
// of Flutter.framework does not contain bitcode.
await inDirectory(projectDir, () async {
await flutter(
'build',
options: <String>[ options: <String>[
'--org', 'ios',
'io.flutter.devicelab', '--debug',
'--template', '--no-codesign',
'module',
'hello_module'
], ],
); );
});
await _testBuildIosFramework(moduleProjectDir, isModule: true); // This builds all build modes' frameworks by default
section('Build frameworks');
section('Test app template'); const String outputDirectoryName = 'flutter-frameworks';
final Directory projectDir = await inDirectory(projectDir, () async {
Directory(path.join(tempDir.path, 'hello_project'));
await flutter( await flutter(
'create', 'build',
options: <String>['--org', 'io.flutter.devicelab', 'hello_project'], options: <String>[
'ios-framework',
'--universal',
'--output=$outputDirectoryName'
],
); );
await _testBuildIosFramework(projectDir);
}); });
return TaskResult.success(null); final String outputPath = path.join(projectDir.path, outputDirectoryName);
} on TaskResult catch (taskResult) {
return taskResult;
} catch (e) {
return TaskResult.failure(e.toString());
} finally {
// rmTree(tempDir);
}
});
}
Future<void> _testBuildIosFramework(Directory projectDir, { bool isModule = false}) async { section('Check debug build has Dart snapshot as asset');
section('Add plugins');
final File pubspec = File(path.join(projectDir.path, 'pubspec.yaml'));
String content = pubspec.readAsStringSync();
content = content.replaceFirst(
'\ndependencies:\n',
'\ndependencies:\n device_info: 0.4.1\n package_info: 0.4.0+9\n',
);
pubspec.writeAsStringSync(content, flush: true);
await inDirectory(projectDir, () async {
await flutter(
'packages',
options: <String>['get'],
);
});
// First, build the module in Debug to copy the debug version of Flutter.framework. checkFileExists(path.join(
// This proves "flutter build ios-framework" re-copies the relevant Flutter.framework, outputPath,
// otherwise building plugins with bitcode will fail linking because the debug version 'Debug',
// of Flutter.framework does not contain bitcode. 'App.framework',
await inDirectory(projectDir, () async { 'flutter_assets',
await flutter( 'vm_snapshot_data',
'build', ));
options: <String>[
'ios',
'--debug',
'--no-codesign',
],
);
});
// This builds all build modes' frameworks by default section('Check debug build has no Dart AOT');
section('Build frameworks');
const String outputDirectoryName = 'flutter-frameworks'; // There's still an App.framework with a dylib, but it's empty.
checkFileExists(path.join(
outputPath,
'Debug',
'App.framework',
'App',
));
await inDirectory(projectDir, () async { final String debugAppFrameworkPath = path.join(
await flutter( outputPath,
'build', 'Debug',
options: <String>[ 'App.framework',
'ios-framework', 'App',
'--universal', );
'--output=$outputDirectoryName' final String aotSymbols = await dylibSymbols(debugAppFrameworkPath);
],
); if (aotSymbols.contains('architecture') ||
}); aotSymbols.contains('_kDartVmSnapshot')) {
throw TaskResult.failure('Debug App.framework contains AOT');
}
await _checkFrameworkArchs(debugAppFrameworkPath, 'Debug');
// Xcode changed the name of this generated directory in Xcode 12.
const String xcode11ArmDirectoryName = 'ios-armv7_arm64';
const String xcode12ArmDirectoryName = 'ios-arm64_armv7';
final String xcode11AppFrameworkDirectory = path.join(
outputPath,
'Debug',
'App.xcframework',
xcode11ArmDirectoryName,
'App.framework',
'App',
);
final String xcode12AppFrameworkDirectory = path.join(
outputPath,
'Debug',
'App.xcframework',
xcode12ArmDirectoryName,
'App.framework',
'App',
);
// This seemed easier than an explicit Xcode version check.
String xcodeArmDirectoryName;
if (exists(File(xcode11AppFrameworkDirectory))) {
xcodeArmDirectoryName = xcode11ArmDirectoryName;
} else if (exists(File(xcode12AppFrameworkDirectory))) {
xcodeArmDirectoryName = xcode12ArmDirectoryName;
} else {
throw const FileSystemException('Expected App.framework binary to exist.');
}
checkFileExists(path.join(
outputPath,
'Debug',
'App.xcframework',
'ios-x86_64-simulator',
'App.framework',
'App',
));
section('Check profile, release builds has Dart AOT dylib');
for (final String mode in <String>['Profile', 'Release']) {
final String appFrameworkPath = path.join(
outputPath,
mode,
'App.framework',
'App',
);
final String outputPath = path.join(projectDir.path, outputDirectoryName); await _checkFrameworkArchs(appFrameworkPath, mode);
await _checkBitcode(appFrameworkPath, mode);
section('Check debug build has Dart snapshot as asset');
checkFileExists(path.join(
outputPath,
'Debug',
'App.framework',
'flutter_assets',
'vm_snapshot_data',
));
section('Check debug build has no Dart AOT');
// There's still an App.framework with a dylib, but it's empty.
checkFileExists(path.join(
outputPath,
'Debug',
'App.framework',
'App',
));
final String debugAppFrameworkPath = path.join(
outputPath,
'Debug',
'App.framework',
'App',
);
final String aotSymbols = await dylibSymbols(debugAppFrameworkPath);
if (aotSymbols.contains('architecture') ||
aotSymbols.contains('_kDartVmSnapshot')) {
throw TaskResult.failure('Debug App.framework contains AOT');
}
await _checkFrameworkArchs(debugAppFrameworkPath, 'Debug');
// Xcode changed the name of this generated directory in Xcode 12.
const String xcode11ArmDirectoryName = 'ios-armv7_arm64';
const String xcode12ArmDirectoryName = 'ios-arm64_armv7';
final String xcode11AppFrameworkDirectory = path.join(
outputPath,
'Debug',
'App.xcframework',
xcode11ArmDirectoryName,
'App.framework',
'App',
);
final String xcode12AppFrameworkDirectory = path.join(
outputPath,
'Debug',
'App.xcframework',
xcode12ArmDirectoryName,
'App.framework',
'App',
);
// This seemed easier than an explicit Xcode version check.
String xcodeArmDirectoryName;
if (exists(File(xcode11AppFrameworkDirectory))) {
xcodeArmDirectoryName = xcode11ArmDirectoryName;
} else if (exists(File(xcode12AppFrameworkDirectory))) {
xcodeArmDirectoryName = xcode12ArmDirectoryName;
} else {
throw const FileSystemException('Expected App.framework binary to exist.');
}
checkFileExists(path.join( final String aotSymbols = await dylibSymbols(appFrameworkPath);
outputPath,
'Debug',
'App.xcframework',
'ios-x86_64-simulator',
'App.framework',
'App',
));
section('Check profile, release builds has Dart AOT dylib'); if (!aotSymbols.contains('_kDartVmSnapshot')) {
throw TaskResult.failure('$mode App.framework missing Dart AOT');
}
for (final String mode in <String>['Profile', 'Release']) { checkFileNotExists(path.join(
final String appFrameworkPath = path.join( outputPath,
outputPath, mode,
mode, 'App.framework',
'App.framework', 'flutter_assets',
'App', 'vm_snapshot_data',
); ));
await _checkFrameworkArchs(appFrameworkPath, mode); checkFileExists(path.join(
await _checkBitcode(appFrameworkPath, mode); outputPath,
mode,
'App.xcframework',
xcodeArmDirectoryName,
'App.framework',
'App',
));
checkFileNotExists(path.join(
outputPath,
mode,
'App.xcframework',
'ios-x86_64-simulator',
'App.framework',
'App',
));
}
section("Check all modes' engine dylib");
for (final String mode in <String>['Debug', 'Profile', 'Release']) {
final String engineFrameworkPath = path.join(
outputPath,
mode,
'Flutter.framework',
'Flutter',
);
final String aotSymbols = await dylibSymbols(appFrameworkPath); await _checkFrameworkArchs(engineFrameworkPath, mode);
await _checkBitcode(engineFrameworkPath, mode);
if (!aotSymbols.contains('_kDartVmSnapshot')) { checkFileExists(path.join(
throw TaskResult.failure('$mode App.framework missing Dart AOT'); outputPath,
} mode,
'Flutter.xcframework',
xcodeArmDirectoryName,
'Flutter.framework',
'Flutter',
));
final String simulatorFrameworkPath = path.join(
outputPath,
mode,
'Flutter.xcframework',
'ios-x86_64-simulator',
'Flutter.framework',
'Flutter',
);
if (mode == 'Debug') {
checkFileExists(simulatorFrameworkPath);
} else {
checkFileNotExists(simulatorFrameworkPath);
}
}
checkFileNotExists(path.join( section("Check all modes' engine header");
outputPath,
mode,
'App.framework',
'flutter_assets',
'vm_snapshot_data',
));
checkFileExists(path.join(
outputPath,
mode,
'App.xcframework',
xcodeArmDirectoryName,
'App.framework',
'App',
));
checkFileNotExists(path.join(
outputPath,
mode,
'App.xcframework',
'ios-x86_64-simulator',
'App.framework',
'App',
));
}
section("Check all modes' engine dylib"); for (final String mode in <String>['Debug', 'Profile', 'Release']) {
checkFileExists(path.join(outputPath, mode, 'Flutter.framework', 'Headers', 'Flutter.h'));
for (final String mode in <String>['Debug', 'Profile', 'Release']) { }
final String engineFrameworkPath = path.join(
outputPath,
mode,
'Flutter.framework',
'Flutter',
);
await _checkFrameworkArchs(engineFrameworkPath, mode);
await _checkBitcode(engineFrameworkPath, mode);
checkFileExists(path.join(
outputPath,
mode,
'Flutter.xcframework',
xcodeArmDirectoryName,
'Flutter.framework',
'Flutter',
));
final String simulatorFrameworkPath = path.join(
outputPath,
mode,
'Flutter.xcframework',
'ios-x86_64-simulator',
'Flutter.framework',
'Flutter',
);
if (mode == 'Debug') {
checkFileExists(simulatorFrameworkPath);
} else {
checkFileNotExists(simulatorFrameworkPath);
}
}
section("Check all modes' engine header"); section('Check all modes have plugins');
for (final String mode in <String>['Debug', 'Profile', 'Release']) { for (final String mode in <String>['Debug', 'Profile', 'Release']) {
checkFileExists(path.join(outputPath, mode, 'Flutter.framework', 'Headers', 'Flutter.h')); final String pluginFrameworkPath = path.join(
} outputPath,
mode,
'device_info.framework',
'device_info',
);
await _checkFrameworkArchs(pluginFrameworkPath, mode);
await _checkBitcode(pluginFrameworkPath, mode);
section('Check all modes have plugins'); checkFileExists(path.join(
outputPath,
for (final String mode in <String>['Debug', 'Profile', 'Release']) { mode,
final String pluginFrameworkPath = path.join( 'device_info.xcframework',
outputPath, xcodeArmDirectoryName,
mode, 'device_info.framework',
'device_info.framework', 'device_info',
'device_info', ));
);
await _checkFrameworkArchs(pluginFrameworkPath, mode); checkFileExists(path.join(
await _checkBitcode(pluginFrameworkPath, mode); outputPath,
mode,
checkFileExists(path.join( 'device_info.xcframework',
outputPath, xcodeArmDirectoryName,
mode, 'device_info.framework',
'device_info.xcframework', 'Headers',
xcodeArmDirectoryName, 'DeviceInfoPlugin.h',
'device_info.framework', ));
'device_info',
)); final String simulatorFrameworkPath = path.join(
outputPath,
checkFileExists(path.join( mode,
outputPath, 'device_info.xcframework',
mode, 'ios-x86_64-simulator',
'device_info.xcframework', 'device_info.framework',
xcodeArmDirectoryName, 'device_info',
'device_info.framework', );
'Headers',
'DeviceInfoPlugin.h',
));
final String simulatorFrameworkPath = path.join(
outputPath,
mode,
'device_info.xcframework',
'ios-x86_64-simulator',
'device_info.framework',
'device_info',
);
final String simulatorFrameworkHeaderPath = path.join(
outputPath,
mode,
'device_info.xcframework',
'ios-x86_64-simulator',
'device_info.framework',
'Headers',
'DeviceInfoPlugin.h',
);
if (mode == 'Debug') {
checkFileExists(simulatorFrameworkPath);
checkFileExists(simulatorFrameworkHeaderPath);
} else {
checkFileNotExists(simulatorFrameworkPath);
checkFileNotExists(simulatorFrameworkHeaderPath);
}
}
section('Check all modes have generated plugin registrant'); final String simulatorFrameworkHeaderPath = path.join(
outputPath,
mode,
'device_info.xcframework',
'ios-x86_64-simulator',
'device_info.framework',
'Headers',
'DeviceInfoPlugin.h',
);
for (final String mode in <String>['Debug', 'Profile', 'Release']) { if (mode == 'Debug') {
if (!isModule) { checkFileExists(simulatorFrameworkPath);
continue; checkFileExists(simulatorFrameworkHeaderPath);
} } else {
final String registrantFrameworkPath = path.join( checkFileNotExists(simulatorFrameworkPath);
outputPath, checkFileNotExists(simulatorFrameworkHeaderPath);
mode, }
'FlutterPluginRegistrant.framework', }
'FlutterPluginRegistrant'
);
await _checkFrameworkArchs(registrantFrameworkPath, mode);
await _checkBitcode(registrantFrameworkPath, mode);
checkFileExists(path.join(
outputPath,
mode,
'FlutterPluginRegistrant.framework',
'Headers',
'GeneratedPluginRegistrant.h',
));
checkFileExists(path.join(
outputPath,
mode,
'FlutterPluginRegistrant.xcframework',
xcodeArmDirectoryName,
'FlutterPluginRegistrant.framework',
'Headers',
'GeneratedPluginRegistrant.h',
));
final String simulatorHeaderPath = path.join(
outputPath,
mode,
'FlutterPluginRegistrant.xcframework',
'ios-x86_64-simulator',
'FlutterPluginRegistrant.framework',
'Headers',
'GeneratedPluginRegistrant.h',
);
if (mode == 'Debug') {
checkFileExists(simulatorHeaderPath);
} else {
checkFileNotExists(simulatorHeaderPath);
}
}
// This builds all build modes' frameworks by default section('Check all modes have generated plugin registrant');
section('Build podspec');
for (final String mode in <String>['Debug', 'Profile', 'Release']) {
const String cocoapodsOutputDirectoryName = 'flutter-frameworks-cocoapods'; final String registrantFrameworkPath = path.join(
outputPath,
await inDirectory(projectDir, () async { mode,
await flutter( 'FlutterPluginRegistrant.framework',
'build', 'FlutterPluginRegistrant'
options: <String>[ );
'ios-framework',
'--cocoapods', await _checkFrameworkArchs(registrantFrameworkPath, mode);
'--universal', await _checkBitcode(registrantFrameworkPath, mode);
'--force', // Allow podspec creation on master.
'--output=$cocoapodsOutputDirectoryName' checkFileExists(path.join(
], outputPath,
); mode,
}); 'FlutterPluginRegistrant.framework',
'Headers',
'GeneratedPluginRegistrant.h',
));
checkFileExists(path.join(
outputPath,
mode,
'FlutterPluginRegistrant.xcframework',
xcodeArmDirectoryName,
'FlutterPluginRegistrant.framework',
'Headers',
'GeneratedPluginRegistrant.h',
));
final String simulatorHeaderPath = path.join(
outputPath,
mode,
'FlutterPluginRegistrant.xcframework',
'ios-x86_64-simulator',
'FlutterPluginRegistrant.framework',
'Headers',
'GeneratedPluginRegistrant.h',
);
if (mode == 'Debug') {
checkFileExists(simulatorHeaderPath);
} else {
checkFileNotExists(simulatorHeaderPath);
}
}
// This builds all build modes' frameworks by default
section('Build podspec');
const String cocoapodsOutputDirectoryName = 'flutter-frameworks-cocoapods';
await inDirectory(projectDir, () async {
await flutter(
'build',
options: <String>[
'ios-framework',
'--cocoapods',
'--universal',
'--force', // Allow podspec creation on master.
'--output=$cocoapodsOutputDirectoryName'
],
);
});
final String cocoapodsOutputPath = path.join(projectDir.path, cocoapodsOutputDirectoryName);
for (final String mode in <String>['Debug', 'Profile', 'Release']) {
checkFileExists(path.join(
cocoapodsOutputPath,
mode,
'Flutter.podspec',
));
checkDirectoryExists(path.join(
cocoapodsOutputPath,
mode,
'App.framework',
));
final String cocoapodsOutputPath = path.join(projectDir.path, cocoapodsOutputDirectoryName); checkDirectoryExists(path.join(
for (final String mode in <String>['Debug', 'Profile', 'Release']) {
checkFileExists(path.join(
cocoapodsOutputPath,
mode,
'Flutter.podspec',
));
checkDirectoryExists(path.join(
cocoapodsOutputPath,
mode,
'App.framework',
));
if (Directory(path.join(
cocoapodsOutputPath, cocoapodsOutputPath,
mode, mode,
'FlutterPluginRegistrant.framework', 'FlutterPluginRegistrant.framework',
)).existsSync() != ));
isModule) {
throw TaskResult.failure(
'Unexpected FlutterPluginRegistrant.framework.');
}
checkDirectoryExists(path.join( checkDirectoryExists(path.join(
cocoapodsOutputPath, cocoapodsOutputPath,
mode, mode,
'device_info.framework', 'device_info.framework',
)); ));
checkDirectoryExists(path.join(
cocoapodsOutputPath,
mode,
'package_info.framework',
));
}
if (File(path.join( checkDirectoryExists(path.join(
outputPath, cocoapodsOutputPath,
'GeneratedPluginRegistrant.h', mode,
)).existsSync() == 'package_info.framework',
isModule) { ));
throw TaskResult.failure('Unexpected GeneratedPluginRegistrant.h.'); }
}
if (File(path.join( return TaskResult.success(null);
outputPath, } on TaskResult catch (taskResult) {
'GeneratedPluginRegistrant.m', return taskResult;
)).existsSync() == } catch (e) {
isModule) { return TaskResult.failure(e.toString());
throw TaskResult.failure('Unexpected GeneratedPluginRegistrant.m.'); } finally {
} rmTree(tempDir);
}
});
} }
Future<void> _checkFrameworkArchs(String frameworkPath, String mode) async { Future<void> _checkFrameworkArchs(String frameworkPath, String mode) async {
......
...@@ -113,7 +113,7 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -113,7 +113,7 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
final String name = 'ios-framework'; final String name = 'ios-framework';
@override @override
final String description = 'Produces .frameworks for a Flutter project ' final String description = 'Produces a .framework directory for a Flutter module '
'and its plugins for integration into existing, plain Xcode projects.\n' 'and its plugins for integration into existing, plain Xcode projects.\n'
'This can only be run on macOS hosts.'; 'This can only be run on macOS hosts.';
...@@ -144,6 +144,10 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -144,6 +144,10 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
Future<void> validateCommand() async { Future<void> validateCommand() async {
await super.validateCommand(); await super.validateCommand();
_project = FlutterProject.current(); _project = FlutterProject.current();
if (!_project.isModule) {
throwToolExit('Building frameworks for iOS is only supported from a module.');
}
if (!_platform.isMacOS) { if (!_platform.isMacOS) {
throwToolExit('Building frameworks for iOS is only supported on the Mac.'); throwToolExit('Building frameworks for iOS is only supported on the Mac.');
} }
...@@ -174,7 +178,7 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -174,7 +178,7 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
} }
if (!_project.ios.existsSync()) { if (!_project.ios.existsSync()) {
throwToolExit('Project does not support iOS'); throwToolExit('Module does not support iOS');
} }
final Directory outputDirectory = globals.fs.directory(globals.fs.path.absolute(globals.fs.path.normalize(outputArgument))); final Directory outputDirectory = globals.fs.directory(globals.fs.path.absolute(globals.fs.path.normalize(outputArgument)));
...@@ -229,23 +233,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand { ...@@ -229,23 +233,6 @@ class BuildIOSFrameworkCommand extends BuildSubCommand {
} }
globals.printStatus('Frameworks written to ${outputDirectory.path}.'); globals.printStatus('Frameworks written to ${outputDirectory.path}.');
if (!_project.isModule && hasPlugins(_project)) {
// Apps do not generate a FlutterPluginRegistrant.framework. Users will need
// to copy the GeneratedPluginRegistrant class to their project manually.
final File pluginRegistrantHeader = _project.ios.pluginRegistrantHeader;
final File pluginRegistrantImplementation =
_project.ios.pluginRegistrantImplementation;
pluginRegistrantHeader.copySync(
outputDirectory.childFile(pluginRegistrantHeader.basename).path);
pluginRegistrantImplementation.copySync(outputDirectory
.childFile(pluginRegistrantImplementation.basename)
.path);
globals.printStatus(
'\nCopy the ${globals.fs.path.basenameWithoutExtension(pluginRegistrantHeader.path)} class into your project.\n'
'See https://flutter.dev/docs/development/add-to-app/ios/add-flutter-screen#create-a-flutterengine for more information.');
}
return FlutterCommandResult.success(); return FlutterCommandResult.success();
} }
...@@ -472,7 +459,6 @@ end ...@@ -472,7 +459,6 @@ end
xcodeBuildConfiguration, xcodeBuildConfiguration,
'SYMROOT=${iPhoneBuildOutput.path}', 'SYMROOT=${iPhoneBuildOutput.path}',
'BITCODE_GENERATION_MODE=$bitcodeGenerationMode', 'BITCODE_GENERATION_MODE=$bitcodeGenerationMode',
'ENABLE_BITCODE=YES', // Support host apps with bitcode enabled.
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures. 'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES', 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
]; ];
...@@ -497,7 +483,6 @@ end ...@@ -497,7 +483,6 @@ end
'-configuration', '-configuration',
xcodeBuildConfiguration, xcodeBuildConfiguration,
'SYMROOT=${simulatorBuildOutput.path}', 'SYMROOT=${simulatorBuildOutput.path}',
'ENABLE_BITCODE=YES', // Support host apps with bitcode enabled.
'ARCHS=x86_64', 'ARCHS=x86_64',
'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures. 'ONLY_ACTIVE_ARCH=NO', // No device targeted, so build all valid architectures.
'BUILD_LIBRARY_FOR_DISTRIBUTION=YES', 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES',
......
...@@ -897,24 +897,36 @@ Future<void> _writeIOSPluginRegistrant(FlutterProject project, List<Plugin> plug ...@@ -897,24 +897,36 @@ Future<void> _writeIOSPluginRegistrant(FlutterProject project, List<Plugin> plug
'framework': 'Flutter', 'framework': 'Flutter',
'plugins': iosPlugins, 'plugins': iosPlugins,
}; };
final String registryDirectory = project.ios.pluginRegistrantHost.path;
if (project.isModule) { if (project.isModule) {
final String registryDirectory = project.ios.pluginRegistrantHost.path; final String registryClassesDirectory = globals.fs.path.join(registryDirectory, 'Classes');
_renderTemplateToFile( _renderTemplateToFile(
_pluginRegistrantPodspecTemplate, _pluginRegistrantPodspecTemplate,
context, context,
globals.fs.path.join(registryDirectory, 'FlutterPluginRegistrant.podspec'), globals.fs.path.join(registryDirectory, 'FlutterPluginRegistrant.podspec'),
); );
_renderTemplateToFile(
_objcPluginRegistryHeaderTemplate,
context,
globals.fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.h'),
);
_renderTemplateToFile(
_objcPluginRegistryImplementationTemplate,
context,
globals.fs.path.join(registryClassesDirectory, 'GeneratedPluginRegistrant.m'),
);
} else {
_renderTemplateToFile(
_objcPluginRegistryHeaderTemplate,
context,
globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.h'),
);
_renderTemplateToFile(
_objcPluginRegistryImplementationTemplate,
context,
globals.fs.path.join(registryDirectory, 'GeneratedPluginRegistrant.m'),
);
} }
_renderTemplateToFile(
_objcPluginRegistryHeaderTemplate,
context,
project.ios.pluginRegistrantHeader.path,
);
_renderTemplateToFile(
_objcPluginRegistryImplementationTemplate,
context,
project.ios.pluginRegistrantImplementation.path,
);
} }
/// The relative path from a project's main CMake file to the plugin symlink /// The relative path from a project's main CMake file to the plugin symlink
......
...@@ -665,12 +665,15 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject { ...@@ -665,12 +665,15 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject {
) )
); );
if (framework.existsSync()) { if (framework.existsSync()) {
final Directory engineDest = ephemeralDirectory
.childDirectory('Flutter')
.childDirectory('engine');
final File podspec = framework.parent.childFile('Flutter.podspec'); final File podspec = framework.parent.childFile('Flutter.podspec');
globals.fsUtils.copyDirectorySync( globals.fsUtils.copyDirectorySync(
framework, framework,
engineCopyDirectory.childDirectory('Flutter.framework'), engineDest.childDirectory('Flutter.framework'),
); );
podspec.copySync(engineCopyDirectory.childFile('Flutter.podspec').path); podspec.copySync(engineDest.childFile('Flutter.podspec').path);
} }
} }
...@@ -701,22 +704,6 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject { ...@@ -701,22 +704,6 @@ class IosProject extends FlutterProjectPlatform implements XcodeBasedProject {
: hostAppRoot.childDirectory(_hostAppProjectName); : hostAppRoot.childDirectory(_hostAppProjectName);
} }
File get pluginRegistrantHeader {
final Directory registryDirectory = isModule ? pluginRegistrantHost.childDirectory('Classes') : pluginRegistrantHost;
return registryDirectory.childFile('GeneratedPluginRegistrant.h');
}
File get pluginRegistrantImplementation {
final Directory registryDirectory = isModule ? pluginRegistrantHost.childDirectory('Classes') : pluginRegistrantHost;
return registryDirectory.childFile('GeneratedPluginRegistrant.m');
}
Directory get engineCopyDirectory {
return isModule
? ephemeralDirectory.childDirectory('Flutter').childDirectory('engine')
: hostAppRoot.childDirectory('Flutter');
}
Future<void> _overwriteFromTemplate(String path, Directory target) async { Future<void> _overwriteFromTemplate(String path, Directory target) async {
final Template template = await Template.fromName( final Template template = await Template.fromName(
path, path,
......
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