From 2306058eb7a7ae11148d7ba76081ebbe5c66608d Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Fri, 15 Nov 2024 08:16:01 -0600 Subject: [PATCH 01/17] Adding xcode-signing-style build flag --- cli/src/index.ts | 127 ++++++++++++++++++++++++++++++----------- cli/src/ios/build.ts | 2 + cli/src/tasks/build.ts | 2 + 3 files changed, 99 insertions(+), 32 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 1c014fbd1..818e6c186 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -11,9 +11,11 @@ import { telemetryAction } from './telemetry'; import { wrapAction } from './util/cli'; import { emoji as _e } from './util/emoji'; -type Writable = T extends object ? { -readonly [K in keyof T]: Writable } : T; +type Writable = T extends object + ? { -readonly [K in keyof T]: Writable } + : T; -process.on('unhandledRejection', (error) => { +process.on('unhandledRejection', error => { console.error(c.failure('[fatal]'), error); }); @@ -56,14 +58,29 @@ export function runProgram(config: Config): void { program .command('init [appName] [appId]') .description(`Initialize Capacitor configuration`) - .option('--web-dir ', 'Optional: Directory of your projects built web assets') - .option('--skip-appid-validation', 'Optional: Skip validating the app ID for iOS and Android compatibility') + .option( + '--web-dir ', + 'Optional: Directory of your projects built web assets', + ) + .option( + '--skip-appid-validation', + 'Optional: Skip validating the app ID for iOS and Android compatibility', + ) .action( wrapAction( - telemetryAction(config, async (appName, appId, { webDir, skipAppidValidation }) => { - const { initCommand } = await import('./tasks/init'); - await initCommand(config, appName, appId, webDir, skipAppidValidation); - }), + telemetryAction( + config, + async (appName, appId, { webDir, skipAppidValidation }) => { + const { initCommand } = await import('./tasks/init'); + await initCommand( + config, + appName, + appId, + webDir, + skipAppidValidation, + ); + }, + ), ), ); @@ -80,7 +97,10 @@ export function runProgram(config: Config): void { program .command('sync [platform]') .description(`${c.input('copy')} + ${c.input('update')}`) - .option('--deployment', 'Optional: if provided, pod install will use --deployment option') + .option( + '--deployment', + 'Optional: if provided, pod install will use --deployment option', + ) .option( '--inline', 'Optional: if true, all source maps will be inlined for easier debugging on mobile devices', @@ -97,8 +117,15 @@ export function runProgram(config: Config): void { program .command('update [platform]') - .description(`updates the native plugins and dependencies based on ${c.strong('package.json')}`) - .option('--deployment', 'Optional: if provided, pod install will use --deployment option') + .description( + `updates the native plugins and dependencies based on ${c.strong( + 'package.json', + )}`, + ) + .option( + '--deployment', + 'Optional: if provided, pod install will use --deployment option', + ) .action( wrapAction( telemetryAction(config, async (platform, { deployment }) => { @@ -134,18 +161,27 @@ export function runProgram(config: Config): void { .option('--keystorepass ', 'Password to the keystore') .option('--keystorealias ', 'Key Alias in the keystore') .option('--configuration ', 'Configuration name of the iOS Scheme') - .option('--keystorealiaspass ', 'Password for the Key Alias') + .option( + '--keystorealiaspass ', + 'Password for the Key Alias', + ) .addOption( - new Option('--androidreleasetype ', 'Android release type; APK or AAB').choices([ - 'AAB', - 'APK', - ]), + new Option( + '--androidreleasetype ', + 'Android release type; APK or AAB', + ).choices(['AAB', 'APK']), ) .addOption( - new Option('--signing-type ', 'Program used to sign apps (default: jarsigner)').choices([ - 'apksigner', - 'jarsigner', - ]), + new Option( + '--signing-type ', + 'Program used to sign apps (default: jarsigner)', + ).choices(['apksigner', 'jarsigner']), + ) + .addOption( + new Option( + '--xcode-signing-style ', + 'The iOS signing style to use when building the app for distribution', + ).choices(['automatic', 'manual']), ) .action( wrapAction( @@ -163,6 +199,7 @@ export function runProgram(config: Config): void { androidreleasetype, signingType, configuration, + xcodeSigningStyle, }, ) => { const { buildCommand } = await import('./tasks/build'); @@ -176,6 +213,7 @@ export function runProgram(config: Config): void { androidreleasetype, signingtype: signingType, configuration, + xcodeSigningType: xcodeSigningStyle, }); }, ), @@ -183,15 +221,23 @@ export function runProgram(config: Config): void { ); program .command(`run [platform]`) - .description(`runs ${c.input('sync')}, then builds and deploys the native app`) + .description( + `runs ${c.input('sync')}, then builds and deploys the native app`, + ) .option('--scheme ', 'set the scheme of the iOS project') - .option('--flavor ', 'set the flavor of the Android project (flavor dimensions not yet supported)') + .option( + '--flavor ', + 'set the flavor of the Android project (flavor dimensions not yet supported)', + ) .option('--list', 'list targets, then quit') // TODO: remove once --json is a hidden option (https://github.com/tj/commander.js/issues/1106) .allowUnknownOption(true) .option('--target ', 'use a specific target') .option('--no-sync', `do not run ${c.input('sync')}`) - .option('--forwardPorts ', 'Automatically run "adb reverse" for better live-reloading support') + .option( + '--forwardPorts ', + 'Automatically run "adb reverse" for better live-reloading support', + ) .option('-l, --live-reload', 'Enable Live Reload') .option('--host ', 'Host used for live reload') .option('--port ', 'Port used for live reload') @@ -202,7 +248,18 @@ export function runProgram(config: Config): void { config, async ( platform, - { scheme, flavor, list, target, sync, forwardPorts, liveReload, host, port, configuration }, + { + scheme, + flavor, + list, + target, + sync, + forwardPorts, + liveReload, + host, + port, + configuration, + }, ) => { const { runCommand } = await import('./tasks/run'); await runCommand(config, platform, { @@ -227,7 +284,7 @@ export function runProgram(config: Config): void { .description('opens the native project workspace (Xcode for iOS)') .action( wrapAction( - telemetryAction(config, async (platform) => { + telemetryAction(config, async platform => { const { openCommand } = await import('./tasks/open'); await openCommand(config, platform); }), @@ -248,7 +305,8 @@ export function runProgram(config: Config): void { const configWritable: Writable = config as Writable; if (packagemanager === 'SPM') { - configWritable.cli.assets.ios.platformTemplateArchive = 'ios-spm-template.tar.gz'; + configWritable.cli.assets.ios.platformTemplateArchive = + 'ios-spm-template.tar.gz'; configWritable.cli.assets.ios.platformTemplateArchiveAbs = resolve( configWritable.cli.assetsDirAbs, configWritable.cli.assets.ios.platformTemplateArchive, @@ -265,7 +323,7 @@ export function runProgram(config: Config): void { .description('list installed Cordova and Capacitor plugins') .action( wrapAction( - telemetryAction(config, async (platform) => { + telemetryAction(config, async platform => { const { listCommand } = await import('./tasks/list'); await listCommand(config, platform); }), @@ -277,7 +335,7 @@ export function runProgram(config: Config): void { .description('checks the current setup for common errors') .action( wrapAction( - telemetryAction(config, async (platform) => { + telemetryAction(config, async platform => { const { doctorCommand } = await import('./tasks/doctor'); await doctorCommand(config, platform); }), @@ -288,7 +346,7 @@ export function runProgram(config: Config): void { .command('telemetry [on|off]', { hidden: true }) .description('enable or disable telemetry') .action( - wrapAction(async (onOrOff) => { + wrapAction(async onOrOff => { const { telemetryCommand } = await import('./tasks/telemetry'); await telemetryCommand(onOrOff); }), @@ -314,8 +372,13 @@ export function runProgram(config: Config): void { program .command('migrate') .option('--noprompt', 'do not prompt for confirmation') - .option('--packagemanager ', 'The package manager to use for dependency installs (npm, pnpm, yarn)') - .description('Migrate your current Capacitor app to the latest major version of Capacitor.') + .option( + '--packagemanager ', + 'The package manager to use for dependency installs (npm, pnpm, yarn)', + ) + .description( + 'Migrate your current Capacitor app to the latest major version of Capacitor.', + ) .action( wrapAction(async ({ noprompt, packagemanager }) => { const { migrateCommand } = await import('./tasks/migrate'); @@ -324,7 +387,7 @@ export function runProgram(config: Config): void { ); program.arguments('[command]').action( - wrapAction(async (cmd) => { + wrapAction(async cmd => { if (typeof cmd === 'undefined') { output.write( `\n ${_e('⚡️', '--')} ${c.strong( diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 838a4b451..bba83ab4c 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -51,6 +51,8 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions method app-store-connect +signingStyle +${buildOptions.xcodeSigningType} `; diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index 783600624..6a6bdf690 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -14,6 +14,7 @@ export interface BuildCommandOptions { androidreleasetype?: 'AAB' | 'APK'; signingtype?: 'apksigner' | 'jarsigner'; configuration: string; + xcodeSigningType: 'automatic' | 'manual'; } export async function buildCommand( @@ -42,6 +43,7 @@ export async function buildCommand( androidreleasetype: buildOptions.androidreleasetype || config.android.buildOptions.releaseType || 'AAB', signingtype: buildOptions.signingtype || config.android.buildOptions.signingType || 'jarsigner', configuration: buildOptions.configuration || 'Release', + xcodeSigningType: buildOptions.xcodeSigningType || 'automatic', }; try { From 4383b676eebe760788985d5f809715a8ca69dd1d Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 19 Nov 2024 11:27:39 -0600 Subject: [PATCH 02/17] Adding singing cert and provisioning profile to cli --- cli/src/index.ts | 132 ++++++++++++++--------------------------- cli/src/ios/build.ts | 9 +++ cli/src/tasks/build.ts | 4 ++ 3 files changed, 58 insertions(+), 87 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 818e6c186..98bea3df7 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -11,11 +11,9 @@ import { telemetryAction } from './telemetry'; import { wrapAction } from './util/cli'; import { emoji as _e } from './util/emoji'; -type Writable = T extends object - ? { -readonly [K in keyof T]: Writable } - : T; +type Writable = T extends object ? { -readonly [K in keyof T]: Writable } : T; -process.on('unhandledRejection', error => { +process.on('unhandledRejection', (error) => { console.error(c.failure('[fatal]'), error); }); @@ -58,29 +56,14 @@ export function runProgram(config: Config): void { program .command('init [appName] [appId]') .description(`Initialize Capacitor configuration`) - .option( - '--web-dir ', - 'Optional: Directory of your projects built web assets', - ) - .option( - '--skip-appid-validation', - 'Optional: Skip validating the app ID for iOS and Android compatibility', - ) + .option('--web-dir ', 'Optional: Directory of your projects built web assets') + .option('--skip-appid-validation', 'Optional: Skip validating the app ID for iOS and Android compatibility') .action( wrapAction( - telemetryAction( - config, - async (appName, appId, { webDir, skipAppidValidation }) => { - const { initCommand } = await import('./tasks/init'); - await initCommand( - config, - appName, - appId, - webDir, - skipAppidValidation, - ); - }, - ), + telemetryAction(config, async (appName, appId, { webDir, skipAppidValidation }) => { + const { initCommand } = await import('./tasks/init'); + await initCommand(config, appName, appId, webDir, skipAppidValidation); + }), ), ); @@ -97,10 +80,7 @@ export function runProgram(config: Config): void { program .command('sync [platform]') .description(`${c.input('copy')} + ${c.input('update')}`) - .option( - '--deployment', - 'Optional: if provided, pod install will use --deployment option', - ) + .option('--deployment', 'Optional: if provided, pod install will use --deployment option') .option( '--inline', 'Optional: if true, all source maps will be inlined for easier debugging on mobile devices', @@ -117,15 +97,8 @@ export function runProgram(config: Config): void { program .command('update [platform]') - .description( - `updates the native plugins and dependencies based on ${c.strong( - 'package.json', - )}`, - ) - .option( - '--deployment', - 'Optional: if provided, pod install will use --deployment option', - ) + .description(`updates the native plugins and dependencies based on ${c.strong('package.json')}`) + .option('--deployment', 'Optional: if provided, pod install will use --deployment option') .action( wrapAction( telemetryAction(config, async (platform, { deployment }) => { @@ -161,21 +134,18 @@ export function runProgram(config: Config): void { .option('--keystorepass ', 'Password to the keystore') .option('--keystorealias ', 'Key Alias in the keystore') .option('--configuration ', 'Configuration name of the iOS Scheme') - .option( - '--keystorealiaspass ', - 'Password for the Key Alias', - ) + .option('--keystorealiaspass ', 'Password for the Key Alias') .addOption( - new Option( - '--androidreleasetype ', - 'Android release type; APK or AAB', - ).choices(['AAB', 'APK']), + new Option('--androidreleasetype ', 'Android release type; APK or AAB').choices([ + 'AAB', + 'APK', + ]), ) .addOption( - new Option( - '--signing-type ', - 'Program used to sign apps (default: jarsigner)', - ).choices(['apksigner', 'jarsigner']), + new Option('--signing-type ', 'Program used to sign apps (default: jarsigner)').choices([ + 'apksigner', + 'jarsigner', + ]), ) .addOption( new Option( @@ -183,6 +153,15 @@ export function runProgram(config: Config): void { 'The iOS signing style to use when building the app for distribution', ).choices(['automatic', 'manual']), ) + .addOption( + new Option( + '--xcode-signing-certificate ', + 'A certificate name, SHA-1 hash, or automatic selector to use for signing for iOS builds', + ), + ) + .addOption( + new Option('--xcode-provisioning-profile ', 'A provisioning profile name or UUID'), + ) .action( wrapAction( telemetryAction( @@ -200,6 +179,8 @@ export function runProgram(config: Config): void { signingType, configuration, xcodeSigningStyle, + xcodeSigningCertificate, + xcodeProvisioningProfile, }, ) => { const { buildCommand } = await import('./tasks/build'); @@ -214,6 +195,8 @@ export function runProgram(config: Config): void { signingtype: signingType, configuration, xcodeSigningType: xcodeSigningStyle, + xcodeSigningCertificate, + xcodeProvisioningProfile, }); }, ), @@ -221,23 +204,15 @@ export function runProgram(config: Config): void { ); program .command(`run [platform]`) - .description( - `runs ${c.input('sync')}, then builds and deploys the native app`, - ) + .description(`runs ${c.input('sync')}, then builds and deploys the native app`) .option('--scheme ', 'set the scheme of the iOS project') - .option( - '--flavor ', - 'set the flavor of the Android project (flavor dimensions not yet supported)', - ) + .option('--flavor ', 'set the flavor of the Android project (flavor dimensions not yet supported)') .option('--list', 'list targets, then quit') // TODO: remove once --json is a hidden option (https://github.com/tj/commander.js/issues/1106) .allowUnknownOption(true) .option('--target ', 'use a specific target') .option('--no-sync', `do not run ${c.input('sync')}`) - .option( - '--forwardPorts ', - 'Automatically run "adb reverse" for better live-reloading support', - ) + .option('--forwardPorts ', 'Automatically run "adb reverse" for better live-reloading support') .option('-l, --live-reload', 'Enable Live Reload') .option('--host ', 'Host used for live reload') .option('--port ', 'Port used for live reload') @@ -248,18 +223,7 @@ export function runProgram(config: Config): void { config, async ( platform, - { - scheme, - flavor, - list, - target, - sync, - forwardPorts, - liveReload, - host, - port, - configuration, - }, + { scheme, flavor, list, target, sync, forwardPorts, liveReload, host, port, configuration }, ) => { const { runCommand } = await import('./tasks/run'); await runCommand(config, platform, { @@ -284,7 +248,7 @@ export function runProgram(config: Config): void { .description('opens the native project workspace (Xcode for iOS)') .action( wrapAction( - telemetryAction(config, async platform => { + telemetryAction(config, async (platform) => { const { openCommand } = await import('./tasks/open'); await openCommand(config, platform); }), @@ -305,8 +269,7 @@ export function runProgram(config: Config): void { const configWritable: Writable = config as Writable; if (packagemanager === 'SPM') { - configWritable.cli.assets.ios.platformTemplateArchive = - 'ios-spm-template.tar.gz'; + configWritable.cli.assets.ios.platformTemplateArchive = 'ios-spm-template.tar.gz'; configWritable.cli.assets.ios.platformTemplateArchiveAbs = resolve( configWritable.cli.assetsDirAbs, configWritable.cli.assets.ios.platformTemplateArchive, @@ -323,7 +286,7 @@ export function runProgram(config: Config): void { .description('list installed Cordova and Capacitor plugins') .action( wrapAction( - telemetryAction(config, async platform => { + telemetryAction(config, async (platform) => { const { listCommand } = await import('./tasks/list'); await listCommand(config, platform); }), @@ -335,7 +298,7 @@ export function runProgram(config: Config): void { .description('checks the current setup for common errors') .action( wrapAction( - telemetryAction(config, async platform => { + telemetryAction(config, async (platform) => { const { doctorCommand } = await import('./tasks/doctor'); await doctorCommand(config, platform); }), @@ -346,7 +309,7 @@ export function runProgram(config: Config): void { .command('telemetry [on|off]', { hidden: true }) .description('enable or disable telemetry') .action( - wrapAction(async onOrOff => { + wrapAction(async (onOrOff) => { const { telemetryCommand } = await import('./tasks/telemetry'); await telemetryCommand(onOrOff); }), @@ -372,13 +335,8 @@ export function runProgram(config: Config): void { program .command('migrate') .option('--noprompt', 'do not prompt for confirmation') - .option( - '--packagemanager ', - 'The package manager to use for dependency installs (npm, pnpm, yarn)', - ) - .description( - 'Migrate your current Capacitor app to the latest major version of Capacitor.', - ) + .option('--packagemanager ', 'The package manager to use for dependency installs (npm, pnpm, yarn)') + .description('Migrate your current Capacitor app to the latest major version of Capacitor.') .action( wrapAction(async ({ noprompt, packagemanager }) => { const { migrateCommand } = await import('./tasks/migrate'); @@ -387,7 +345,7 @@ export function runProgram(config: Config): void { ); program.arguments('[command]').action( - wrapAction(async cmd => { + wrapAction(async (cmd) => { if (typeof cmd === 'undefined') { output.write( `\n ${_e('⚡️', '--')} ${c.strong( diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index bba83ab4c..45d6447eb 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -45,6 +45,14 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions ), ); + const manualSigningContents = `provisioningProfiles + +${config.app.appId} +${buildOptions.xcodeProvisioningProfile ?? ''} + +signingCertificate +${buildOptions.xcodeSigningCertificate ?? ''}`; + const archivePlistContents = ` @@ -53,6 +61,7 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions app-store-connect signingStyle ${buildOptions.xcodeSigningType} +${buildOptions.xcodeSigningType == 'manual' ? manualSigningContents : ''} `; diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index 6a6bdf690..1b7960b25 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -15,6 +15,8 @@ export interface BuildCommandOptions { signingtype?: 'apksigner' | 'jarsigner'; configuration: string; xcodeSigningType: 'automatic' | 'manual'; + xcodeSigningCertificate?: string; + xcodeProvisioningProfile?: string; } export async function buildCommand( @@ -44,6 +46,8 @@ export async function buildCommand( signingtype: buildOptions.signingtype || config.android.buildOptions.signingType || 'jarsigner', configuration: buildOptions.configuration || 'Release', xcodeSigningType: buildOptions.xcodeSigningType || 'automatic', + xcodeSigningCertificate: buildOptions.xcodeSigningCertificate, + xcodeProvisioningProfile: buildOptions.xcodeProvisioningProfile, }; try { From e96c4f176cceeb81f7f15e351b38236c34b42007 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 19 Nov 2024 13:24:00 -0600 Subject: [PATCH 03/17] updating command line description --- cli/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 98bea3df7..0152200dc 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -160,7 +160,7 @@ export function runProgram(config: Config): void { ), ) .addOption( - new Option('--xcode-provisioning-profile ', 'A provisioning profile name or UUID'), + new Option('--xcode-provisioning-profile ', 'A provisioning profile name or UUID for iOS builds'), ) .action( wrapAction( From 23300df62ebaf9692a46ad5829581b71d4f9177a Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 19 Nov 2024 13:34:39 -0600 Subject: [PATCH 04/17] fmt --- cli/src/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 0152200dc..6ead2f932 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -160,7 +160,10 @@ export function runProgram(config: Config): void { ), ) .addOption( - new Option('--xcode-provisioning-profile ', 'A provisioning profile name or UUID for iOS builds'), + new Option( + '--xcode-provisioning-profile ', + 'A provisioning profile name or UUID for iOS builds', + ), ) .action( wrapAction( From 8e50ecb3871dedd86a8580273a324f50845ff0ff Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Wed, 4 Dec 2024 12:37:37 -0600 Subject: [PATCH 05/17] Making xcodeSigningType optional --- cli/src/index.ts | 2 +- cli/src/tasks/build.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 6ead2f932..e68aaa5f3 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -150,7 +150,7 @@ export function runProgram(config: Config): void { .addOption( new Option( '--xcode-signing-style ', - 'The iOS signing style to use when building the app for distribution', + 'The iOS signing style to use when building the app for distribution (default: automatic)', ).choices(['automatic', 'manual']), ) .addOption( diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index 1b7960b25..ee1cd8836 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -14,7 +14,7 @@ export interface BuildCommandOptions { androidreleasetype?: 'AAB' | 'APK'; signingtype?: 'apksigner' | 'jarsigner'; configuration: string; - xcodeSigningType: 'automatic' | 'manual'; + xcodeSigningType?: 'automatic' | 'manual'; xcodeSigningCertificate?: string; xcodeProvisioningProfile?: string; } From ab7e9b913e666579dc85798185d20a8bfbc0c08a Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Wed, 4 Dec 2024 15:55:43 -0600 Subject: [PATCH 06/17] Check for empty signing cert and profile during manual builds --- cli/src/ios/build.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 4861a177b..55fc7870a 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -25,6 +25,13 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions projectName = basename(await config.ios.nativeXcodeProjDirAbs); } + if ( + buildOptions.xcodeSigningType == 'manual' && + (!buildOptions.xcodeSigningCertificate || !buildOptions.xcodeProvisioningProfile) + ) { + throw 'Manually signed Xcode builds require a signing certificate and provisioning profile.'; + } + await runTask('Building xArchive', async () => runCommand( 'xcodebuild', From 4159a23aa65041d25e19d942b48cbd66b1b2732e Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 12 Dec 2024 09:38:08 -0600 Subject: [PATCH 07/17] Adding iOS build options to cap config --- cli/src/declarations.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index a0975a6be..71870a4fe 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -457,6 +457,28 @@ export interface CapacitorConfig { * @default true */ initialFocus?: boolean; + + buildOptions?: { + /** + * The signing style to use when building the app for distribution. + * + * @since 7.0.0 + * @default 'automatic' + */ + signingStyle?: 'automatic' | 'manual'; + /** + * A certificate name, SHA-1 hash, or automatic selector to use for signing for iOS builds. + * + * @since 7.0.0 + */ + signingCertificate?: string; + /** + * A provisioning profile name or UUID for iOS builds. + * + * @since 7.0.0 + */ + provisioningProfile?: string; + }; }; server?: { From 936f0331ba64b1cbe6fccb3b1f37f73137d47c3e Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 12 Dec 2024 10:08:19 -0600 Subject: [PATCH 08/17] Wiring cap config ios build options into build command --- cli/src/config.ts | 7 ++++++- cli/src/definitions.ts | 5 +++++ cli/src/tasks/build.ts | 6 +++--- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cli/src/config.ts b/cli/src/config.ts index e504f2539..9a4fda517 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -267,7 +267,11 @@ async function loadIOSConfig(rootDir: string, extConfig: ExternalConfig): Promis const podPath = lazy(() => determineGemfileOrCocoapodPath(rootDir, platformDirAbs, nativeProjectDirAbs)); const webDirAbs = lazy(() => determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs)); const cordovaPluginsDir = 'capacitor-cordova-ios-plugins'; - + const buildOptions = { + xcodeSigningStyle: extConfig.ios?.buildOptions?.signingStyle, + signingCertificate: extConfig.ios?.buildOptions?.signingCertificate, + provisioningProfile: extConfig.ios?.buildOptions?.provisioningProfile, + }; return { name, minVersion: '14.0', @@ -287,6 +291,7 @@ async function loadIOSConfig(rootDir: string, extConfig: ExternalConfig): Promis webDir: lazy(async () => relative(platformDirAbs, await webDirAbs)), webDirAbs, podPath, + buildOptions, }; } diff --git a/cli/src/definitions.ts b/cli/src/definitions.ts index a81278120..3fb9bc317 100644 --- a/cli/src/definitions.ts +++ b/cli/src/definitions.ts @@ -117,6 +117,11 @@ export interface IOSConfig extends PlatformConfig { readonly nativeXcodeProjDirAbs: string; readonly nativeXcodeWorkspaceDir: Promise; readonly nativeXcodeWorkspaceDirAbs: Promise; + readonly buildOptions: { + xcodeSigningStyle?: 'automatic' | 'manual'; + signingCertificate?: string; + provisioningProfile?: string; + }; } export type WebConfig = PlatformConfig; diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index ee1cd8836..a5c16a51b 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -45,9 +45,9 @@ export async function buildCommand( androidreleasetype: buildOptions.androidreleasetype || config.android.buildOptions.releaseType || 'AAB', signingtype: buildOptions.signingtype || config.android.buildOptions.signingType || 'jarsigner', configuration: buildOptions.configuration || 'Release', - xcodeSigningType: buildOptions.xcodeSigningType || 'automatic', - xcodeSigningCertificate: buildOptions.xcodeSigningCertificate, - xcodeProvisioningProfile: buildOptions.xcodeProvisioningProfile, + xcodeSigningType: buildOptions.xcodeSigningType || config.ios.buildOptions.xcodeSigningStyle || 'automatic', + xcodeSigningCertificate: buildOptions.xcodeSigningCertificate || config.ios.buildOptions.signingCertificate, + xcodeProvisioningProfile: buildOptions.xcodeProvisioningProfile || config.ios.buildOptions.provisioningProfile, }; try { From af2f2eb405d1c173d18c79e8fe5159ea8fe910dd Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Wed, 15 Jan 2025 11:30:34 -0600 Subject: [PATCH 09/17] Adding support for setting export method --- cli/src/index.ts | 16 ++++++++++++++++ cli/src/ios/build.ts | 4 ++-- cli/src/tasks/build.ts | 12 ++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index bb38348a4..b27d96f8a 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -147,6 +147,20 @@ export function runProgram(config: Config): void { 'jarsigner', ]), ) + .addOption( + new Option( + '--xcode-export-method ', + 'Describes how xcodebuild should export the archive (default: debugging)', + ).choices([ + 'app-store-connect', + 'release-testing', + 'enterprise', + 'debugging', + 'developer-id', + 'mac-application', + 'validation', + ]), + ) .addOption( new Option( '--xcode-signing-style ', @@ -181,6 +195,7 @@ export function runProgram(config: Config): void { androidreleasetype, signingType, configuration, + xcodeExportMethod, xcodeSigningStyle, xcodeSigningCertificate, xcodeProvisioningProfile, @@ -197,6 +212,7 @@ export function runProgram(config: Config): void { androidreleasetype, signingtype: signingType, configuration, + xcodeExportMethod, xcodeSigningType: xcodeSigningStyle, xcodeSigningCertificate, xcodeProvisioningProfile, diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 462cc2c6d..23c713f51 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -5,7 +5,7 @@ import { rimraf } from 'rimraf'; import { runTask } from '../common'; import type { Config } from '../definitions'; import { logSuccess } from '../log'; -import type { BuildCommandOptions } from '../tasks/build'; +import { ExportMethod, type BuildCommandOptions } from '../tasks/build'; import { checkPackageManager } from '../util/spm'; import { runCommand } from '../util/subprocess'; @@ -65,7 +65,7 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions method -app-store-connect +${buildOptions.xcodeExportMethod ?? ExportMethod.Debugging} signingStyle ${buildOptions.xcodeSigningType} ${buildOptions.xcodeSigningType == 'manual' ? manualSigningContents : ''} diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index a5c16a51b..3cba8025d 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -4,6 +4,16 @@ import type { Config } from '../definitions'; import { fatal, isFatal } from '../errors'; import { buildiOS } from '../ios/build'; +export enum ExportMethod { + AppStoreConnect = 'app-store-connect', + ReleaseTesting = 'release-testing', + Enterprise = 'enterprise', + Debugging = 'debugging', + DeveloperID = 'developer-id', + MacApplication = 'mac-application', + Validation = 'validation', +} + export interface BuildCommandOptions { scheme?: string; flavor?: string; @@ -14,6 +24,7 @@ export interface BuildCommandOptions { androidreleasetype?: 'AAB' | 'APK'; signingtype?: 'apksigner' | 'jarsigner'; configuration: string; + xcodeExportMethod?: ExportMethod; xcodeSigningType?: 'automatic' | 'manual'; xcodeSigningCertificate?: string; xcodeProvisioningProfile?: string; @@ -45,6 +56,7 @@ export async function buildCommand( androidreleasetype: buildOptions.androidreleasetype || config.android.buildOptions.releaseType || 'AAB', signingtype: buildOptions.signingtype || config.android.buildOptions.signingType || 'jarsigner', configuration: buildOptions.configuration || 'Release', + xcodeExportMethod: buildOptions.xcodeExportMethod || ExportMethod.Debugging, xcodeSigningType: buildOptions.xcodeSigningType || config.ios.buildOptions.xcodeSigningStyle || 'automatic', xcodeSigningCertificate: buildOptions.xcodeSigningCertificate || config.ios.buildOptions.signingCertificate, xcodeProvisioningProfile: buildOptions.xcodeProvisioningProfile || config.ios.buildOptions.provisioningProfile, From e2347feac64b79bcb7b4f03e5802cd639361c47b Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Wed, 15 Jan 2025 12:54:18 -0600 Subject: [PATCH 10/17] deleting iOS buildOptions from generated capacitor.config.json --- cli/src/tasks/copy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/src/tasks/copy.ts b/cli/src/tasks/copy.ts index c59028279..6943677ab 100644 --- a/cli/src/tasks/copy.ts +++ b/cli/src/tasks/copy.ts @@ -154,6 +154,7 @@ async function copyCapacitorConfig(config: Config, nativeAbsDir: string) { await runTask(`Creating ${c.strong(nativeConfigFile)} in ${nativeRelDir}`, async () => { delete (config.app.extConfig.android as any)?.buildOptions; + delete (config.app.extConfig.ios as any)?.buildOptions; await writeJSON(nativeConfigFilePath, config.app.extConfig, { spaces: '\t', }); From e4385861bd3e59594be681a7a60750e3f31946c3 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Wed, 15 Jan 2025 13:08:12 -0600 Subject: [PATCH 11/17] Adding exportMethod to capConfig --- cli/src/config.ts | 1 + cli/src/declarations.ts | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/cli/src/config.ts b/cli/src/config.ts index 9a4fda517..dc303df6b 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -268,6 +268,7 @@ async function loadIOSConfig(rootDir: string, extConfig: ExternalConfig): Promis const webDirAbs = lazy(() => determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs)); const cordovaPluginsDir = 'capacitor-cordova-ios-plugins'; const buildOptions = { + xcodeExportMethod: extConfig.ios?.buildOptions?.exportMethod, xcodeSigningStyle: extConfig.ios?.buildOptions?.signingStyle, signingCertificate: extConfig.ios?.buildOptions?.signingCertificate, provisioningProfile: extConfig.ios?.buildOptions?.provisioningProfile, diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 5a1cefcee..6c2268736 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -487,6 +487,13 @@ export interface CapacitorConfig { * @default 'automatic' */ signingStyle?: 'automatic' | 'manual'; + /** + * The method used by xcodebuild to export the archive + * + * @since 7.0.0 + * @default 'debugging' + */ + exportMethod?: string; /** * A certificate name, SHA-1 hash, or automatic selector to use for signing for iOS builds. * From 5858e67998cbe90dd3ba85b6d81585ed39bf7db5 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 16 Jan 2025 13:24:59 -0600 Subject: [PATCH 12/17] Askings for team id --- cli/src/definitions.ts | 12 ++++++++++++ cli/src/index.ts | 5 +++++ cli/src/tasks/build.ts | 19 ++++++------------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/cli/src/definitions.ts b/cli/src/definitions.ts index 3fb9bc317..893a9d030 100644 --- a/cli/src/definitions.ts +++ b/cli/src/definitions.ts @@ -101,6 +101,16 @@ export interface AndroidConfig extends PlatformConfig { }; } +export enum XcodeExportMethod { + AppStoreConnect = 'app-store-connect', + ReleaseTesting = 'release-testing', + Enterprise = 'enterprise', + Debugging = 'debugging', + DeveloperID = 'developer-id', + MacApplication = 'mac-application', + Validation = 'validation', +} + export interface IOSConfig extends PlatformConfig { readonly cordovaPluginsDir: string; readonly cordovaPluginsDirAbs: string; @@ -118,6 +128,8 @@ export interface IOSConfig extends PlatformConfig { readonly nativeXcodeWorkspaceDir: Promise; readonly nativeXcodeWorkspaceDirAbs: Promise; readonly buildOptions: { + teamId?: string; + exportMethod?: XcodeExportMethod; xcodeSigningStyle?: 'automatic' | 'manual'; signingCertificate?: string; provisioningProfile?: string; diff --git a/cli/src/index.ts b/cli/src/index.ts index b27d96f8a..c8c42744a 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -147,6 +147,9 @@ export function runProgram(config: Config): void { 'jarsigner', ]), ) + .addOption( + new Option('--xcode-team-id ', 'The Developer team to use for building and exporting the archive'), + ) .addOption( new Option( '--xcode-export-method ', @@ -195,6 +198,7 @@ export function runProgram(config: Config): void { androidreleasetype, signingType, configuration, + xcodeTeamId, xcodeExportMethod, xcodeSigningStyle, xcodeSigningCertificate, @@ -212,6 +216,7 @@ export function runProgram(config: Config): void { androidreleasetype, signingtype: signingType, configuration, + xcodeTeamId, xcodeExportMethod, xcodeSigningType: xcodeSigningStyle, xcodeSigningCertificate, diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index 3cba8025d..03591893e 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -1,19 +1,9 @@ import { buildAndroid } from '../android/build'; import { selectPlatforms, promptForPlatform } from '../common'; -import type { Config } from '../definitions'; +import { Config, XcodeExportMethod } from '../definitions'; import { fatal, isFatal } from '../errors'; import { buildiOS } from '../ios/build'; -export enum ExportMethod { - AppStoreConnect = 'app-store-connect', - ReleaseTesting = 'release-testing', - Enterprise = 'enterprise', - Debugging = 'debugging', - DeveloperID = 'developer-id', - MacApplication = 'mac-application', - Validation = 'validation', -} - export interface BuildCommandOptions { scheme?: string; flavor?: string; @@ -24,7 +14,8 @@ export interface BuildCommandOptions { androidreleasetype?: 'AAB' | 'APK'; signingtype?: 'apksigner' | 'jarsigner'; configuration: string; - xcodeExportMethod?: ExportMethod; + xcodeTeamId?: string; + xcodeExportMethod?: XcodeExportMethod; xcodeSigningType?: 'automatic' | 'manual'; xcodeSigningCertificate?: string; xcodeProvisioningProfile?: string; @@ -56,7 +47,9 @@ export async function buildCommand( androidreleasetype: buildOptions.androidreleasetype || config.android.buildOptions.releaseType || 'AAB', signingtype: buildOptions.signingtype || config.android.buildOptions.signingType || 'jarsigner', configuration: buildOptions.configuration || 'Release', - xcodeExportMethod: buildOptions.xcodeExportMethod || ExportMethod.Debugging, + xcodeTeamId: buildOptions.xcodeTeamId || config.ios.buildOptions.teamId, + xcodeExportMethod: + buildOptions.xcodeExportMethod || config.ios.buildOptions.exportMethod || XcodeExportMethod.Debugging, xcodeSigningType: buildOptions.xcodeSigningType || config.ios.buildOptions.xcodeSigningStyle || 'automatic', xcodeSigningCertificate: buildOptions.xcodeSigningCertificate || config.ios.buildOptions.signingCertificate, xcodeProvisioningProfile: buildOptions.xcodeProvisioningProfile || config.ios.buildOptions.provisioningProfile, From 6b28c452f0333441589c28585b338c6db9d33ea9 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 16 Jan 2025 13:26:25 -0600 Subject: [PATCH 13/17] fixing manual build and archive configuration --- cli/src/ios/build.ts | 85 ++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 23c713f51..1cc5bb1d2 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -3,9 +3,9 @@ import { basename, join } from 'path'; import { rimraf } from 'rimraf'; import { runTask } from '../common'; -import type { Config } from '../definitions'; +import { XcodeExportMethod, type Config } from '../definitions'; import { logSuccess } from '../log'; -import { ExportMethod, type BuildCommandOptions } from '../tasks/build'; +import { type BuildCommandOptions } from '../tasks/build'; import { checkPackageManager } from '../util/spm'; import { runCommand } from '../util/subprocess'; @@ -32,24 +32,30 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions throw 'Manually signed Xcode builds require a signing certificate and provisioning profile.'; } + const buildArgs = [ + typeOfBuild, + projectName, + '-scheme', + `${theScheme}`, + '-destination', + `generic/platform=iOS`, + '-archivePath', + `${theScheme}.xcarchive`, + 'archive', + ]; + + if (buildOptions.xcodeSigningType == 'manual') { + if (buildOptions.xcodeTeamId) { + buildArgs.push(`DEVELOPMENT_TEAM=${buildOptions.xcodeTeamId}`); + } + + buildArgs.push(`PROVISIONING_PROFILE_SPECIFIER=${buildOptions.xcodeProvisioningProfile}`); + } + await runTask('Building xArchive', async () => - runCommand( - 'xcodebuild', - [ - typeOfBuild, - projectName, - '-scheme', - `${theScheme}`, - '-destination', - `generic/platform=iOS`, - '-archivePath', - `${theScheme}.xcarchive`, - 'archive', - ], - { - cwd: config.ios.nativeProjectDirAbs, - }, - ), + runCommand('xcodebuild', buildArgs, { + cwd: config.ios.nativeProjectDirAbs, + }), ); const manualSigningContents = `provisioningProfiles @@ -65,7 +71,7 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions method -${buildOptions.xcodeExportMethod ?? ExportMethod.Debugging} +${buildOptions.xcodeExportMethod ?? XcodeExportMethod.Debugging} signingStyle ${buildOptions.xcodeSigningType} ${buildOptions.xcodeSigningType == 'manual' ? manualSigningContents : ''} @@ -76,26 +82,27 @@ ${buildOptions.xcodeSigningType == 'manual' ? manualSigningContents : ''} writeFileSync(archivePlistPath, archivePlistContents); + const archiveArgs = [ + 'archive', + '-archivePath', + `${theScheme}.xcarchive`, + '-exportArchive', + '-exportOptionsPlist', + 'archive.plist', + '-exportPath', + 'output', + '-configuration', + buildOptions.configuration, + ]; + + if (buildOptions.xcodeSigningType == 'automatic') { + archiveArgs.push('-allowProvisioningUpdates'); + } + await runTask('Building IPA', async () => - runCommand( - 'xcodebuild', - [ - 'archive', - '-archivePath', - `${theScheme}.xcarchive`, - '-exportArchive', - '-exportOptionsPlist', - 'archive.plist', - '-exportPath', - 'output', - '-allowProvisioningUpdates', - '-configuration', - buildOptions.configuration, - ], - { - cwd: config.ios.nativeProjectDirAbs, - }, - ), + runCommand('xcodebuild', archiveArgs, { + cwd: config.ios.nativeProjectDirAbs, + }), ); await runTask('Cleaning up', async () => { From 3f648b8ec7b4798c330fd4c97486485d027a2cf3 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 16 Jan 2025 13:52:31 -0600 Subject: [PATCH 14/17] Manual signing should not required for setting the team id --- cli/src/ios/build.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 1cc5bb1d2..059d94ef1 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -44,11 +44,11 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions 'archive', ]; - if (buildOptions.xcodeSigningType == 'manual') { - if (buildOptions.xcodeTeamId) { - buildArgs.push(`DEVELOPMENT_TEAM=${buildOptions.xcodeTeamId}`); - } + if (buildOptions.xcodeTeamId) { + buildArgs.push(`DEVELOPMENT_TEAM=${buildOptions.xcodeTeamId}`); + } + if (buildOptions.xcodeSigningType == 'manual') { buildArgs.push(`PROVISIONING_PROFILE_SPECIFIER=${buildOptions.xcodeProvisioningProfile}`); } From a9418baf61c8705359894b1dff81ee1a287ca5ef Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Thu, 16 Jan 2025 13:55:42 -0600 Subject: [PATCH 15/17] fmt --- cli/src/tasks/build.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index 03591893e..800e0721d 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -1,6 +1,7 @@ import { buildAndroid } from '../android/build'; import { selectPlatforms, promptForPlatform } from '../common'; -import { Config, XcodeExportMethod } from '../definitions'; +import type { Config } from '../definitions'; +import { XcodeExportMethod } from '../definitions'; import { fatal, isFatal } from '../errors'; import { buildiOS } from '../ios/build'; From a209f6e5ea5c571f863f2728bdc2adbb6dab63b1 Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Mon, 20 Jan 2025 09:52:57 -0600 Subject: [PATCH 16/17] =?UTF-8?q?Changing=20xocdeExportMethod=20default=20?= =?UTF-8?q?to=20=E2=80=98app-store-connect=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cli/src/index.ts | 2 +- cli/src/tasks/build.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index c8c42744a..abcc1590b 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -153,7 +153,7 @@ export function runProgram(config: Config): void { .addOption( new Option( '--xcode-export-method ', - 'Describes how xcodebuild should export the archive (default: debugging)', + 'Describes how xcodebuild should export the archive (default: app-store-connect)', ).choices([ 'app-store-connect', 'release-testing', diff --git a/cli/src/tasks/build.ts b/cli/src/tasks/build.ts index 800e0721d..c7e6b2415 100644 --- a/cli/src/tasks/build.ts +++ b/cli/src/tasks/build.ts @@ -50,7 +50,7 @@ export async function buildCommand( configuration: buildOptions.configuration || 'Release', xcodeTeamId: buildOptions.xcodeTeamId || config.ios.buildOptions.teamId, xcodeExportMethod: - buildOptions.xcodeExportMethod || config.ios.buildOptions.exportMethod || XcodeExportMethod.Debugging, + buildOptions.xcodeExportMethod || config.ios.buildOptions.exportMethod || XcodeExportMethod.AppStoreConnect, xcodeSigningType: buildOptions.xcodeSigningType || config.ios.buildOptions.xcodeSigningStyle || 'automatic', xcodeSigningCertificate: buildOptions.xcodeSigningCertificate || config.ios.buildOptions.signingCertificate, xcodeProvisioningProfile: buildOptions.xcodeProvisioningProfile || config.ios.buildOptions.provisioningProfile, From 1c3711d5aeb4beb7894cd226b7952d9868d65c3c Mon Sep 17 00:00:00 2001 From: Joseph Pender Date: Tue, 4 Feb 2025 09:14:54 -0600 Subject: [PATCH 17/17] Fixing missed XcodeExportMethod.Debugging default --- cli/src/declarations.ts | 2 +- cli/src/ios/build.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 6c2268736..1556f9af4 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -491,7 +491,7 @@ export interface CapacitorConfig { * The method used by xcodebuild to export the archive * * @since 7.0.0 - * @default 'debugging' + * @default 'app-store-connect' */ exportMethod?: string; /** diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 059d94ef1..8a8e11bcb 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -71,7 +71,7 @@ export async function buildiOS(config: Config, buildOptions: BuildCommandOptions method -${buildOptions.xcodeExportMethod ?? XcodeExportMethod.Debugging} +${buildOptions.xcodeExportMethod ?? XcodeExportMethod.AppStoreConnect} signingStyle ${buildOptions.xcodeSigningType} ${buildOptions.xcodeSigningType == 'manual' ? manualSigningContents : ''}