diff --git a/lib/oto/commands/build/build_ios.dart b/lib/oto/commands/build/build_ios.dart index cca0171..b5408a5 100644 --- a/lib/oto/commands/build/build_ios.dart +++ b/lib/oto/commands/build/build_ios.dart @@ -33,7 +33,10 @@ class BuildiOS extends Command { await getMainXcodeprojPath(data.xcworkspaceFilePath!); /************ Auto find build number ************/ - var autoBuildNumber = (data.autoBuildNumber ?? false) ? !((version != null && version.isNotEmpty) || (buildNumber != null && buildNumber.isNotEmpty)) : false; + var autoBuildNumber = (data.autoBuildNumber ?? false) + ? !((version != null && version.isNotEmpty) || + (buildNumber != null && buildNumber.isNotEmpty)) + : false; if (autoBuildNumber) { var appID = await getAppIdentifier( data.workspace, xcodeproj, data.scheme, data.setAppID); @@ -44,7 +47,8 @@ class BuildiOS extends Command { throw Exception( 'If autoVersionNumber = true then must set apiKeyPath.'); } - var fastFile = await initializeFastlane(data.workspace!, data.apiKeyPath!, appID); + var fastFile = + await initializeFastlane(data.workspace!, data.apiKeyPath!, appID); var fastlaneContent = fastFile.readAsStringSync(); //Find PREPARE_FOR_SUBMISSION state Version @@ -55,7 +59,14 @@ class BuildiOS extends Command { var process = await ProcessExecutor.run(shell); var arr = process.stdout.toString().split('\n'); const result = '[RESULT]: '; - var needIncrementVersionState = ['WAITING_FOR_REVIEW', 'WAITING_FOR_REVIEW', 'IN_REVIEW', 'PENDING_DEVELOPER_RELEASE', 'PENDING_APPLE_RELEASE', 'REPLACED_WITH_NEW_VERSION']; + var needIncrementVersionState = [ + 'WAITING_FOR_REVIEW', + 'WAITING_FOR_REVIEW', + 'IN_REVIEW', + 'PENDING_DEVELOPER_RELEASE', + 'PENDING_APPLE_RELEASE', + 'REPLACED_WITH_NEW_VERSION' + ]; List jsonArr; String? readyForSaleVersion = null; for (var item in arr) { @@ -79,11 +90,11 @@ class BuildiOS extends Command { } } if (targetVersion == null) { - if(readyForSaleVersion != null) { + if (readyForSaleVersion != null) { targetVersion = incrementVersion(readyForSaleVersion); } else { throw Exception( - 'Can not find target version when state = PREPARE_FOR_SUBMISSION, PENDING_DEVELOPER_RELEASE'); + 'Can not find target version when state = PREPARE_FOR_SUBMISSION, PENDING_DEVELOPER_RELEASE'); } } version = targetVersion; @@ -102,14 +113,17 @@ class BuildiOS extends Command { if (item.contains(result)) { var json = jsonDecode(item.substring(item.indexOf(result) + result.length)); - targetBuildNumber = json['latest_build_number']; + var key = 'latest_build_number'; + if (json is Map && json.containsKey(key)) { + targetBuildNumber = json[key].toString(); + } break; } } if (targetBuildNumber == null) { throw Exception('Can not find target build number.'); } - buildNumber = incrementVersion(targetBuildNumber); + buildNumber = incrementVersion(targetBuildNumber, fixedLength: 4); } String? target = data.target; @@ -119,7 +133,8 @@ class BuildiOS extends Command { '${data.workspace}/$xcodeproj/project.pbxproj', version); } else { target = target ?? await getTargetXcodeproj(data.workspace!, xcodeproj!); - version = await getSettingXcodeproj(data.workspace!, xcodeproj!, target!, 'MARKETING_VERSION'); + version = await getSettingXcodeproj( + data.workspace!, xcodeproj!, target!, 'MARKETING_VERSION'); } //buildNumber가 있을경우 세팅, 없을경우 기존 버전값을 메모리에 가지고 있음 if (buildNumber != null && buildNumber.isNotEmpty) { @@ -127,12 +142,18 @@ class BuildiOS extends Command { '${data.workspace}/$xcodeproj/project.pbxproj', buildNumber); } else { target = target ?? await getTargetXcodeproj(data.workspace!, xcodeproj!); - buildNumber = await getSettingXcodeproj(data.workspace!, xcodeproj!, target!, 'CURRENT_PROJECT_VERSION'); + buildNumber = await getSettingXcodeproj( + data.workspace!, xcodeproj!, target!, 'CURRENT_PROJECT_VERSION'); } - var setVersion = data.setVersion != null && data.setVersion!.isNotEmpty ? data.setVersion! : '<@property.version>'; + var setVersion = data.setVersion != null && data.setVersion!.isNotEmpty + ? data.setVersion! + : '<@property.version>'; setProperty(setVersion, version); - var setBuildNumber = data.setBuildNumber != null && data.setBuildNumber!.isNotEmpty ? data.setBuildNumber! : '<@property.buildNumber>'; + var setBuildNumber = + data.setBuildNumber != null && data.setBuildNumber!.isNotEmpty + ? data.setBuildNumber! + : '<@property.buildNumber>'; setProperty(setBuildNumber, buildNumber); var os = 'iOS'; @@ -206,25 +227,26 @@ class BuildiOS extends Command { } } - static Future initializeFastlane(String workspace, String apiKeyPath, String appID) async { + static Future initializeFastlane( + String workspace, String apiKeyPath, String appID) async { var json = jsonDecode(File(apiKeyPath).readAsStringSync()); - var fastlaneContent = fastlaneTemplete; - fastlaneContent = fastlaneContent - .replaceFirst('[APP_IDENTIFIER]', appID) - .replaceFirst('[API_KEY_ID]', json['key_id']) - .replaceFirst('[API_ISSUER_ID]', json['issuer_id']) - .replaceFirst('[AUTH_KEY_CONTENT]', - json['key'].toString().replaceAll('\n', '\\n')); + var fastlaneContent = fastlaneTemplete; + fastlaneContent = fastlaneContent + .replaceFirst('[APP_IDENTIFIER]', appID) + .replaceFirst('[API_KEY_ID]', json['key_id']) + .replaceFirst('[API_ISSUER_ID]', json['issuer_id']) + .replaceFirst('[AUTH_KEY_CONTENT]', + json['key'].toString().replaceAll('\n', '\\n')); - var shell = StringBuffer(); - shell.write('cd $workspace'); - shell.write(' && rm -rf "$workspace/fastlane"'); - shell.write(' && yes | fastlane init'); - await ProcessExecutor.run(shell); + var shell = StringBuffer(); + shell.write('cd $workspace'); + shell.write(' && rm -rf "$workspace/fastlane"'); + shell.write(' && yes | fastlane init'); + await ProcessExecutor.run(shell); - var fastFile = File('$workspace/fastlane/Fastfile'); - fastFile.writeAsStringSync(fastlaneContent, flush: true); - return dataFutrue(fastFile); + var fastFile = File('$workspace/fastlane/Fastfile'); + fastFile.writeAsStringSync(fastlaneContent, flush: true); + return dataFutrue(fastFile); } Future getAppIdentifier(String? workspace, String? xcodeproj, @@ -337,16 +359,18 @@ class BuildiOS extends Command { await file.writeAsString(updatedLines.join('\n')); } - Future getSettingXcodeproj(String workspace, String xcodeproj, String target, String marker) async { + Future getSettingXcodeproj( + String workspace, String xcodeproj, String target, String marker) async { String? version; var shell = StringBuffer(); shell.write('cd $workspace'); - shell.write(' && xcodebuild -project $xcodeproj -target $target -showBuildSettings | grep $marker'); + shell.write( + ' && xcodebuild -project $xcodeproj -target $target -showBuildSettings | grep $marker'); var mark = '$marker = '; var process = await ProcessExecutor.run(shell); var arr = process.stdout.toString().split('\n'); - for(var item in arr) { + for (var item in arr) { if (item.contains(mark)) { version = item.replaceAll(mark, '').trim(); break; @@ -355,15 +379,17 @@ class BuildiOS extends Command { return dataFutrue(version); } - Future getTargetXcodeproj(String workspace, String xcoodeproj) async { + Future getTargetXcodeproj( + String workspace, String xcoodeproj) async { String? target; var shell = StringBuffer(); shell.write('cd $workspace'); - shell.write(" && xcodebuild -project $xcoodeproj -list | awk '/Targets:/ {getline; print; exit}'"); + shell.write( + " && xcodebuild -project $xcoodeproj -list | awk '/Targets:/ {getline; print; exit}'"); var process = await ProcessExecutor.run(shell); var arr = process.stdout.toString().split('\n'); - for(var item in arr) { + for (var item in arr) { item = item.trim(); if (item.isNotEmpty) { target = item.trim();