Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,26 @@ class AppBuilderIos extends AppBuilder {
@override
BuildResultResolver get resultResolver => BuildIosResultResolver();

String _buildSubcommand = 'ipa';

@override
String get buildSubcommand => 'ipa';
String get buildSubcommand => _buildSubcommand;

@override
Future<BuildResult> build({
required Map<String, dynamic> arguments,
Map<String, String>? environment,
}) {
if (!arguments.containsKey('export-options-plist') &&
!arguments.containsKey('export-method')) {
throw BuildError(
'Missing `export-options-plist` or `export-method` build argument.',
);
if (arguments.containsKey('no-codesign')) {
_buildSubcommand = 'ios';
} else {
_buildSubcommand = 'ipa';
if (!arguments.containsKey('export-options-plist') &&
!arguments.containsKey('export-method')) {
throw BuildError(
'Missing `export-options-plist` or `export-method` build argument.',
);
}
}
return super.build(
arguments: arguments,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ class BuildIosResultResolver extends BuildResultResolver {
@override
BuildResult resolve(BuildConfig config, {Duration? duration}) {
final r = BuildIosResult(config);
final String pattern = '${r.outputDirectory.path}/**.ipa';
final suffix = config.arguments.containsKey('no-codesign') ? 'app' : 'ipa';
final String pattern = '${r.outputDirectory.path}/**.$suffix';
List<FileSystemEntity> entities = Glob(pattern).listSync();
List<File> pkgFiles = (entities.map((e) => File(e.path)).toList())
..sort((a, b) => b.lastModifiedSync().compareTo(a.lastModifiedSync()));
Expand All @@ -23,7 +24,9 @@ class BuildIosResult extends BuildResult {

@override
Directory get outputDirectory {
String path = 'build/ios/ipa';
String path = config.arguments.containsKey('no-codesign')
? 'build/ios/iphoneos'
: 'build/ios/ipa';
return Directory(path);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:io';

import 'package:flutter_app_packager/src/api/app_package_maker.dart';
import 'package:shell_executor/shell_executor.dart';

class AppPackageMakerIpa extends AppPackageMaker {
@override
Expand All @@ -11,9 +12,35 @@ class AppPackageMakerIpa extends AppPackageMaker {
String get packageFormat => 'ipa';

@override
Future<MakeResult> make(MakeConfig config) {
File pkgFile = config.buildOutputFiles.first;
pkgFile.copySync(config.outputFile.path);
Future<MakeResult> make(MakeConfig config) async {
final pkgFile = config.buildOutputFiles.first;
final isApp = pkgFile.path.endsWith('.app');
if (isApp) {
// pkgFilePath build/ios/iphoneos/Runner.app
final iphoneosDirectory = pkgFile.parent;
final iosDirectory = iphoneosDirectory.parent;
final payloadDirectory = Directory('${iosDirectory.path}/Payload');
final ipaFile = File('${iphoneosDirectory.path}/Runner.ipa');
try {
await $('cp', ['-RH', iphoneosDirectory.path, payloadDirectory.path]);
await $(
'zip',
[
'-r9',
ipaFile.path.replaceFirst('${iosDirectory.path}/', ''),
'Payload',
],
workingDirectory: iosDirectory.path,
);
} catch (error) {
rethrow;
} finally {
payloadDirectory.deleteSync(recursive: true);
}
ipaFile.copySync(config.outputFile.path);
} else {
pkgFile.copySync(config.outputFile.path);
}
return Future.value(resultResolver.resolve(config));
}
}