From 23ad7f8a4231a3b78abec32bb67bbd0c415b5011 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of markemer)" Date: Thu, 7 May 2026 16:55:19 +0000 Subject: [PATCH 01/39] Release 8.3.2 --- CHANGELOG.md | 14 ++++++++++++++ android/CHANGELOG.md | 6 ++++++ android/package.json | 2 +- cli/CHANGELOG.md | 13 +++++++++++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 4 ++++ ios/package.json | 2 +- lerna.json | 2 +- 10 files changed, 46 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95ee704f6..3851a6663 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,20 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) + +### Bug Fixes + +- **cli:** add cSettings support for compiler flags in generated Package.swift ([#8448](https://github.com/ionic-team/capacitor/issues/8448)) ([0bd0676](https://github.com/ionic-team/capacitor/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0)) +- **cli:** add system framework and weak framework support in SPM Package.swift ([#8447](https://github.com/ionic-team/capacitor/issues/8447)) ([3232f0f](https://github.com/ionic-team/capacitor/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8)) +- **cli:** correct Capacitor plugin SPM compat check ([#8440](https://github.com/ionic-team/capacitor/issues/8440)) ([e5ccc45](https://github.com/ionic-team/capacitor/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb)) +- **cli:** generate binaryTarget entries for custom xcframeworks in Package.swift ([#8445](https://github.com/ionic-team/capacitor/issues/8445)) ([1f7e33f](https://github.com/ionic-team/capacitor/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d)) +- **cli:** generate resource entries in Package.swift ([#8455](https://github.com/ionic-team/capacitor/issues/8455)) ([790bd27](https://github.com/ionic-team/capacitor/commit/790bd27123497111984227010c3162cec94a108e)) +- **cli:** handle Cordova plugins without iOS source files ([#8443](https://github.com/ionic-team/capacitor/issues/8443)) ([0da130e](https://github.com/ionic-team/capacitor/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3)) +- **cli:** link plugin dependencies in Package.swift ([#8457](https://github.com/ionic-team/capacitor/issues/8457)) ([b3c769e](https://github.com/ionic-team/capacitor/commit/b3c769e856c826b1174518877cf86ac7ce73bf09)) +- **ios:** support Cordova plugins with Package.swift ([#8438](https://github.com/ionic-team/capacitor/issues/8438)) ([139943b](https://github.com/ionic-team/capacitor/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf)) +- **SystemBars:** avoid extra view padding on API <= 34 ([#8439](https://github.com/ionic-team/capacitor/issues/8439)) ([5b135a7](https://github.com/ionic-team/capacitor/commit/5b135a70217be560e7176c8d5b514cc92ed3e4e4)) + ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 5812a4832..ca3b6f0ef 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) + +### Bug Fixes + +- **SystemBars:** avoid extra view padding on API <= 34 ([#8439](https://github.com/ionic-team/capacitor/issues/8439)) ([5b135a7](https://github.com/ionic-team/capacitor/commit/5b135a70217be560e7176c8d5b514cc92ed3e4e4)) + ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) ### Bug Fixes diff --git a/android/package.json b/android/package.json index f55229c31..5ecf01e07 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.3.1", + "version": "8.3.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index ac66f222f..1cc5720a1 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) + +### Bug Fixes + +- **cli:** add cSettings support for compiler flags in generated Package.swift ([#8448](https://github.com/ionic-team/capacitor/issues/8448)) ([0bd0676](https://github.com/ionic-team/capacitor/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0)) +- **cli:** add system framework and weak framework support in SPM Package.swift ([#8447](https://github.com/ionic-team/capacitor/issues/8447)) ([3232f0f](https://github.com/ionic-team/capacitor/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8)) +- **cli:** correct Capacitor plugin SPM compat check ([#8440](https://github.com/ionic-team/capacitor/issues/8440)) ([e5ccc45](https://github.com/ionic-team/capacitor/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb)) +- **cli:** generate binaryTarget entries for custom xcframeworks in Package.swift ([#8445](https://github.com/ionic-team/capacitor/issues/8445)) ([1f7e33f](https://github.com/ionic-team/capacitor/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d)) +- **cli:** generate resource entries in Package.swift ([#8455](https://github.com/ionic-team/capacitor/issues/8455)) ([790bd27](https://github.com/ionic-team/capacitor/commit/790bd27123497111984227010c3162cec94a108e)) +- **cli:** handle Cordova plugins without iOS source files ([#8443](https://github.com/ionic-team/capacitor/issues/8443)) ([0da130e](https://github.com/ionic-team/capacitor/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3)) +- **cli:** link plugin dependencies in Package.swift ([#8457](https://github.com/ionic-team/capacitor/issues/8457)) ([b3c769e](https://github.com/ionic-team/capacitor/commit/b3c769e856c826b1174518877cf86ac7ce73bf09)) +- **ios:** support Cordova plugins with Package.swift ([#8438](https://github.com/ionic-team/capacitor/issues/8438)) ([139943b](https://github.com/ionic-team/capacitor/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf)) + ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index b9f5d1ccc..abc3774df 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.3.1", + "version": "8.3.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 60a9ca82b..08c8815c3 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) + +**Note:** Version bump only for package @capacitor/core + ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index 54e8c7110..bc3bebc0f 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.3.1", + "version": "8.3.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index a16975c79..111b642ac 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) + +**Note:** Version bump only for package @capacitor/ios + ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) ### Bug Fixes diff --git a/ios/package.json b/ios/package.json index 4f7200cad..0972ed946 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.3.1", + "version": "8.3.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/lerna.json b/lerna.json index 5f513f656..d0a1ebc02 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.3.1", + "version": "8.3.2", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From b2d771926a180e60deea31992d7d4abcd5ca3bc7 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 8 May 2026 18:44:22 +0200 Subject: [PATCH 02/39] fix(cli): copy plugin files in CocoaPods projects (#8467) --- cli/src/ios/update.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 9fcd1c718..82ca85a88 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -564,7 +564,7 @@ async function copyPluginsNativeFiles(config: Config, cordovaPlugins: Plugin[]) const isSPM = (await config.ios.packageManager) === 'SPM'; for (const p of cordovaPlugins) { const platformTag = getPluginPlatform(p, platform); - if (platformTag.$?.package) { + if (isSPM && platformTag.$?.package) { continue; } const sourceFiles = getPlatformElement(p, platform, 'source-file'); From 76ff70e0e40bbbca63c5195c572f166e5ce82089 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of markemer)" Date: Fri, 8 May 2026 17:08:40 +0000 Subject: [PATCH 03/39] Release 8.3.3 --- CHANGELOG.md | 6 ++++++ android/CHANGELOG.md | 4 ++++ android/package.json | 2 +- cli/CHANGELOG.md | 6 ++++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 4 ++++ ios/package.json | 2 +- lerna.json | 2 +- 10 files changed, 29 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3851a6663..d4ad41ff2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) + +### Bug Fixes + +- **cli:** copy plugin files in CocoaPods projects ([#8467](https://github.com/ionic-team/capacitor/issues/8467)) ([b2d7719](https://github.com/ionic-team/capacitor/commit/b2d771926a180e60deea31992d7d4abcd5ca3bc7)) + ## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index ca3b6f0ef..d4b2fc534 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) + +**Note:** Version bump only for package @capacitor/android + ## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) ### Bug Fixes diff --git a/android/package.json b/android/package.json index 5ecf01e07..07db8a26e 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.3.2", + "version": "8.3.3", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 1cc5720a1..452ba4cc6 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) + +### Bug Fixes + +- **cli:** copy plugin files in CocoaPods projects ([#8467](https://github.com/ionic-team/capacitor/issues/8467)) ([b2d7719](https://github.com/ionic-team/capacitor/commit/b2d771926a180e60deea31992d7d4abcd5ca3bc7)) + ## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index abc3774df..cd17f5d2f 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.3.2", + "version": "8.3.3", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 08c8815c3..26f5723fe 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) + +**Note:** Version bump only for package @capacitor/core + ## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index bc3bebc0f..373249f98 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.3.2", + "version": "8.3.3", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index 111b642ac..b9b7863b0 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) + +**Note:** Version bump only for package @capacitor/ios + ## [8.3.2](https://github.com/ionic-team/capacitor/compare/8.3.1...8.3.2) (2026-05-07) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index 0972ed946..bd4c0a320 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.3.2", + "version": "8.3.3", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/lerna.json b/lerna.json index d0a1ebc02..d64bfcd44 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.3.2", + "version": "8.3.3", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From b7e167bbab47c57a5f72ff9e76a726ab7d8a1c1f Mon Sep 17 00:00:00 2001 From: "Alex J." Date: Tue, 12 May 2026 15:19:58 -0400 Subject: [PATCH 04/39] chore(cli): update telemetry endpoint (#8464) --- cli/src/ipc.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/ipc.ts b/cli/src/ipc.ts index 41894e53a..37c38110b 100644 --- a/cli/src/ipc.ts +++ b/cli/src/ipc.ts @@ -49,9 +49,9 @@ export async function receive(msg: IPCMessage): Promise { // This request is only made if telemetry is on. const req = request( { - hostname: 'api.ionicjs.com', + hostname: 'metrics-capacitor.outsystems.com', port: 443, - path: '/events/metrics', + path: '/metrics', method: 'POST', headers: { 'Content-Type': 'application/json', @@ -60,7 +60,7 @@ export async function receive(msg: IPCMessage): Promise { (response) => { debug('Sent %O metric to events service (status: %O)', data.name, response.statusCode); - if (response.statusCode !== 204) { + if (response.statusCode !== 202) { response.on('data', (chunk) => { debug('Bad response from events service. Request body: %O', chunk.toString()); }); From de1e506e48204f3d9a51bc911fafc341fd81fc36 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of alexgerardojacinto)" Date: Tue, 12 May 2026 20:38:58 +0000 Subject: [PATCH 05/39] Release 8.3.4 --- CHANGELOG.md | 4 ++++ android/CHANGELOG.md | 4 ++++ android/package.json | 2 +- cli/CHANGELOG.md | 4 ++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 4 ++++ ios/package.json | 2 +- lerna.json | 2 +- 10 files changed, 25 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4ad41ff2..a7f2b7713 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) + +**Note:** Version bump only for package capacitor + ## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index d4b2fc534..74d538d9f 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) + +**Note:** Version bump only for package @capacitor/android + ## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) **Note:** Version bump only for package @capacitor/android diff --git a/android/package.json b/android/package.json index 07db8a26e..8ae93f3f2 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.3.3", + "version": "8.3.4", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 452ba4cc6..bba24688f 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) + +**Note:** Version bump only for package @capacitor/cli + ## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index cd17f5d2f..9df346b14 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.3.3", + "version": "8.3.4", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 26f5723fe..017293794 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) + +**Note:** Version bump only for package @capacitor/core + ## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index 373249f98..eef113a50 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.3.3", + "version": "8.3.4", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index b9b7863b0..87ee73bb4 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) + +**Note:** Version bump only for package @capacitor/ios + ## [8.3.3](https://github.com/ionic-team/capacitor/compare/8.3.2...8.3.3) (2026-05-08) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index bd4c0a320..a7b8d3133 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.3.3", + "version": "8.3.4", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/lerna.json b/lerna.json index d64bfcd44..1e53d6bdc 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.3.3", + "version": "8.3.4", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 731a82e554d9c1270241897228e934c38759bbbb Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Thu, 21 May 2026 17:39:31 +0200 Subject: [PATCH 06/39] chore: format java code (#8475) --- .../com/getcapacitor/BridgeWebChromeClient.java | 12 ++++++------ .../src/main/java/com/getcapacitor/FileUtils.java | 6 +++--- .../src/main/java/com/getcapacitor/Plugin.java | 4 ++-- .../cordova/MockCordovaWebViewImpl.java | 14 ++++++-------- .../com/getcapacitor/plugin/CapacitorHttp.java | 4 ++-- .../java/com/getcapacitor/ConfigBuildingTest.java | 6 +++--- 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java index 6ca1c8a83..58371a9ff 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java @@ -246,14 +246,14 @@ public boolean onJsPrompt(WebView view, String url, String message, String defau public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { super.onGeolocationPermissionsShowPrompt(origin, callback); Logger.debug("onGeolocationPermissionsShowPrompt: DOING IT HERE FOR ORIGIN: " + origin); - final String[] geoPermissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; + final String[] geoPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}; if (!PermissionHelper.hasPermissions(bridge.getContext(), geoPermissions)) { permissionListener = (isGranted) -> { if (isGranted) { callback.invoke(origin, true, false); } else { - final String[] coarsePermission = { Manifest.permission.ACCESS_COARSE_LOCATION }; + final String[] coarsePermission = {Manifest.permission.ACCESS_COARSE_LOCATION}; if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && PermissionHelper.hasPermissions(bridge.getContext(), coarsePermission) @@ -294,7 +294,7 @@ public boolean onShowFileChooser( filePathCallback.onReceiveValue(null); } }; - final String[] camPermission = { Manifest.permission.CAMERA }; + final String[] camPermission = {Manifest.permission.CAMERA}; permissionLauncher.launch(camPermission); } } else { @@ -305,7 +305,7 @@ public boolean onShowFileChooser( } private boolean isMediaCaptureSupported() { - String[] permissions = { Manifest.permission.CAMERA }; + String[] permissions = {Manifest.permission.CAMERA}; return ( PermissionHelper.hasPermissions(bridge.getContext(), permissions) || !PermissionHelper.hasDefinedPermission(bridge.getContext(), Manifest.permission.CAMERA) @@ -343,7 +343,7 @@ private boolean showImageCapturePicker(final ValueCallback filePathCallba activityListener = (activityResult) -> { Uri[] result = null; if (activityResult.getResultCode() == Activity.RESULT_OK) { - result = new Uri[] { imageFileUri }; + result = new Uri[] {imageFileUri}; } filePathCallback.onReceiveValue(result); }; @@ -362,7 +362,7 @@ private boolean showVideoCapturePicker(final ValueCallback filePathCallba activityListener = (activityResult) -> { Uri[] result = null; if (activityResult.getResultCode() == Activity.RESULT_OK) { - result = new Uri[] { activityResult.getData().getData() }; + result = new Uri[] {activityResult.getData().getData()}; } filePathCallback.onReceiveValue(result); }; diff --git a/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java b/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java index ce09e7c2f..0fdf64feb 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java +++ b/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java @@ -118,7 +118,7 @@ else if (isMediaDocument(uri)) { } final String selection = "_id=?"; - final String[] selectionArgs = new String[] { split[1] }; + final String[] selectionArgs = new String[] {split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } @@ -195,7 +195,7 @@ private static String getDataColumn(Context context, Uri uri, String selection, String path = null; Cursor cursor = null; final String column = "_data"; - final String[] projection = { column }; + final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); @@ -292,7 +292,7 @@ private static String getPathToNonPrimaryVolume(Context context, String tag) { } private static String sanitizeFilename(String displayName) { - String[] badCharacters = new String[] { "..", "/" }; + String[] badCharacters = new String[] {"..", "/"}; String[] segments = displayName.split("/"); String fileName = segments[segments.length - 1]; for (String suspString : badCharacters) { diff --git a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java index 19c8b8b3a..e55d933cc 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java @@ -465,7 +465,7 @@ protected void requestAllPermissions(@NonNull PluginCall call, @NonNull String c * @param callbackName the name of the callback to run when the permission request is complete */ protected void requestPermissionForAlias(@NonNull String alias, @NonNull PluginCall call, @NonNull String callbackName) { - requestPermissionForAliases(new String[] { alias }, call, callbackName); + requestPermissionForAliases(new String[] {alias}, call, callbackName); } /** @@ -583,7 +583,7 @@ public void pluginRequestAllPermissions() { */ @Deprecated public void pluginRequestPermission(String permission, int requestCode) { - ActivityCompat.requestPermissions(getActivity(), new String[] { permission }, requestCode); + ActivityCompat.requestPermissions(getActivity(), new String[] {permission}, requestCode); } /** diff --git a/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java b/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java index 1115429d7..020c1457a 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java +++ b/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java @@ -70,14 +70,12 @@ public CapacitorEvalBridgeMode(WebView webView, CordovaInterface cordova) { @Override public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) { - cordova - .getActivity() - .runOnUiThread(() -> { - String js = queue.popAndEncodeAsJs(); - if (js != null) { - webView.evaluateJavascript(js, null); - } - }); + cordova.getActivity().runOnUiThread(() -> { + String js = queue.popAndEncodeAsJs(); + if (js != null) { + webView.evaluateJavascript(js, null); + } + }); } } diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java index 46bc17417..7d5ab337e 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java @@ -18,8 +18,8 @@ @CapacitorPlugin( permissions = { - @Permission(strings = { Manifest.permission.WRITE_EXTERNAL_STORAGE }, alias = "HttpWrite"), - @Permission(strings = { Manifest.permission.READ_EXTERNAL_STORAGE }, alias = "HttpRead") + @Permission(strings = {Manifest.permission.WRITE_EXTERNAL_STORAGE}, alias = "HttpWrite"), + @Permission(strings = {Manifest.permission.READ_EXTERNAL_STORAGE}, alias = "HttpRead") } ) public class CapacitorHttp extends Plugin { diff --git a/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java b/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java index 1af51039d..ae12edb02 100644 --- a/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java +++ b/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java @@ -42,7 +42,7 @@ public void setup() { config = new CapConfig.Builder(context) .setAllowMixedContent(true) - .setAllowNavigation(new String[] { "http://www.google.com" }) + .setAllowNavigation(new String[] {"http://www.google.com"}) .setAndroidScheme("test") .setCaptureInput(true) .setLoggingEnabled(true) @@ -64,7 +64,7 @@ public void setup() { @Test public void getCoreConfigValues() { assertTrue(config.isMixedContentAllowed()); - assertArrayEquals(new String[] { "http://www.google.com" }, config.getAllowNavigation()); + assertArrayEquals(new String[] {"http://www.google.com"}, config.getAllowNavigation()); assertEquals("test", config.getAndroidScheme()); assertTrue(config.isInputCaptured()); assertTrue(config.isLoggingEnabled()); @@ -97,7 +97,7 @@ public void getPluginInt() { @Test public void getPluginArray() { - String[] comparison = new String[] { "5", "6", "7", "8" }; + String[] comparison = new String[] {"5", "6", "7", "8"}; String[] testArray = config.getPluginConfiguration(TEST_PLUGIN_NAME).getArray("var5"); assertArrayEquals(comparison, testArray); } From bc745364129853769ca2fcfc3cc2a6c7624ee513 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Thu, 21 May 2026 18:04:37 +0200 Subject: [PATCH 07/39] chore: format java code (#8477) --- .../java/com/getcapacitor/BridgeWebChromeClient.java | 12 ++++++------ .../src/main/java/com/getcapacitor/FileUtils.java | 6 +++--- .../src/main/java/com/getcapacitor/Plugin.java | 4 ++-- .../java/com/getcapacitor/plugin/CapacitorHttp.java | 4 ++-- .../java/com/getcapacitor/ConfigBuildingTest.java | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java index 58371a9ff..6ca1c8a83 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java @@ -246,14 +246,14 @@ public boolean onJsPrompt(WebView view, String url, String message, String defau public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { super.onGeolocationPermissionsShowPrompt(origin, callback); Logger.debug("onGeolocationPermissionsShowPrompt: DOING IT HERE FOR ORIGIN: " + origin); - final String[] geoPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}; + final String[] geoPermissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; if (!PermissionHelper.hasPermissions(bridge.getContext(), geoPermissions)) { permissionListener = (isGranted) -> { if (isGranted) { callback.invoke(origin, true, false); } else { - final String[] coarsePermission = {Manifest.permission.ACCESS_COARSE_LOCATION}; + final String[] coarsePermission = { Manifest.permission.ACCESS_COARSE_LOCATION }; if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && PermissionHelper.hasPermissions(bridge.getContext(), coarsePermission) @@ -294,7 +294,7 @@ public boolean onShowFileChooser( filePathCallback.onReceiveValue(null); } }; - final String[] camPermission = {Manifest.permission.CAMERA}; + final String[] camPermission = { Manifest.permission.CAMERA }; permissionLauncher.launch(camPermission); } } else { @@ -305,7 +305,7 @@ public boolean onShowFileChooser( } private boolean isMediaCaptureSupported() { - String[] permissions = {Manifest.permission.CAMERA}; + String[] permissions = { Manifest.permission.CAMERA }; return ( PermissionHelper.hasPermissions(bridge.getContext(), permissions) || !PermissionHelper.hasDefinedPermission(bridge.getContext(), Manifest.permission.CAMERA) @@ -343,7 +343,7 @@ private boolean showImageCapturePicker(final ValueCallback filePathCallba activityListener = (activityResult) -> { Uri[] result = null; if (activityResult.getResultCode() == Activity.RESULT_OK) { - result = new Uri[] {imageFileUri}; + result = new Uri[] { imageFileUri }; } filePathCallback.onReceiveValue(result); }; @@ -362,7 +362,7 @@ private boolean showVideoCapturePicker(final ValueCallback filePathCallba activityListener = (activityResult) -> { Uri[] result = null; if (activityResult.getResultCode() == Activity.RESULT_OK) { - result = new Uri[] {activityResult.getData().getData()}; + result = new Uri[] { activityResult.getData().getData() }; } filePathCallback.onReceiveValue(result); }; diff --git a/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java b/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java index 0fdf64feb..ce09e7c2f 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java +++ b/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java @@ -118,7 +118,7 @@ else if (isMediaDocument(uri)) { } final String selection = "_id=?"; - final String[] selectionArgs = new String[] {split[1]}; + final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } @@ -195,7 +195,7 @@ private static String getDataColumn(Context context, Uri uri, String selection, String path = null; Cursor cursor = null; final String column = "_data"; - final String[] projection = {column}; + final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); @@ -292,7 +292,7 @@ private static String getPathToNonPrimaryVolume(Context context, String tag) { } private static String sanitizeFilename(String displayName) { - String[] badCharacters = new String[] {"..", "/"}; + String[] badCharacters = new String[] { "..", "/" }; String[] segments = displayName.split("/"); String fileName = segments[segments.length - 1]; for (String suspString : badCharacters) { diff --git a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java index e55d933cc..19c8b8b3a 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Plugin.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Plugin.java @@ -465,7 +465,7 @@ protected void requestAllPermissions(@NonNull PluginCall call, @NonNull String c * @param callbackName the name of the callback to run when the permission request is complete */ protected void requestPermissionForAlias(@NonNull String alias, @NonNull PluginCall call, @NonNull String callbackName) { - requestPermissionForAliases(new String[] {alias}, call, callbackName); + requestPermissionForAliases(new String[] { alias }, call, callbackName); } /** @@ -583,7 +583,7 @@ public void pluginRequestAllPermissions() { */ @Deprecated public void pluginRequestPermission(String permission, int requestCode) { - ActivityCompat.requestPermissions(getActivity(), new String[] {permission}, requestCode); + ActivityCompat.requestPermissions(getActivity(), new String[] { permission }, requestCode); } /** diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java index 7d5ab337e..46bc17417 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java @@ -18,8 +18,8 @@ @CapacitorPlugin( permissions = { - @Permission(strings = {Manifest.permission.WRITE_EXTERNAL_STORAGE}, alias = "HttpWrite"), - @Permission(strings = {Manifest.permission.READ_EXTERNAL_STORAGE}, alias = "HttpRead") + @Permission(strings = { Manifest.permission.WRITE_EXTERNAL_STORAGE }, alias = "HttpWrite"), + @Permission(strings = { Manifest.permission.READ_EXTERNAL_STORAGE }, alias = "HttpRead") } ) public class CapacitorHttp extends Plugin { diff --git a/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java b/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java index ae12edb02..1af51039d 100644 --- a/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java +++ b/android/capacitor/src/test/java/com/getcapacitor/ConfigBuildingTest.java @@ -42,7 +42,7 @@ public void setup() { config = new CapConfig.Builder(context) .setAllowMixedContent(true) - .setAllowNavigation(new String[] {"http://www.google.com"}) + .setAllowNavigation(new String[] { "http://www.google.com" }) .setAndroidScheme("test") .setCaptureInput(true) .setLoggingEnabled(true) @@ -64,7 +64,7 @@ public void setup() { @Test public void getCoreConfigValues() { assertTrue(config.isMixedContentAllowed()); - assertArrayEquals(new String[] {"http://www.google.com"}, config.getAllowNavigation()); + assertArrayEquals(new String[] { "http://www.google.com" }, config.getAllowNavigation()); assertEquals("test", config.getAndroidScheme()); assertTrue(config.isInputCaptured()); assertTrue(config.isLoggingEnabled()); @@ -97,7 +97,7 @@ public void getPluginInt() { @Test public void getPluginArray() { - String[] comparison = new String[] {"5", "6", "7", "8"}; + String[] comparison = new String[] { "5", "6", "7", "8" }; String[] testArray = config.getPluginConfiguration(TEST_PLUGIN_NAME).getArray("var5"); assertArrayEquals(comparison, testArray); } From 93c72de40a2ec4c78b33659250cb08340083088e Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Thu, 21 May 2026 18:54:21 +0200 Subject: [PATCH 08/39] feat: add method getDouble to plugin config (#7638) Co-authored-by: jcesarmobile --- .../java/com/getcapacitor/PluginConfig.java | 11 ++++++++++ .../java/com/getcapacitor/util/JSONUtils.java | 20 +++++++++++++++++++ ios/Capacitor/Capacitor/PluginConfig.swift | 7 +++++++ 3 files changed, 38 insertions(+) diff --git a/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java b/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java index 0f00fc530..1d21ae90e 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java +++ b/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java @@ -65,6 +65,17 @@ public int getInt(String configKey, int defaultValue) { return JSONUtils.getInt(config, configKey, defaultValue); } + /** + * Get a double value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + public double getDouble(String configKey, double defaultValue) { + return JSONUtils.getDouble(config, configKey, defaultValue); + } + /** * Get a string array value for a plugin in the Capacitor config. * diff --git a/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java b/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java index 1d2fc2078..f24e5aa0b 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java +++ b/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java @@ -75,6 +75,26 @@ public static int getInt(JSONObject jsonObject, String key, int defaultValue) { return defaultValue; } + /** + * Get a double value from the given JSON object. + * + * @param jsonObject A JSON object to search + * @param key A key to fetch from the JSON object + * @param defaultValue A default value to return if the key cannot be found + * @return The value at the given key in the JSON object, or the default value + */ + public static double getDouble(JSONObject jsonObject, String key, double defaultValue) { + String k = getDeepestKey(key); + try { + JSONObject o = getDeepestObject(jsonObject, key); + return o.getDouble(k); + } catch (JSONException ignore) { + // value was not found + } + + return defaultValue; + } + /** * Get a JSON object value from the given JSON object. * diff --git a/ios/Capacitor/Capacitor/PluginConfig.swift b/ios/Capacitor/Capacitor/PluginConfig.swift index f2461e102..8d73bc1de 100644 --- a/ios/Capacitor/Capacitor/PluginConfig.swift +++ b/ios/Capacitor/Capacitor/PluginConfig.swift @@ -30,6 +30,13 @@ import Foundation return defaultValue } + @objc public func getDouble(_ configKey: String, _ defaultValue: Double) -> Double { + if let val = (self.config)[keyPath: KeyPath(configKey)] as? Double { + return val + } + return defaultValue + } + public func getArray(_ configKey: String, _ defaultValue: JSArray? = nil) -> JSArray? { if let val = (self.config)[keyPath: KeyPath(configKey)] as? JSArray { return val From e456de083e19644f484bec5a5359cb67960ac8bc Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Fri, 22 May 2026 13:39:38 -0500 Subject: [PATCH 09/39] fix(SystemBars): make `safe-area-inset-x` available on API <= 34 (#8424) --- .../com/getcapacitor/plugin/SystemBars.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index b335b4b1c..76e74207c 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -164,13 +164,18 @@ private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { } private void initSafeAreaCSSVariables() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { + WindowInsetsCompat insets; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { View v = (View) this.getBridge().getWebView().getParent(); - WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(v); - if (insets != null) { - Insets safeAreaInsets = calcSafeAreaInsets(insets); - injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); - } + insets = ViewCompat.getRootWindowInsets(v); + } else { + insets = WindowInsetsCompat.CONSUMED; + } + + if (insets != null) { + Insets safeAreaInsets = calcSafeAreaInsets(insets); + injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); } } @@ -186,10 +191,8 @@ private void initWindowInsetsListener() { // We need to correct for a possible shown IME v.setPadding(0, 0, 0, keyboardVisible ? imeInsets.bottom : 0); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { - Insets safeAreaInsets = calcSafeAreaInsets(insets); - injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); - } + Insets safeAreaInsets = calcSafeAreaInsets(insets); + injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); return new WindowInsetsCompat.Builder(insets) .setInsets( @@ -221,10 +224,8 @@ private void initWindowInsetsListener() { .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) .build(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && hasViewportCover && insetHandlingEnabled) { - Insets safeAreaInsets = calcSafeAreaInsets(newInsets); - injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); - } + Insets safeAreaInsets = calcSafeAreaInsets(newInsets); + injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); return newInsets; }); From 258867b7bf37b1837b99b02ec9638e5a6df08d97 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 26 May 2026 12:00:02 +0200 Subject: [PATCH 10/39] feat(cli): add experimental packageOptions (#8471) --- cli/src/declarations.ts | 20 ++++++++++++++++++++ cli/src/ios/update.ts | 3 +++ cli/src/util/spm.ts | 21 ++++++++++++++++++--- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 6c8645406..bda7ff0c0 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -559,6 +559,13 @@ export interface CapacitorConfig { * @since 8.3.0 */ packageTraits?: { [pluginId: string]: string[] }; + /** + * Define options to apply to the package. + * The key is the plugin ID (e.g. `@capacitor-community/device`) + * + * @since 8.4.0 + */ + packageOptions?: { [pluginId: string]: PackageOptions }; }; }; }; @@ -799,3 +806,16 @@ export interface PluginsConfig { animation?: 'FADE' | 'NONE'; }; } + +export interface PackageOptions { + /** + * Create a symlink to the plugin folder instead of pointing to the plugin path. + * Useful when plugin names conflict. + */ + symlink?: boolean; + /** + * Useful to avoid target name conflicts in dependencies + * [see](https://docs.swift.org/swiftpm/documentation/packagemanagerdocs/modulealiasing/) + */ + moduleAliases?: { [target: string]: string }; +} diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 82ca85a88..b060e59a8 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -639,6 +639,9 @@ async function copyPluginsNativeFiles(config: Config, cordovaPlugins: Plugin[]) async function removePluginsNativeFiles(config: Config) { await remove(config.ios.cordovaPluginsDirAbs); + if ((await config.ios.packageManager) === 'SPM') { + await remove(join(config.ios.nativeProjectDirAbs, 'CapApp-SPM', 'symlinks')); + } await extractTemplate(config.cli.assets.ios.cordovaPluginsTemplateArchiveAbs, config.ios.cordovaPluginsDirAbs); } diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 7d15787ce..2ef26bcda 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -1,4 +1,4 @@ -import { pathExists, existsSync, readFileSync, writeFileSync, remove, move, mkdtemp } from 'fs-extra'; +import { ensureSymlink, pathExists, existsSync, readFileSync, writeFileSync, remove, move, mkdtemp } from 'fs-extra'; import { tmpdir } from 'os'; import { join, relative, resolve } from 'path'; import type { PlistObject } from 'plist'; @@ -100,6 +100,7 @@ export async function generatePackageText(config: Config, plugins: Plugin[]): Pr const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); const iosVersion = getMajoriOSVersion(config); const packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {}; + const packageOptions = config.app.extConfig.experimental?.ios?.spm?.packageOptions ?? {}; const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9'; let packageSwiftText = `// swift-tools-version: ${swiftToolsVersion} @@ -132,7 +133,13 @@ let package = Package( packageSwiftText += `,\n .package(name: "${plugin.name}", path: "../../capacitor-cordova-ios-plugins/sources/${plugin.name}")`; } } else { - const relPath = relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath); + const options = packageOptions[plugin.id]; + const symlink = options?.symlink; + const symlinkFolder = join('symlinks', plugin.name); + const relPath = symlink ? symlinkFolder : relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath); + if (symlink) { + await ensureSymlink(plugin.rootPath, resolve(config.ios.nativeProjectDirAbs, 'CapApp-SPM', symlinkFolder)); + } const traits = packageTraits[plugin.id]; const traitsSuffix = traits?.length ? `, traits: [${traits @@ -156,7 +163,15 @@ let package = Package( .product(name: "Cordova", package: "capacitor-swift-pm")`; for (const plugin of plugins) { - let pluginText = `,\n .product(name: "${plugin.ios?.name}", package: "${plugin.ios?.name}")`; + const aliases = Object.entries(packageOptions[plugin.id]?.moduleAliases ?? {}); + const aliasText = aliases?.length + ? `, moduleAliases: [${aliases + .map(([target, replacement]) => { + return `"${target}": "${replacement}"`; + }) + .join(', ')}]` + : ''; + let pluginText = `,\n .product(name: "${plugin.ios?.name}", package: "${plugin.ios?.name}"${aliasText})`; if (getPluginType(plugin, config.ios.name) === PluginType.Cordova) { const platformTag = getPluginPlatform(plugin, config.ios.name); if (platformTag.$?.package) { From b4b297a52f8732659662d5e5aaeff81c0f7d9835 Mon Sep 17 00:00:00 2001 From: "Alex J." Date: Wed, 27 May 2026 14:49:32 -0400 Subject: [PATCH 11/39] feat(cli): capture ios_package_manager in telemetry (#8482) --- cli/src/telemetry.ts | 25 +++++++++++++++- cli/test/telemetry.spec.ts | 60 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 cli/test/telemetry.spec.ts diff --git a/cli/src/telemetry.ts b/cli/src/telemetry.ts index 8e0d847ac..593397502 100644 --- a/cli/src/telemetry.ts +++ b/cli/src/telemetry.ts @@ -1,8 +1,9 @@ import { Command } from 'commander'; import Debug from 'debug'; +import { pathExists } from 'fs-extra'; import c from './colors'; -import type { Config } from './definitions'; +import type { Config, PackageManager } from './definitions'; import { send } from './ipc'; import { output } from './log'; import { readConfig, writeConfig } from './sysconfig'; @@ -26,6 +27,7 @@ export interface CommandMetricData { error: string | null; node_version: string; os: string; + ios_package_manager: PackageManager | 'unknown'; } export interface Metric { @@ -80,9 +82,12 @@ export function telemetryAction(config: Config, action: CommanderAction): Comman error: error ? (error.message ? error.message : String(error)) : null, node_version: process.version, os: config.cli.os, + ios_package_manager: await getIOSPackageManager(config), ...Object.fromEntries(versions), }; + debug('metric payload: %O', data); + if (isInteractive()) { let sysconfig = await readConfig(); @@ -126,6 +131,24 @@ export async function sendMetric( } } +/** + * Resolve the iOS dependency manager for telemetry. Returns 'unknown' for + * non-iOS projects or when detection throws, so callers never have to handle + * errors from this signal. + */ +export async function getIOSPackageManager(config: Config): Promise { + try { + if (!(await pathExists(config.ios.platformDirAbs))) { + return 'unknown'; + } + + return await config.ios.packageManager; + } catch (e) { + debug('Could not resolve iOS package manager for telemetry: %O', e); + return 'unknown'; + } +} + /** * Get a unique anonymous identifier for this app. */ diff --git a/cli/test/telemetry.spec.ts b/cli/test/telemetry.spec.ts new file mode 100644 index 000000000..412048527 --- /dev/null +++ b/cli/test/telemetry.spec.ts @@ -0,0 +1,60 @@ +import { pathExists } from 'fs-extra'; + +import type { Config, IOSConfig } from '../src/definitions'; +import { getIOSPackageManager } from '../src/telemetry'; + +jest.mock('fs-extra', () => ({ + pathExists: jest.fn(), +})); + +const mockedPathExists = pathExists as unknown as jest.Mock; + +function makeConfig(ios: Partial): Config { + return { ios } as unknown as Config; +} + +describe('getIOSPackageManager', () => { + beforeEach(() => { + mockedPathExists.mockReset(); + }); + + it('returns "unknown" when the iOS platform directory does not exist', async () => { + mockedPathExists.mockResolvedValueOnce(false); + + const result = await getIOSPackageManager( + makeConfig({ + platformDirAbs: '/tmp/no-such-dir/ios', + packageManager: Promise.resolve('SPM'), + }), + ); + + expect(result).toBe('unknown'); + expect(mockedPathExists).toHaveBeenCalledWith('/tmp/no-such-dir/ios'); + }); + + it('returns the resolved package manager when iOS is present', async () => { + mockedPathExists.mockResolvedValueOnce(true); + + const result = await getIOSPackageManager( + makeConfig({ + platformDirAbs: '/tmp/app/ios', + packageManager: Promise.resolve('SPM'), + }), + ); + + expect(result).toBe('SPM'); + }); + + it('returns "unknown" when packageManager resolution throws', async () => { + mockedPathExists.mockResolvedValueOnce(true); + + const result = await getIOSPackageManager( + makeConfig({ + platformDirAbs: '/tmp/app/ios', + packageManager: Promise.reject(new Error('boom')), + }), + ); + + expect(result).toBe('unknown'); + }); +}); From 1d031a4abec2c793079ba8897ad2e40c4cc6c7f9 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Thu, 28 May 2026 15:00:43 +0200 Subject: [PATCH 12/39] fix(cli): revert live reload config on failure (#8485) --- cli/src/tasks/run.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cli/src/tasks/run.ts b/cli/src/tasks/run.ts index 2abdb9cd2..439c29209 100644 --- a/cli/src/tasks/run.ts +++ b/cli/src/tasks/run.ts @@ -116,6 +116,9 @@ export async function runCommand( await sleepForever(); } } catch (e: any) { + if (options.liveReload) { + await CapLiveReloadHelper.revertCapConfigForLiveReload(); + } if (!isFatal(e)) { fatal(e.stack ?? e); } From f1077ef9645b1ada2dd2635e3c3220612bdb4da6 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 29 May 2026 11:02:23 +0200 Subject: [PATCH 13/39] chore: fix typo in declarations.ts (#8488) --- cli/src/declarations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index bda7ff0c0..1103b6585 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -604,7 +604,7 @@ export interface CapacitorConfig { * Configure the local scheme on Android. * * Custom schemes on Android are unable to change the URL path as of Webview 117. Changing this value from anything other than `http` or `https` can result in your - * application unable to resolve routing. If you must change this for some reason, consider using a hash-based url strategy, but there are no guarentees that this + * application unable to resolve routing. If you must change this for some reason, consider using a hash-based url strategy, but there are no guarantees that this * will continue to work long term as allowing non-standard schemes to modify query parameters and url fragments is only allowed for compatibility reasons. * https://ionic.io/blog/capacitor-android-customscheme-issue-with-chrome-117 * From d4ad7ffe39daf66e0cfc63af9028d5c05543bde7 Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Mon, 1 Jun 2026 10:31:48 -0500 Subject: [PATCH 14/39] fix(SystemBars): respect `insetsHandling` disable (#8481) --- .../com/getcapacitor/plugin/SystemBars.java | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 76e74207c..29b76e2f2 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -16,6 +16,7 @@ import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; import androidx.webkit.WebViewCompat; +import com.getcapacitor.Logger; import com.getcapacitor.Plugin; import com.getcapacitor.PluginCall; import com.getcapacitor.PluginMethod; @@ -32,6 +33,7 @@ public class SystemBars extends Plugin { static final String BAR_STATUS_BAR = "StatusBar"; static final String BAR_GESTURE_BAR = "NavigationBar"; + // TODO: In Cap 9, add an additional option "full" static final String INSETS_HANDLING_CSS = "css"; static final String INSETS_HANDLING_DISABLE = "disable"; @@ -53,7 +55,7 @@ function capacitorSystemBarsCheckMetaViewport() { capacitorSystemBarsCheckMetaViewport(); """; - private boolean insetHandlingEnabled = true; + private String insetsHandling = INSETS_HANDLING_CSS; private boolean hasViewportCover = false; private String currentStatusBarStyle = STYLE_DEFAULT; @@ -94,9 +96,15 @@ private void initSystemBars() { String style = getConfig().getString("style", STYLE_DEFAULT).toUpperCase(Locale.US); boolean hidden = getConfig().getBoolean("hidden", false); - String insetsHandling = getConfig().getString("insetsHandling", "css"); - if (insetsHandling.equals(INSETS_HANDLING_DISABLE)) { - insetHandlingEnabled = false; + String configuredInsetsHandling = getConfig().getString("insetsHandling", INSETS_HANDLING_CSS); + if (INSETS_HANDLING_CSS.equals(configuredInsetsHandling) || INSETS_HANDLING_DISABLE.equals(configuredInsetsHandling)) { + insetsHandling = configuredInsetsHandling; + } else { + Logger.warn( + "SystemBars", + "Unknown insetsHandling value '" + configuredInsetsHandling + "'. Falling back to '" + INSETS_HANDLING_CSS + "'." + ); + insetsHandling = INSETS_HANDLING_CSS; } initWindowInsetsListener(); @@ -146,13 +154,15 @@ public void setAnimation(final PluginCall call) { @JavascriptInterface public void onDOMReady() { - getActivity().runOnUiThread(() -> { - this.bridge.getWebView().evaluateJavascript(viewportMetaJSFunction, (res) -> { - hasViewportCover = res.equals("true"); + if (INSETS_HANDLING_CSS.equals(insetsHandling)) { + getActivity().runOnUiThread(() -> { + this.bridge.getWebView().evaluateJavascript(viewportMetaJSFunction, (res) -> { + hasViewportCover = res.equals("true"); - getBridge().getWebView().requestApplyInsets(); + getBridge().getWebView().requestApplyInsets(); + }); }); - }); + } } private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { @@ -164,22 +174,28 @@ private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { } private void initSafeAreaCSSVariables() { - WindowInsetsCompat insets; + if (INSETS_HANDLING_CSS.equals(insetsHandling)) { + WindowInsetsCompat insets; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { - View v = (View) this.getBridge().getWebView().getParent(); - insets = ViewCompat.getRootWindowInsets(v); - } else { - insets = WindowInsetsCompat.CONSUMED; - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { + View v = (View) this.getBridge().getWebView().getParent(); + insets = ViewCompat.getRootWindowInsets(v); + } else { + insets = WindowInsetsCompat.CONSUMED; + } - if (insets != null) { - Insets safeAreaInsets = calcSafeAreaInsets(insets); - injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); + if (insets != null) { + Insets safeAreaInsets = calcSafeAreaInsets(insets); + injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); + } } } private void initWindowInsetsListener() { + if (INSETS_HANDLING_DISABLE.equals(insetsHandling)) { + return; + } + ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { boolean shouldPassthroughInsets = getWebViewMajorVersion() >= WEBVIEW_VERSION_WITH_SAFE_AREA_FIX && hasViewportCover; From 4c6c3219afb5223211e857457e46283c37eb9424 Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Mon, 1 Jun 2026 21:04:08 +0200 Subject: [PATCH 15/39] fix(android): show only the requested system bar (#8480) Co-authored-by: Joey Pender Co-authored-by: Pedro Bilro Co-authored-by: Mark Anderson --- .../com/getcapacitor/plugin/SystemBars.java | 14 ++-- .../getcapacitor/plugin/SystemBarsTest.java | 73 +++++++++++++++++++ 2 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 29b76e2f2..fd7137094 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -304,19 +304,21 @@ private void setHidden(boolean hide, String bar) { WindowInsetsControllerCompat windowInsetsControllerCompat = WindowCompat.getInsetsController(window, window.getDecorView()); if (hide) { - if (bar.isEmpty() || bar.equals(BAR_STATUS_BAR)) { + if (bar.isEmpty()) { + windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.systemBars()); + } else if (bar.equals(BAR_STATUS_BAR)) { windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.statusBars()); - } - if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) { + } else if (bar.equals(BAR_GESTURE_BAR)) { windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.navigationBars()); } return; } - if (bar.isEmpty() || bar.equals(BAR_STATUS_BAR)) { + if (bar.isEmpty()) { windowInsetsControllerCompat.show(WindowInsetsCompat.Type.systemBars()); - } - if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) { + } else if (bar.equals(BAR_STATUS_BAR)) { + windowInsetsControllerCompat.show(WindowInsetsCompat.Type.statusBars()); + } else if (bar.equals(BAR_GESTURE_BAR)) { windowInsetsControllerCompat.show(WindowInsetsCompat.Type.navigationBars()); } } diff --git a/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java b/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java new file mode 100644 index 000000000..f72373a88 --- /dev/null +++ b/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java @@ -0,0 +1,73 @@ +package com.getcapacitor.plugin; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.view.View; +import android.view.Window; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; +import com.getcapacitor.Bridge; +import java.lang.reflect.Method; +import org.junit.Test; +import org.mockito.MockedStatic; + +public class SystemBarsTest { + + @Test + public void showWithEmptyBarShowsSystemBars() throws Exception { + WindowInsetsControllerCompat controller = invokeSetHidden(""); + + verify(controller).show(WindowInsetsCompat.Type.systemBars()); + verify(controller, never()).show(WindowInsetsCompat.Type.statusBars()); + verify(controller, never()).show(WindowInsetsCompat.Type.navigationBars()); + } + + @Test + public void showWithStatusBarShowsOnlyStatusBars() throws Exception { + WindowInsetsControllerCompat controller = invokeSetHidden("StatusBar"); + + verify(controller).show(WindowInsetsCompat.Type.statusBars()); + verify(controller, never()).show(WindowInsetsCompat.Type.systemBars()); + verify(controller, never()).show(WindowInsetsCompat.Type.navigationBars()); + } + + @Test + public void showWithNavigationBarShowsOnlyNavigationBars() throws Exception { + WindowInsetsControllerCompat controller = invokeSetHidden("NavigationBar"); + + verify(controller).show(WindowInsetsCompat.Type.navigationBars()); + verify(controller, never()).show(WindowInsetsCompat.Type.systemBars()); + verify(controller, never()).show(WindowInsetsCompat.Type.statusBars()); + } + + private WindowInsetsControllerCompat invokeSetHidden(String bar) throws Exception { + SystemBars plugin = new SystemBars(); + Bridge bridge = mock(Bridge.class); + AppCompatActivity activity = mock(AppCompatActivity.class); + Window window = mock(Window.class); + View decorView = mock(View.class); + WindowInsetsControllerCompat controller = mock(WindowInsetsControllerCompat.class); + + when(bridge.getActivity()).thenReturn(activity); + when(activity.getWindow()).thenReturn(window); + when(window.getDecorView()).thenReturn(decorView); + + plugin.setBridge(bridge); + + try (MockedStatic windowCompat = mockStatic(WindowCompat.class)) { + windowCompat.when(() -> WindowCompat.getInsetsController(window, decorView)).thenReturn(controller); + + Method setHidden = SystemBars.class.getDeclaredMethod("setHidden", boolean.class, String.class); + setHidden.setAccessible(true); + setHidden.invoke(plugin, false, bar); + } + + return controller; + } +} From 36b729d10380687bf5eab2cfa8affcbd1655541b Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 1 Jun 2026 15:11:51 -0400 Subject: [PATCH 16/39] chore: Decrease timeout for CI jobs from 60 to 30 minutes (#8476) Co-authored-by: jcesarmobile --- .github/workflows/ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8664a402d..56fce5389 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ concurrency: jobs: setup: runs-on: ubuntu-latest - timeout-minutes: 60 + timeout-minutes: 30 steps: - name: Get Latest uses: actions/setup-node@v6 @@ -32,7 +32,7 @@ jobs: key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} lint: runs-on: macos-15 - timeout-minutes: 60 + timeout-minutes: 30 steps: - uses: actions/setup-node@v6 with: @@ -48,7 +48,7 @@ jobs: - run: npm run lint test-cli: runs-on: macos-15 - timeout-minutes: 60 + timeout-minutes: 30 needs: - setup - lint @@ -69,7 +69,7 @@ jobs: working-directory: ./cli test-core: runs-on: ubuntu-latest - timeout-minutes: 60 + timeout-minutes: 30 needs: - setup - lint @@ -90,7 +90,7 @@ jobs: working-directory: ./core test-ios: runs-on: macos-15 - timeout-minutes: 60 + timeout-minutes: 30 needs: - setup - lint @@ -118,7 +118,7 @@ jobs: run: sh ./scripts/native-podspec.sh lint test-android: runs-on: ubuntu-latest - timeout-minutes: 60 + timeout-minutes: 30 needs: - setup - lint From 41fd9deb6df07ef83ae390d16824e8bcbefef517 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of markemer)" Date: Tue, 2 Jun 2026 15:56:03 +0000 Subject: [PATCH 17/39] Release 8.4.0 --- CHANGELOG.md | 15 +++++++++++++++ android/CHANGELOG.md | 12 ++++++++++++ android/package.json | 4 ++-- cli/CHANGELOG.md | 11 +++++++++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 6 ++++++ ios/package.json | 4 ++-- lerna.json | 2 +- 10 files changed, 55 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7f2b7713..cd4fe5f5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) + +### Bug Fixes + +- **android:** show only the requested system bar ([#8480](https://github.com/ionic-team/capacitor/issues/8480)) ([4c6c321](https://github.com/ionic-team/capacitor/commit/4c6c3219afb5223211e857457e46283c37eb9424)) +- **cli:** revert live reload config on failure ([#8485](https://github.com/ionic-team/capacitor/issues/8485)) ([1d031a4](https://github.com/ionic-team/capacitor/commit/1d031a4abec2c793079ba8897ad2e40c4cc6c7f9)) +- **SystemBars:** make `safe-area-inset-x` available on API <= 34 ([#8424](https://github.com/ionic-team/capacitor/issues/8424)) ([e456de0](https://github.com/ionic-team/capacitor/commit/e456de083e19644f484bec5a5359cb67960ac8bc)) +- **SystemBars:** respect `insetsHandling` disable ([#8481](https://github.com/ionic-team/capacitor/issues/8481)) ([d4ad7ff](https://github.com/ionic-team/capacitor/commit/d4ad7ffe39daf66e0cfc63af9028d5c05543bde7)) + +### Features + +- add method getDouble to plugin config ([#7638](https://github.com/ionic-team/capacitor/issues/7638)) ([93c72de](https://github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e)) +- **cli:** add experimental packageOptions ([#8471](https://github.com/ionic-team/capacitor/issues/8471)) ([258867b](https://github.com/ionic-team/capacitor/commit/258867b7bf37b1837b99b02ec9638e5a6df08d97)) +- **cli:** capture ios_package_manager in telemetry ([#8482](https://github.com/ionic-team/capacitor/issues/8482)) ([b4b297a](https://github.com/ionic-team/capacitor/commit/b4b297a52f8732659662d5e5aaeff81c0f7d9835)) + ## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) **Note:** Version bump only for package capacitor diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 74d538d9f..df7ce545e 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,18 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) + +### Bug Fixes + +- **android:** show only the requested system bar ([#8480](https://github.com/ionic-team/capacitor/issues/8480)) ([4c6c321](https://github.com/ionic-team/capacitor/commit/4c6c3219afb5223211e857457e46283c37eb9424)) +- **SystemBars:** make `safe-area-inset-x` available on API <= 34 ([#8424](https://github.com/ionic-team/capacitor/issues/8424)) ([e456de0](https://github.com/ionic-team/capacitor/commit/e456de083e19644f484bec5a5359cb67960ac8bc)) +- **SystemBars:** respect `insetsHandling` disable ([#8481](https://github.com/ionic-team/capacitor/issues/8481)) ([d4ad7ff](https://github.com/ionic-team/capacitor/commit/d4ad7ffe39daf66e0cfc63af9028d5c05543bde7)) + +### Features + +- add method getDouble to plugin config ([#7638](https://github.com/ionic-team/capacitor/issues/7638)) ([93c72de](https://github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e)) + ## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) **Note:** Version bump only for package @capacitor/android diff --git a/android/package.json b/android/package.json index 8ae93f3f2..af3f4f556 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.3.4", + "version": "8.4.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", @@ -23,7 +23,7 @@ "verify": "./gradlew clean lint build test -b capacitor/build.gradle" }, "peerDependencies": { - "@capacitor/core": "^8.3.0" + "@capacitor/core": "^8.4.0" }, "publishConfig": { "access": "public" diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index bba24688f..ee48a8d5f 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) + +### Bug Fixes + +- **cli:** revert live reload config on failure ([#8485](https://github.com/ionic-team/capacitor/issues/8485)) ([1d031a4](https://github.com/ionic-team/capacitor/commit/1d031a4abec2c793079ba8897ad2e40c4cc6c7f9)) + +### Features + +- **cli:** add experimental packageOptions ([#8471](https://github.com/ionic-team/capacitor/issues/8471)) ([258867b](https://github.com/ionic-team/capacitor/commit/258867b7bf37b1837b99b02ec9638e5a6df08d97)) +- **cli:** capture ios_package_manager in telemetry ([#8482](https://github.com/ionic-team/capacitor/issues/8482)) ([b4b297a](https://github.com/ionic-team/capacitor/commit/b4b297a52f8732659662d5e5aaeff81c0f7d9835)) + ## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) **Note:** Version bump only for package @capacitor/cli diff --git a/cli/package.json b/cli/package.json index 9df346b14..1f987d33a 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.3.4", + "version": "8.4.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 017293794..1de9522ff 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) + +**Note:** Version bump only for package @capacitor/core + ## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index eef113a50..b22aef174 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.3.4", + "version": "8.4.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index 87ee73bb4..eac0a4a1c 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) + +### Features + +- add method getDouble to plugin config ([#7638](https://github.com/ionic-team/capacitor/issues/7638)) ([93c72de](https://github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e)) + ## [8.3.4](https://github.com/ionic-team/capacitor/compare/8.3.3...8.3.4) (2026-05-12) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index a7b8d3133..a58c02090 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.3.4", + "version": "8.4.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", @@ -25,7 +25,7 @@ "xc:build:CapacitorCordova": "cd CapacitorCordova && xcodebuild && cd .." }, "peerDependencies": { - "@capacitor/core": "^8.3.0" + "@capacitor/core": "^8.4.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index 1e53d6bdc..b2efb400d 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.3.4", + "version": "8.4.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 28bb2c687069dfdd6aa7abc866004a1c6388d103 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 2 Jun 2026 21:31:41 +0200 Subject: [PATCH 18/39] fix(cli): patch Capacitor SPM dependency version in plugins (#8492) Co-authored-by: Mark Anderson --- cli/src/ios/update.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index b060e59a8..1f4bc87d0 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -1,5 +1,6 @@ import { copy, remove, pathExists, readFile, realpath, writeFile } from 'fs-extra'; import { basename, dirname, join, relative } from 'path'; +import { major } from 'semver'; import c from '../colors'; import { checkPlatformVersions, getCapacitorPackageVersion, runTask } from '../common'; @@ -58,6 +59,28 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: await generateCordovaPackageFiles(cordovaPlugins, config); const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); + await Promise.all( + validSPMPackages.map(async (plugin) => { + const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); + const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); + let content = await readFile(packageSwiftPath, { encoding: 'utf-8' }); + const regex = new RegExp( + 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*from:\\s*"([^"]+)"', + ); + const version = content.match(regex)?.[1]; + const majorCapVersion = major(iosPlatformVersion); + if (version && major(version) != majorCapVersion) { + content = setAllStringIn( + content, + `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, + `)`, + ` from: "${majorCapVersion}.0.0"`, + ); + await writeFile(packageSwiftPath, content); + logger.warn(`${plugin.id} is built for Capacitor ${major(version)}, it might cause issues`); + } + }), + ); await generatePackageFile(config, validSPMPackages.concat(cordovaPlugins)); } else { From 6048e90171afa0229a3c25b52a23c377c6bb804c Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Mon, 15 Jun 2026 12:11:19 +0200 Subject: [PATCH 19/39] fix(cli): make SPM dependency patch work on prereleases (#8508) --- cli/src/ios/update.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 1f4bc87d0..3ab793c25 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -1,6 +1,6 @@ import { copy, remove, pathExists, readFile, realpath, writeFile } from 'fs-extra'; import { basename, dirname, join, relative } from 'path'; -import { major } from 'semver'; +import { major, prerelease } from 'semver'; import c from '../colors'; import { checkPlatformVersions, getCapacitorPackageVersion, runTask } from '../common'; @@ -70,11 +70,13 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: const version = content.match(regex)?.[1]; const majorCapVersion = major(iosPlatformVersion); if (version && major(version) != majorCapVersion) { + const preCapVersion = prerelease(iosPlatformVersion); + const forceVersion = preCapVersion ? iosPlatformVersion : `${majorCapVersion}.0.0`; content = setAllStringIn( content, `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, `)`, - ` from: "${majorCapVersion}.0.0"`, + ` from: "${forceVersion}"`, ); await writeFile(packageSwiftPath, content); logger.warn(`${plugin.id} is built for Capacitor ${major(version)}, it might cause issues`); From 7217b5215a175eededf607a216e0cab2a8450a34 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of jcesarmobile)" Date: Fri, 19 Jun 2026 09:01:59 +0000 Subject: [PATCH 20/39] Release 8.4.1 --- CHANGELOG.md | 7 +++++++ android/CHANGELOG.md | 4 ++++ android/package.json | 2 +- cli/CHANGELOG.md | 7 +++++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 4 ++++ ios/package.json | 2 +- lerna.json | 2 +- 10 files changed, 31 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd4fe5f5a..db3954562 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) + +### Bug Fixes + +- **cli:** make SPM dependency patch work on prereleases ([#8508](https://github.com/ionic-team/capacitor/issues/8508)) ([6048e90](https://github.com/ionic-team/capacitor/commit/6048e90171afa0229a3c25b52a23c377c6bb804c)) +- **cli:** patch Capacitor SPM dependency version in plugins ([#8492](https://github.com/ionic-team/capacitor/issues/8492)) ([28bb2c6](https://github.com/ionic-team/capacitor/commit/28bb2c687069dfdd6aa7abc866004a1c6388d103)) + # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index df7ce545e..5bc9de9f6 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) + +**Note:** Version bump only for package @capacitor/android + # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) ### Bug Fixes diff --git a/android/package.json b/android/package.json index af3f4f556..7354f3b2c 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.4.0", + "version": "8.4.1", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index ee48a8d5f..df61fcbaa 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) + +### Bug Fixes + +- **cli:** make SPM dependency patch work on prereleases ([#8508](https://github.com/ionic-team/capacitor/issues/8508)) ([6048e90](https://github.com/ionic-team/capacitor/commit/6048e90171afa0229a3c25b52a23c377c6bb804c)) +- **cli:** patch Capacitor SPM dependency version in plugins ([#8492](https://github.com/ionic-team/capacitor/issues/8492)) ([28bb2c6](https://github.com/ionic-team/capacitor/commit/28bb2c687069dfdd6aa7abc866004a1c6388d103)) + # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index 1f987d33a..7a77d11e9 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.4.0", + "version": "8.4.1", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 1de9522ff..1003c8ceb 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) + +**Note:** Version bump only for package @capacitor/core + # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index b22aef174..f821cfd9d 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.4.0", + "version": "8.4.1", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index eac0a4a1c..dfcf383ff 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) + +**Note:** Version bump only for package @capacitor/ios + # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) ### Features diff --git a/ios/package.json b/ios/package.json index a58c02090..a6a78c23d 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.4.0", + "version": "8.4.1", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/lerna.json b/lerna.json index b2efb400d..be3666942 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.4.0", + "version": "8.4.1", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From b789b683f04863e65c66d630890f00561c0d5b7a Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Mon, 22 Jun 2026 15:42:23 -0400 Subject: [PATCH 21/39] chore: run `npm run fmt` to fix lint errors (#8516) --- .../java/com/getcapacitor/BridgeWebChromeClient.java | 4 ++-- .../src/main/java/com/getcapacitor/FileUtils.java | 2 +- .../java/com/getcapacitor/WebViewLocalServer.java | 12 ++++++------ .../getcapacitor/plugin/CapacitorCookieManager.java | 6 +++--- .../getcapacitor/plugin/util/HttpRequestHandler.java | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java index 6ca1c8a83..ec7867369 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java @@ -282,7 +282,7 @@ public boolean onShowFileChooser( boolean captureEnabled = fileChooserParams.isCaptureEnabled(); boolean capturePhoto = captureEnabled && acceptTypes.contains("image/*"); final boolean captureVideo = captureEnabled && acceptTypes.contains("video/*"); - if ((capturePhoto || captureVideo)) { + if (capturePhoto || captureVideo) { if (isMediaCaptureSupported()) { showMediaCaptureOrFilePicker(filePathCallback, fileChooserParams, captureVideo); } else { @@ -447,7 +447,7 @@ public boolean onConsoleMessage(ConsoleMessage consoleMessage) { } public boolean isValidMsg(String msg) { - return !(msg.contains("%cresult %c") || (msg.contains("%cnative %c")) || msg.equalsIgnoreCase("console.groupEnd")); + return !(msg.contains("%cresult %c") || msg.contains("%cnative %c") || msg.equalsIgnoreCase("console.groupEnd")); } private Uri createImageFileUri() throws IOException { diff --git a/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java b/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java index ce09e7c2f..cec171946 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java +++ b/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java @@ -218,7 +218,7 @@ private static String getCopyFilePath(Uri uri, Context context) { Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); cursor.moveToFirst(); - String name = (cursor.getString(nameIndex)); + String name = cursor.getString(nameIndex); String fileName = sanitizeFilename(name); File file = new File(context.getFilesDir(), fileName); try { diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index a39483de9..0c5480079 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -221,7 +221,7 @@ private boolean isErrorUrl(Uri uri) { } private boolean isMainUrl(Uri loadingUrl) { - return (bridge.getServerUrl() == null && loadingUrl.getHost().equalsIgnoreCase(bridge.getHost())); + return bridge.getServerUrl() == null && loadingUrl.getHost().equalsIgnoreCase(bridge.getHost()); } private boolean isAllowedUrl(Uri loadingUrl) { @@ -722,31 +722,31 @@ private InputStream getInputStream() { @Override public int available() throws IOException { InputStream is = getInputStream(); - return (is != null) ? is.available() : -1; + return is != null ? is.available() : -1; } @Override public int read() throws IOException { InputStream is = getInputStream(); - return (is != null) ? is.read() : -1; + return is != null ? is.read() : -1; } @Override public int read(byte[] b) throws IOException { InputStream is = getInputStream(); - return (is != null) ? is.read(b) : -1; + return is != null ? is.read(b) : -1; } @Override public int read(byte[] b, int off, int len) throws IOException { InputStream is = getInputStream(); - return (is != null) ? is.read(b, off, len) : -1; + return is != null ? is.read(b, off, len) : -1; } @Override public long skip(long n) throws IOException { InputStream is = getInputStream(); - return (is != null) ? is.skip(n) : 0; + return is != null ? is.skip(n) : 0; } } diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java index cf4ab6326..472323bbc 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java @@ -192,12 +192,12 @@ public void flush() { @Override public void put(URI uri, Map> responseHeaders) { // make sure our args are valid - if ((uri == null) || (responseHeaders == null)) return; + if (uri == null || responseHeaders == null) return; // go over the headers for (String headerKey : responseHeaders.keySet()) { // ignore headers which aren't cookie related - if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue; + if (headerKey == null || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue; // process each of the headers for (String headerValue : Objects.requireNonNull(responseHeaders.get(headerKey))) { @@ -215,7 +215,7 @@ public void put(URI uri, Map> responseHeaders) { @Override public Map> get(URI uri, Map> requestHeaders) { // make sure our args are valid - if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null"); + if (uri == null || requestHeaders == null) throw new IllegalArgumentException("Argument is null"); // save our url once String url = uri.toString(); diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java index b47d57cf1..69278bc63 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java @@ -168,8 +168,8 @@ public HttpURLConnectionBuilder setUrlParams(JSObject params, boolean shouldEnco "://" + uri.getAuthority() + uri.getPath() + - ((!urlQuery.equals("")) ? "?" + urlQuery : "") + - ((uri.getFragment() != null) ? uri.getFragment() : ""); + (!urlQuery.equals("") ? "?" + urlQuery : "") + + (uri.getFragment() != null ? uri.getFragment() : ""); this.url = new URL(unEncodedUrlString); return this; From 6f2d3283897a375d09ca9ec8784a9f0d65f0a530 Mon Sep 17 00:00:00 2001 From: "Alex J." Date: Wed, 8 Jul 2026 10:35:37 -0400 Subject: [PATCH 22/39] fix(android): explicitly grant URI permissions for image capture intent (#8526) --- .../src/main/java/com/getcapacitor/BridgeWebChromeClient.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java index ec7867369..34fa2d834 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java @@ -340,6 +340,7 @@ private boolean showImageCapturePicker(final ValueCallback filePathCallba return false; } takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri); + takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); activityListener = (activityResult) -> { Uri[] result = null; if (activityResult.getResultCode() == Activity.RESULT_OK) { From 1834b9740e200fd96f866975d54515d49ef1aa97 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of markemer)" Date: Tue, 14 Jul 2026 17:32:29 +0000 Subject: [PATCH 23/39] Release 8.4.2 --- CHANGELOG.md | 6 ++++++ android/CHANGELOG.md | 6 ++++++ android/package.json | 2 +- cli/CHANGELOG.md | 4 ++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 4 ++++ ios/package.json | 2 +- lerna.json | 2 +- 10 files changed, 29 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db3954562..41320fefa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) + +### Bug Fixes + +- **android:** explicitly grant URI permissions for image capture intent ([#8526](https://github.com/ionic-team/capacitor/issues/8526)) ([6f2d328](https://github.com/ionic-team/capacitor/commit/6f2d3283897a375d09ca9ec8784a9f0d65f0a530)) + ## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 5bc9de9f6..106d9c0c8 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) + +### Bug Fixes + +- **android:** explicitly grant URI permissions for image capture intent ([#8526](https://github.com/ionic-team/capacitor/issues/8526)) ([6f2d328](https://github.com/ionic-team/capacitor/commit/6f2d3283897a375d09ca9ec8784a9f0d65f0a530)) + ## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) **Note:** Version bump only for package @capacitor/android diff --git a/android/package.json b/android/package.json index 7354f3b2c..285d9ec78 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.4.1", + "version": "8.4.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index df61fcbaa..3fb75e17a 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) + +**Note:** Version bump only for package @capacitor/cli + ## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index 7a77d11e9..e0c99f6d0 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.4.1", + "version": "8.4.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index 1003c8ceb..a90269b59 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) + +**Note:** Version bump only for package @capacitor/core + ## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index f821cfd9d..870ee47a7 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.4.1", + "version": "8.4.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index dfcf383ff..9a30e6bb4 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) + +**Note:** Version bump only for package @capacitor/ios + ## [8.4.1](https://github.com/ionic-team/capacitor/compare/8.4.0...8.4.1) (2026-06-19) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index a6a78c23d..5e0fbed66 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.4.1", + "version": "8.4.2", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/lerna.json b/lerna.json index be3666942..fbd4baa8e 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.4.1", + "version": "8.4.2", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From f368a1b1ec90394ff44dd3b9ecea9ea6dfb225c1 Mon Sep 17 00:00:00 2001 From: Pedro Bilro Date: Mon, 27 Jul 2026 18:26:32 +0100 Subject: [PATCH 24/39] chore(android): fix lint issues (#8542) --- .../com/getcapacitor/plugin/SystemBars.java | 20 +++++++++---------- .../plugin/util/HttpRequestHandlerTest.java | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index fd7137094..b3c95916a 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -43,17 +43,17 @@ public class SystemBars extends Plugin { private static final int WEBVIEW_VERSION_WITH_SAFE_AREA_KEYBOARD_FIX = 144; static final String viewportMetaJSFunction = """ - function capacitorSystemBarsCheckMetaViewport() { - const meta = document.querySelectorAll("meta[name=viewport]"); - if (meta.length == 0) { - return false; - } - // get the last found meta viewport tag - const metaContent = meta[meta.length - 1].content; - return metaContent.includes("viewport-fit=cover"); + function capacitorSystemBarsCheckMetaViewport() { + const meta = document.querySelectorAll("meta[name=viewport]"); + if (meta.length == 0) { + return false; } - capacitorSystemBarsCheckMetaViewport(); - """; + // get the last found meta viewport tag + const metaContent = meta[meta.length - 1].content; + return metaContent.includes("viewport-fit=cover"); + } + capacitorSystemBarsCheckMetaViewport(); + """; private String insetsHandling = INSETS_HANDLING_CSS; private boolean hasViewportCover = false; diff --git a/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java b/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java index fd8b686ee..100672123 100644 --- a/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java +++ b/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java @@ -11,8 +11,8 @@ public class HttpRequestHandlerTest { static final String BASE_URL = "https://httpbin.org/get"; static final String PARAMS_JSON = """ - {"k": "a&b"} - """; + {"k": "a&b"} + """; @Test public void testHttpURLConnectionBuilderSetUrlParamsEncoded() throws Exception { From 4c1c8709413b9c19b008c99122ca330cc3c90e6f Mon Sep 17 00:00:00 2001 From: Conor Brady Date: Tue, 28 Jul 2026 09:20:15 -0700 Subject: [PATCH 25/39] fix(cli): support TypeScript 7 when loading capacitor.config.ts (#8534) --- cli/src/config.ts | 2 +- cli/src/util/node.ts | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/cli/src/config.ts b/cli/src/config.ts index 4e71fb01d..bb71177dc 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -113,7 +113,7 @@ async function loadExtConfigTS( } const ts = require(tsPath); // eslint-disable-line @typescript-eslint/no-var-requires - const extConfigObject = requireTS(ts, extConfigFilePath) as any; + const extConfigObject = (await requireTS(ts, extConfigFilePath)) as any; const extConfig = extConfigObject.default ? await extConfigObject.default : extConfigObject; return { diff --git a/cli/src/util/node.ts b/cli/src/util/node.ts index 299dffdd3..6f511da25 100644 --- a/cli/src/util/node.ts +++ b/cli/src/util/node.ts @@ -2,17 +2,55 @@ import { existsSync } from 'fs'; import { readFileSync } from 'fs-extra'; import { resolve } from 'path'; import type typescript from 'typescript'; +import { pathToFileURL } from 'url'; interface NodeModuleWithCompile extends NodeJS.Module { _compile?(code: string, filename: string): any; } +/** + * TypeScript 7 dropped the classic compiler API (transpileModule, ModuleKind, etc.) from its + * default export -- `require('typescript')` now only exposes `version`/`versionMajorMinor`. + * Detect that case so we can fall back to a loading strategy that doesn't depend on it. + * + * @see https://github.com/ionic-team/capacitor/issues/8531 + */ +function hasClassicCompilerAPI(ts: typeof typescript): boolean { + return typeof ts.transpileModule === 'function'; +} + +/** + * A plain `import()` here gets downleveled to a `require()` call by tsc when compiling to + * CommonJS (our build target), which defeats the purpose -- we specifically need the real ESM + * loader so Node's native TypeScript stripping kicks in. Constructing the import from a string + * keeps tsc from touching it. + */ +const dynamicImport: (specifier: string) => Promise = new Function('specifier', 'return import(specifier)') as any; + /** * @see https://github.com/ionic-team/stencil/blob/HEAD/src/compiler/sys/node-require.ts */ -export const requireTS = (ts: typeof typescript, p: string): unknown => { +export const requireTS = async (ts: typeof typescript, p: string): Promise => { const id = resolve(p); + if (!hasClassicCompilerAPI(ts)) { + // Node has its own built-in TypeScript syntax stripping (stable since Node 23.6, and + // available behind --experimental-strip-types since Node 22.6), so we can load the file + // directly via the native ESM loader instead of transpiling it ourselves. + try { + return await dynamicImport(pathToFileURL(id).href); + } catch (e: any) { + if (e?.code === 'ERR_UNKNOWN_FILE_EXTENSION') { + throw new Error( + `Your installed version of TypeScript (${ts.version}) no longer provides the compiler API Capacitor previously used to load .ts config files, ` + + `and your Node.js runtime (${process.version}) doesn't support loading them natively either.\n` + + 'Upgrade to Node.js 22.6+ (running with --experimental-strip-types), or Node.js 23.6+, to continue using capacitor.config.ts.', + ); + } + throw e; + } + } + delete require.cache[id]; require.extensions['.ts'] = (module: NodeModuleWithCompile, fileName: string) => { From 3fa04a357c92af34cd6fccb8124791963804a9dc Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Wed, 29 Jul 2026 15:17:46 -0500 Subject: [PATCH 26/39] feat(ios): UIScene Support (#8536) --- .../App/App.xcodeproj/project.pbxproj | 4 + ios-pods-template/App/App/AppDelegate.swift | 9 ++ ios-pods-template/App/App/Info.plist | 19 ++++ ios-pods-template/App/App/SceneDelegate.swift | 24 +++++ .../App/App.xcodeproj/project.pbxproj | 4 + ios-spm-template/App/App/AppDelegate.swift | 19 ++-- ios-spm-template/App/App/Info.plist | 21 ++++- ios-spm-template/App/App/SceneDelegate.swift | 24 +++++ .../Capacitor.xcodeproj/project.pbxproj | 12 ++- .../CAPApplicationDelegateProxy.swift | 2 +- .../Capacitor/CAPNotifications.swift | 7 ++ .../Capacitor/CAPSceneDelegateProxy.swift | 87 +++++++++++++++++++ ios/Capacitor/Capacitor/CapacitorBridge.swift | 20 ++--- .../Capacitor/TmpViewController.swift | 8 -- .../Capacitor/WebViewDelegationHandler.swift | 2 +- ios/Capacitor/TestsHostApp/AppDelegate.swift | 9 ++ .../TestsHostApp/SceneDelegate.swift | 5 ++ 17 files changed, 238 insertions(+), 38 deletions(-) create mode 100644 ios-pods-template/App/App/SceneDelegate.swift create mode 100644 ios-spm-template/App/App/SceneDelegate.swift create mode 100644 ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift delete mode 100644 ios/Capacitor/Capacitor/TmpViewController.swift create mode 100644 ios/Capacitor/TestsHostApp/SceneDelegate.swift diff --git a/ios-pods-template/App/App.xcodeproj/project.pbxproj b/ios-pods-template/App/App.xcodeproj/project.pbxproj index 092f57491..75dc9750f 100644 --- a/ios-pods-template/App/App.xcodeproj/project.pbxproj +++ b/ios-pods-template/App/App.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; + 9582B6852FE996820072D4E8 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9582B6842FE996800072D4E8 /* SceneDelegate.swift */; }; A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; /* End PBXBuildFile section */ @@ -27,6 +28,7 @@ 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + 9582B6842FE996800072D4E8 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; @@ -73,6 +75,7 @@ 504EC3061FED79650016851F /* App */ = { isa = PBXGroup; children = ( + 9582B6842FE996800072D4E8 /* SceneDelegate.swift */, 50379B222058CBB4000EE86E /* capacitor.config.json */, 504EC3071FED79650016851F /* AppDelegate.swift */, 504EC30B1FED79650016851F /* Main.storyboard */, @@ -210,6 +213,7 @@ buildActionMask = 2147483647; files = ( 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, + 9582B6852FE996820072D4E8 /* SceneDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios-pods-template/App/App/AppDelegate.swift b/ios-pods-template/App/App/AppDelegate.swift index c3cd83b5c..7ad11d83e 100644 --- a/ios-pods-template/App/App/AppDelegate.swift +++ b/ios-pods-template/App/App/AppDelegate.swift @@ -46,4 +46,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) } + func application(_ application: UIApplication, + configurationForConnecting connectingSceneSession: UISceneSession, + options: UIScene.ConnectionOptions) -> UISceneConfiguration { + + let config = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + config.delegateClass = SceneDelegate.self + return config + } + } diff --git a/ios-pods-template/App/App/Info.plist b/ios-pods-template/App/App/Info.plist index ed6ff0bd4..f8c8a5765 100644 --- a/ios-pods-template/App/App/Info.plist +++ b/ios-pods-template/App/App/Info.plist @@ -22,6 +22,25 @@ $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/ios-pods-template/App/App/SceneDelegate.swift b/ios-pods-template/App/App/SceneDelegate.swift new file mode 100644 index 000000000..f352e1e95 --- /dev/null +++ b/ios-pods-template/App/App/SceneDelegate.swift @@ -0,0 +1,24 @@ +import UIKit +import Capacitor + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let windowScene = scene as? UIWindowScene else { return } + + window = UIWindow(windowScene: windowScene) + window?.rootViewController = CAPBridgeViewController() + window?.makeKeyAndVisible() + + SceneDelegateProxy.shared.scene(scene, willConnectTo: session, options: connectionOptions) + } + + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + SceneDelegateProxy.shared.scene(scene, openURLContexts: URLContexts) + } + + func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + SceneDelegateProxy.shared.scene(scene, continue: userActivity) + } +} diff --git a/ios-spm-template/App/App.xcodeproj/project.pbxproj b/ios-spm-template/App/App.xcodeproj/project.pbxproj index 46f934efd..56a0b7d40 100644 --- a/ios-spm-template/App/App.xcodeproj/project.pbxproj +++ b/ios-spm-template/App/App.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; + 9582B6832FE993A70072D4E8 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9582B6822FE993A50072D4E8 /* SceneDelegate.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -27,6 +28,7 @@ 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + 9582B6822FE993A50072D4E8 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 958DCC722DB07C7200EA8C5F /* debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = debug.xcconfig; path = ../debug.xcconfig; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ @@ -62,6 +64,7 @@ 504EC3061FED79650016851F /* App */ = { isa = PBXGroup; children = ( + 9582B6822FE993A50072D4E8 /* SceneDelegate.swift */, 50379B222058CBB4000EE86E /* capacitor.config.json */, 504EC3071FED79650016851F /* AppDelegate.swift */, 504EC30B1FED79650016851F /* Main.storyboard */, @@ -156,6 +159,7 @@ buildActionMask = 2147483647; files = ( 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, + 9582B6832FE993A70072D4E8 /* SceneDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios-spm-template/App/App/AppDelegate.swift b/ios-spm-template/App/App/AppDelegate.swift index c3cd83b5c..fec95acae 100644 --- a/ios-spm-template/App/App/AppDelegate.swift +++ b/ios-spm-template/App/App/AppDelegate.swift @@ -33,17 +33,12 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } - func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { - // Called when the app was launched with a url. Feel free to add additional processing here, - // but if you want the App API to support tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + func application(_ application: UIApplication, + configurationForConnecting connectingSceneSession: UISceneSession, + options: UIScene.ConnectionOptions) -> UISceneConfiguration { + let config = UISceneConfiguration(name: "Default Configuration", + sessionRole: connectingSceneSession.role) + config.delegateClass = SceneDelegate.self + return config } - - func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { - // Called when the app was launched with an activity, including Universal Links. - // Feel free to add additional processing here, but if you want the App API to support - // tracking app url opens, make sure to keep this call - return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) - } - } diff --git a/ios-spm-template/App/App/Info.plist b/ios-spm-template/App/App/Info.plist index 42bcf6750..fc41ce69b 100644 --- a/ios-spm-template/App/App/Info.plist +++ b/ios-spm-template/App/App/Info.plist @@ -2,7 +2,7 @@ - CAPACITOR_DEBUG + CAPACITOR_DEBUG $(CAPACITOR_DEBUG) CFBundleDevelopmentRegion en @@ -24,6 +24,25 @@ $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/ios-spm-template/App/App/SceneDelegate.swift b/ios-spm-template/App/App/SceneDelegate.swift new file mode 100644 index 000000000..f352e1e95 --- /dev/null +++ b/ios-spm-template/App/App/SceneDelegate.swift @@ -0,0 +1,24 @@ +import UIKit +import Capacitor + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let windowScene = scene as? UIWindowScene else { return } + + window = UIWindow(windowScene: windowScene) + window?.rootViewController = CAPBridgeViewController() + window?.makeKeyAndVisible() + + SceneDelegateProxy.shared.scene(scene, willConnectTo: session, options: connectionOptions) + } + + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + SceneDelegateProxy.shared.scene(scene, openURLContexts: URLContexts) + } + + func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + SceneDelegateProxy.shared.scene(scene, continue: userActivity) + } +} diff --git a/ios/Capacitor/Capacitor.xcodeproj/project.pbxproj b/ios/Capacitor/Capacitor.xcodeproj/project.pbxproj index b060d9f7d..573e90cd9 100644 --- a/ios/Capacitor/Capacitor.xcodeproj/project.pbxproj +++ b/ios/Capacitor/Capacitor.xcodeproj/project.pbxproj @@ -52,7 +52,6 @@ 62959B3A2524DA7800A3D7F1 /* CAPLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62959B082524DA7700A3D7F1 /* CAPLog.swift */; }; 62959B3B2524DA7800A3D7F1 /* CAPPluginMethod.h in Headers */ = {isa = PBXBuildFile; fileRef = 62959B092524DA7700A3D7F1 /* CAPPluginMethod.h */; settings = {ATTRIBUTES = (Public, ); }; }; 62959B3C2524DA7800A3D7F1 /* CAPBridgeDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62959B0A2524DA7700A3D7F1 /* CAPBridgeDelegate.swift */; }; - 62959B402524DA7800A3D7F1 /* TmpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62959B0E2524DA7700A3D7F1 /* TmpViewController.swift */; }; 62959B412524DA7800A3D7F1 /* Capacitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 62959B0F2524DA7700A3D7F1 /* Capacitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 62959B422524DA7800A3D7F1 /* DocLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62959B102524DA7700A3D7F1 /* DocLinks.swift */; }; 62959B432524DA7800A3D7F1 /* Data+Capacitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62959B112524DA7700A3D7F1 /* Data+Capacitor.swift */; }; @@ -62,6 +61,7 @@ 62959BA52526475A00A3D7F1 /* Cordova.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 62959BA02526474300A3D7F1 /* Cordova.framework */; }; 6296A77E253A2E49005A202A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6296A77D253A2E49005A202A /* AppDelegate.swift */; }; 6296A782253A2E49005A202A /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6296A781253A2E49005A202A /* ViewController.swift */; }; + 6296A7A0253A2E49005A202A /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6296A7A1253A2E49005A202A /* SceneDelegate.swift */; }; 6296A785253A2E49005A202A /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6296A783253A2E49005A202A /* Main.storyboard */; }; 6296A787253A2E49005A202A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6296A786253A2E49005A202A /* Assets.xcassets */; }; 6296A78A253A2E49005A202A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6296A788253A2E49005A202A /* LaunchScreen.storyboard */; }; @@ -80,6 +80,7 @@ 62FABD1A25AE5C01007B3814 /* Array+Capacitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FABD1925AE5C01007B3814 /* Array+Capacitor.swift */; }; 62FABD2325AE60BA007B3814 /* BridgedTypesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FABD2225AE60BA007B3814 /* BridgedTypesTests.m */; }; 62FABD2B25AE6182007B3814 /* BridgedTypesHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62FABD2A25AE6182007B3814 /* BridgedTypesHelper.swift */; }; + 952707712FD9DD2D0079E5D3 /* CAPSceneDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9527076F2FD9DD260079E5D3 /* CAPSceneDelegateProxy.swift */; }; 957BD9402E78A4A50056874C /* SystemBars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957BD93E2E78A4A20056874C /* SystemBars.swift */; }; A327E6B628DB8B2900CA8B0A /* HttpRequestHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A327E6B228DB8B2800CA8B0A /* HttpRequestHandler.swift */; }; A327E6B728DB8B2900CA8B0A /* CapacitorHttp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A327E6B428DB8B2900CA8B0A /* CapacitorHttp.swift */; }; @@ -204,7 +205,6 @@ 62959B082524DA7700A3D7F1 /* CAPLog.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CAPLog.swift; sourceTree = ""; }; 62959B092524DA7700A3D7F1 /* CAPPluginMethod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAPPluginMethod.h; sourceTree = ""; }; 62959B0A2524DA7700A3D7F1 /* CAPBridgeDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CAPBridgeDelegate.swift; sourceTree = ""; }; - 62959B0E2524DA7700A3D7F1 /* TmpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TmpViewController.swift; sourceTree = ""; }; 62959B0F2524DA7700A3D7F1 /* Capacitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Capacitor.h; sourceTree = ""; }; 62959B102524DA7700A3D7F1 /* DocLinks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DocLinks.swift; sourceTree = ""; }; 62959B112524DA7700A3D7F1 /* Data+Capacitor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+Capacitor.swift"; sourceTree = ""; }; @@ -219,6 +219,7 @@ 6296A77B253A2E49005A202A /* TestsHostApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestsHostApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6296A77D253A2E49005A202A /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6296A781253A2E49005A202A /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 6296A7A1253A2E49005A202A /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 6296A784253A2E49005A202A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 6296A786253A2E49005A202A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 6296A789253A2E49005A202A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -238,6 +239,7 @@ 62FABD1925AE5C01007B3814 /* Array+Capacitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+Capacitor.swift"; sourceTree = ""; }; 62FABD2225AE60BA007B3814 /* BridgedTypesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = BridgedTypesTests.m; sourceTree = ""; }; 62FABD2A25AE6182007B3814 /* BridgedTypesHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BridgedTypesHelper.swift; sourceTree = ""; }; + 9527076F2FD9DD260079E5D3 /* CAPSceneDelegateProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CAPSceneDelegateProxy.swift; sourceTree = ""; }; 957BD93E2E78A4A20056874C /* SystemBars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemBars.swift; sourceTree = ""; }; A327E6B228DB8B2800CA8B0A /* HttpRequestHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HttpRequestHandler.swift; sourceTree = ""; }; A327E6B428DB8B2900CA8B0A /* CapacitorHttp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CapacitorHttp.swift; sourceTree = ""; }; @@ -355,6 +357,7 @@ 62959AE12524DA7700A3D7F1 /* Capacitor */ = { isa = PBXGroup; children = ( + 9527076F2FD9DD260079E5D3 /* CAPSceneDelegateProxy.swift */, A7D9312C2B2370EF00FF59A2 /* Codable */, 0F8F33B127DA980A003F49D6 /* PluginConfig.swift */, A76739782B98E09700795F7B /* PrivacyInfo.xcprivacy */, @@ -395,7 +398,6 @@ 6214934625509C3F006C36F9 /* CAPInstanceConfiguration.swift */, 62959B082524DA7700A3D7F1 /* CAPLog.swift */, 62959AE72524DA7700A3D7F1 /* CAPFile.swift */, - 62959B0E2524DA7700A3D7F1 /* TmpViewController.swift */, 62959B102524DA7700A3D7F1 /* DocLinks.swift */, 62959B152524DA7700A3D7F1 /* CAPNotifications.swift */, 62959B072524DA7700A3D7F1 /* CapacitorExtension.swift */, @@ -446,6 +448,7 @@ isa = PBXGroup; children = ( 6296A77D253A2E49005A202A /* AppDelegate.swift */, + 6296A7A1253A2E49005A202A /* SceneDelegate.swift */, 6296A781253A2E49005A202A /* ViewController.swift */, 62E0735125535E6500BAAADB /* configurations */, 6296A783253A2E49005A202A /* Main.storyboard */, @@ -710,7 +713,6 @@ A7D9312F2B23710300FF59A2 /* JSValueDecoder.swift in Sources */, 62959B362524DA7800A3D7F1 /* CAPBridgeViewController.swift in Sources */, 621ECCB72542045900D3D615 /* CAPBridgedJSTypes.m in Sources */, - 62959B402524DA7800A3D7F1 /* TmpViewController.swift in Sources */, 621ECCD6254205BD00D3D615 /* CAPBridgeProtocol.swift in Sources */, 62D43AF02581817500673C24 /* WKWebView+Capacitor.swift in Sources */, 62959B432524DA7800A3D7F1 /* Data+Capacitor.swift in Sources */, @@ -724,6 +726,7 @@ A7F7EDD5292BE8520015B73B /* CAPInstancePlugin.swift in Sources */, A38C3D7B2848BE6F004B3680 /* CapacitorCookieManager.swift in Sources */, 62959B1B2524DA7800A3D7F1 /* CAPFile.swift in Sources */, + 952707712FD9DD2D0079E5D3 /* CAPSceneDelegateProxy.swift in Sources */, 62959B462524DA7800A3D7F1 /* CAPBridge.swift in Sources */, 62959B1D2524DA7800A3D7F1 /* UIColor.swift in Sources */, 62959B332524DA7800A3D7F1 /* CAPPlugin.m in Sources */, @@ -784,6 +787,7 @@ files = ( 6296A782253A2E49005A202A /* ViewController.swift in Sources */, 6296A77E253A2E49005A202A /* AppDelegate.swift in Sources */, + 6296A7A0253A2E49005A202A /* SceneDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/Capacitor/Capacitor/CAPApplicationDelegateProxy.swift b/ios/Capacitor/Capacitor/CAPApplicationDelegateProxy.swift index 7f510bc5a..ef41457d2 100644 --- a/ios/Capacitor/Capacitor/CAPApplicationDelegateProxy.swift +++ b/ios/Capacitor/Capacitor/CAPApplicationDelegateProxy.swift @@ -4,7 +4,7 @@ import Foundation public class ApplicationDelegateProxy: NSObject, UIApplicationDelegate { public static let shared = ApplicationDelegateProxy() - public private(set) var lastURL: URL? + public internal(set) var lastURL: URL? public func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { NotificationCenter.default.post(name: .capacitorOpenURL, object: [ diff --git a/ios/Capacitor/Capacitor/CAPNotifications.swift b/ios/Capacitor/Capacitor/CAPNotifications.swift index 03d80aa87..9731f74e4 100644 --- a/ios/Capacitor/Capacitor/CAPNotifications.swift +++ b/ios/Capacitor/Capacitor/CAPNotifications.swift @@ -18,6 +18,10 @@ extension Notification.Name { public static let capacitorStatusBarTapped = Notification.Name(rawValue: "CapacitorStatusBarTappedNotification") public static let capacitorViewDidAppear = Notification.Name(rawValue: "CapacitorViewDidAppear") public static let capacitorViewWillTransition = Notification.Name(rawValue: "CapacitorViewWillTransition") + public static let capacitorSceneWillConnect = Notification.Name(rawValue: "CapacitorSceneWillConnect") + public static let capacitorSceneOpenURL = Notification.Name(rawValue: "CapacitorSceneOpenURLNotification") + public static let capacitorSceneOpenUniversalLink = + Notification.Name(rawValue: "CapacitorSceneOpenUniversalLinkNotification") } @objc extension NSNotification { @@ -30,6 +34,9 @@ extension Notification.Name { public static let capacitorStatusBarTapped = Notification.Name.capacitorStatusBarTapped public static let capacitorViewDidAppear = Notification.Name.capacitorViewDidAppear public static let capacitorViewWillTransition = Notification.Name.capacitorViewWillTransition + public static let capacitorSceneWillConnect = Notification.Name.capacitorSceneWillConnect + public static let capacitorSceneOpenURL = Notification.Name.capacitorSceneOpenURL + public static let capacitorSceneOpenUniversalLink = Notification.Name.capacitorSceneOpenUniversalLink } /** diff --git a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift new file mode 100644 index 000000000..782efe4cf --- /dev/null +++ b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift @@ -0,0 +1,87 @@ +// +// CAPSceneDelegateProxy.swift +// Capacitor +// +// Created by Joseph Orlando Pender on 6/10/26. +// Copyright © 2026 Drifty Co. All rights reserved. +// + +import Foundation + +@objc(CAPSceneDelegateProxy) +public class SceneDelegateProxy: NSObject, UISceneDelegate { + public static let shared = SceneDelegateProxy() + + public private(set) var lastURL: URL? + + public func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + NotificationCenter.default.post(name: .capacitorSceneWillConnect, object: scene) + + // Plugins haven't loaded yet on a cold start, so notifications posted here are + // missed. Deliver them on the first capacitorViewDidAppear, once plugins are + // registered. + var token: NSObjectProtocol? + token = NotificationCenter.default.addObserver(forName: .capacitorViewDidAppear, object: nil, queue: .main) { _ in + if let token { + NotificationCenter.default.removeObserver(token) + } + if !connectionOptions.urlContexts.isEmpty { + self.scene(scene, openURLContexts: connectionOptions.urlContexts) + } + for userActivity in connectionOptions.userActivities { + self.scene(scene, continue: userActivity) + } + } + } + + public func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + for context in URLContexts { + lastURL = context.url + ApplicationDelegateProxy.shared.lastURL = context.url + let options = Self.openURLOptions(from: context.options) + + // Capacitor 8 backwards compat + NotificationCenter.default.post(name: .capacitorOpenURL, object: [ + "url": context.url, + "options": options + ]) + + NotificationCenter.default.post(name: NSNotification.Name.CDVPluginHandleOpenURL, object: context.url) + + NotificationCenter.default.post(name: .capacitorSceneOpenURL, object: scene, userInfo: [ + "url": context.url, + "options": options + ]) + } + } + + public func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { + guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, + let url = userActivity.webpageURL else { + return + } + lastURL = url + ApplicationDelegateProxy.shared.lastURL = url + + // Capacitor 8 backwards compat + NotificationCenter.default.post(name: .capacitorOpenUniversalLink, object: [ + "url": url + ]) + + NotificationCenter.default.post(name: .capacitorSceneOpenUniversalLink, object: scene, userInfo: [ + "url": url + ]) + } + + private static func openURLOptions(from sceneOptions: UIScene.OpenURLOptions) -> [UIApplication.OpenURLOptionsKey: Any] { + var options: [UIApplication.OpenURLOptionsKey: Any] = [:] + if let sourceApplication = sceneOptions.sourceApplication { + options[.sourceApplication] = sourceApplication + } + if let annotation = sceneOptions.annotation { + options[.annotation] = annotation + } + options[.openInPlace] = sceneOptions.openInPlace + return options + } +} diff --git a/ios/Capacitor/Capacitor/CapacitorBridge.swift b/ios/Capacitor/Capacitor/CapacitorBridge.swift index 7b8b9b99d..263436395 100644 --- a/ios/Capacitor/Capacitor/CapacitorBridge.swift +++ b/ios/Capacitor/Capacitor/CapacitorBridge.swift @@ -93,10 +93,6 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { } } } - @available(*, deprecated, message: "obsolete") - var tmpWindow: UIWindow? - @available(*, deprecated, message: "obsolete") - static let tmpVCAppeared = Notification(name: Notification.Name(rawValue: "tmpViewControllerAppeared")) public static let capacitorSite = "https://capacitorjs.com/" public static let fileStartIdentifier = "/_capacitor_file_" public static let httpInterceptorStartIdentifier = "/_capacitor_http_interceptor_" @@ -223,9 +219,6 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { setupCordovaCompatibility() exportMiscJS() canInjectJS = false - observers.append(NotificationCenter.default.addObserver(forName: type(of: self).tmpVCAppeared.name, object: .none, queue: .none) { [weak self] _ in - self?.tmpWindow = nil - }) self.setupWebDebugging(configuration: configuration) } @@ -270,11 +263,16 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { exportCordovaJS() registerCordovaPlugins() } else { - observers.append(NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: OperationQueue.main) { [weak self] (_) in - self?.triggerDocumentJSEvent(eventName: "resume") + observers.append(NotificationCenter.default.addObserver(forName: UIScene.willEnterForegroundNotification, object: nil, queue: OperationQueue.main) { [weak self] notification in + if let scene = notification.object as? UIWindowScene, scene === self?.viewController?.view.window?.windowScene { + self?.triggerDocumentJSEvent(eventName: "resume") + } + }) - observers.append(NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: OperationQueue.main) { [weak self] (_) in - self?.triggerDocumentJSEvent(eventName: "pause") + observers.append(NotificationCenter.default.addObserver(forName: UIScene.didEnterBackgroundNotification, object: nil, queue: OperationQueue.main) { [weak self] notification in + if let scene = notification.object as? UIWindowScene, scene === self?.viewController?.view.window?.windowScene { + self?.triggerDocumentJSEvent(eventName: "pause") + } }) } } diff --git a/ios/Capacitor/Capacitor/TmpViewController.swift b/ios/Capacitor/Capacitor/TmpViewController.swift deleted file mode 100644 index 3511d18ae..000000000 --- a/ios/Capacitor/Capacitor/TmpViewController.swift +++ /dev/null @@ -1,8 +0,0 @@ -import UIKit - -internal class TmpViewController: UIViewController { - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - NotificationCenter.default.post(CapacitorBridge.tmpVCAppeared) - } -} diff --git a/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift b/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift index 2b4a256d0..866c7e8c5 100644 --- a/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift +++ b/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift @@ -107,7 +107,7 @@ open class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDelegat if !isApplicationNavigation, toplevelNavigation { // disallow and let the system handle it - if UIApplication.shared.applicationState == .active { + if webView.window?.windowScene?.activationState == .foregroundActive { UIApplication.shared.open(navURL, options: [:], completionHandler: nil) } decisionHandler(.cancel) diff --git a/ios/Capacitor/TestsHostApp/AppDelegate.swift b/ios/Capacitor/TestsHostApp/AppDelegate.swift index f8b87fe2d..9107e3c45 100644 --- a/ios/Capacitor/TestsHostApp/AppDelegate.swift +++ b/ios/Capacitor/TestsHostApp/AppDelegate.swift @@ -6,4 +6,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // Override point for customization after application launch. return true } + + func application(_ application: UIApplication, + configurationForConnecting connectingSceneSession: UISceneSession, + options: UIScene.ConnectionOptions) -> UISceneConfiguration { + let config = UISceneConfiguration(name: "Default Configuration", + sessionRole: connectingSceneSession.role) + config.delegateClass = SceneDelegate.self + return config + } } diff --git a/ios/Capacitor/TestsHostApp/SceneDelegate.swift b/ios/Capacitor/TestsHostApp/SceneDelegate.swift new file mode 100644 index 000000000..e0be6e9cf --- /dev/null +++ b/ios/Capacitor/TestsHostApp/SceneDelegate.swift @@ -0,0 +1,5 @@ +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} From 984fa85ba0adab0aacf895aed6323bf4b503dccb Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Fri, 31 Jul 2026 09:29:58 -0500 Subject: [PATCH 27/39] feat(cli): add migrator functionality for adopting UIScene (#8544) --- cli/package.json | 2 + cli/src/tasks/migrate-uiscene.ts | 305 ++++++++++++++++++ cli/src/tasks/migrate.ts | 10 + cli/src/util/spm.ts | 42 +++ cli/src/util/xcode.ts | 53 +++ cli/test/migrate-uiscene-detect.spec.ts | 36 +++ cli/test/migrate-uiscene-plist.spec.ts | 159 +++++++++ cli/test/migrate-uiscene-scan.spec.ts | 167 ++++++++++ .../migrate-uiscene-scene-delegate.spec.ts | 98 ++++++ cli/test/xcode.spec.ts | 114 +++++++ 10 files changed, 986 insertions(+) create mode 100644 cli/src/tasks/migrate-uiscene.ts create mode 100644 cli/src/util/xcode.ts create mode 100644 cli/test/migrate-uiscene-detect.spec.ts create mode 100644 cli/test/migrate-uiscene-plist.spec.ts create mode 100644 cli/test/migrate-uiscene-scan.spec.ts create mode 100644 cli/test/migrate-uiscene-scene-delegate.spec.ts create mode 100644 cli/test/xcode.spec.ts diff --git a/cli/package.json b/cli/package.json index e0c99f6d0..627f846a3 100644 --- a/cli/package.json +++ b/cli/package.json @@ -60,6 +60,7 @@ "semver": "^7.6.3", "tar": "^7.5.3", "tslib": "^2.8.1", + "xcode": "^3.0.1", "xml2js": "^0.6.2" }, "devDependencies": { @@ -70,6 +71,7 @@ "@types/prompts": "^2.4.9", "@types/semver": "^7.5.8", "@types/tmp": "^0.2.6", + "@types/xcode": "^3.0.0", "@types/xml2js": "0.4.5", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", diff --git a/cli/src/tasks/migrate-uiscene.ts b/cli/src/tasks/migrate-uiscene.ts new file mode 100644 index 000000000..9f6dfa278 --- /dev/null +++ b/cli/src/tasks/migrate-uiscene.ts @@ -0,0 +1,305 @@ +import { existsSync, readFileSync, writeFileSync } from 'fs-extra'; +import { join, sep } from 'path'; + +import { runTask } from '../common'; +import type { Config } from '../definitions'; +import { logger } from '../log'; +import { deleteFolderRecursive, readdirp } from '../util/fs'; +import { addSceneManifestIfNeeded, hasSceneManifest } from '../util/spm'; +import { extractTemplate } from '../util/template'; +import { addSwiftFileToAppTarget } from '../util/xcode'; + +type PreUISceneState = 'eligible' | 'already-migrated' | 'partial'; + +interface UISceneDetectionSignals { + hasManifest: boolean; + hasSceneDelegate: boolean; + hasConfigurationForConnecting: boolean; +} + +interface TemplateAssets { + sceneDelegate: string; + configurationForConnectingSnippet: string; +} + +export async function migrateToUIScene(config: Config): Promise { + const signals = readDetectionSignals(config); + const state = classify(signals); + + switch (state) { + case 'already-migrated': + logger.info('UIScene migration: project already migrated, skipping.'); + return; + case 'partial': + logger.warn( + `UIScene migration: project is in a partial state (${describeSignals(signals)}). ` + + `Skipping automated migration — finish the migration by hand or reset to a clean 8.4 state first.`, + ); + return; + case 'eligible': + break; + } + + const assets = await loadTemplateAssets(config); + if (!assets) { + logger.error('UIScene migration: could not read shipped iOS template assets; skipping.'); + return; + } + + await runTask('Adding UIApplicationSceneManifest to Info.plist.', () => addSceneManifestIfNeeded(config)); + + await runTask('Writing SceneDelegate.swift.', async () => { + const { written } = writeSceneDelegate(config, assets.sceneDelegate); + if (!written) { + logger.warn('SceneDelegate.swift already exists, skipping.'); + } + }); + + await runTask('Patching AppDelegate.swift with configurationForConnecting.', async () => { + const { patched, reason } = patchAppDelegate(config, assets.configurationForConnectingSnippet); + if (!patched && reason) { + logger.warn(`AppDelegate.swift not patched: ${reason}`); + } + }); + + await runTask('Registering SceneDelegate.swift with the Xcode App target.', async () => { + const pbxprojPath = join(config.ios.nativeXcodeProjDirAbs, 'project.pbxproj'); + try { + const { added } = addSwiftFileToAppTarget(pbxprojPath, 'App', 'SceneDelegate.swift'); + if (!added) { + logger.warn('SceneDelegate.swift is already registered in the App target, skipping.'); + } + } catch (err: any) { + logger.warn( + `Could not register SceneDelegate.swift automatically: ${err?.message ?? err}. ` + + 'Add SceneDelegate.swift to the App target in Xcode manually.', + ); + } + }); + + await scanAndWarn(config); + printNextSteps(); +} + +async function scanAndWarn(config: Config): Promise { + const findings: string[] = []; + + const swiftFiles = await readdirp(config.ios.platformDirAbs, { + filter: (item) => { + if (!item.stats.isFile()) return false; + if (!item.path.endsWith('.swift')) return false; + const p = item.path; + return ( + !p.includes(`${sep}Pods${sep}`) && + !p.includes(`${sep}build${sep}`) && + !p.includes(`${sep}DerivedData${sep}`) && + !p.includes(`${sep}.build${sep}`) + ); + }, + }); + + const tokenPatterns: { token: RegExp; label: string }[] = [ + { token: /UIApplication\.shared\.applicationState/, label: 'UIApplication.shared.applicationState' }, + { token: /\btmpWindow\b/, label: 'tmpWindow' }, + { token: /\bTmpViewController\b/, label: 'TmpViewController' }, + ]; + + for (const filePath of swiftFiles) { + const source = readFileSync(filePath, 'utf-8'); + source.split('\n').forEach((line, idx) => { + for (const { token, label } of tokenPatterns) { + if (token.test(line)) { + findings.push(`${filePath}:${idx + 1}: uses ${label}`); + } + } + }); + } + + const appDelegatePath = join(config.ios.nativeTargetDirAbs, 'AppDelegate.swift'); + if (existsSync(appDelegatePath)) { + const source = readFileSync(appDelegatePath, 'utf-8'); + if (hasCustomDelegateBody(source, /func application\([^)]*\bopen url:/)) { + findings.push(`${appDelegatePath}: custom application(_:open:) body — review for UIScene compatibility`); + } + if (hasCustomDelegateBody(source, /func application\([^)]*\bcontinue userActivity:/)) { + findings.push(`${appDelegatePath}: custom application(_:continue:) body — review for UIScene compatibility`); + } + } + + if (findings.length === 0) return; + + logger.warn('UIScene scan found patterns that may need manual review:'); + for (const finding of findings) { + logger.warn(` ${finding}`); + } +} + +function hasCustomDelegateBody(source: string, sigRegex: RegExp): boolean { + const match = source.match(sigRegex); + if (!match || match.index === undefined) return false; + const openIdx = source.indexOf('{', match.index); + if (openIdx === -1) return false; + let depth = 1; + let i = openIdx + 1; + while (i < source.length && depth > 0) { + const ch = source[i]; + if (ch === '{') depth++; + else if (ch === '}') depth--; + i++; + } + if (depth !== 0) return false; + const body = source.slice(openIdx + 1, i - 1); + const codeLines = body + .split('\n') + .map((l) => l.trim()) + .filter((l) => l.length > 0 && !l.startsWith('//')); + if (codeLines.length === 0) return false; + return codeLines.some((l) => !l.includes('ApplicationDelegateProxy.shared')); +} + +function printNextSteps(): void { + logger.info(''); + logger.info('UIScene migration next steps:'); + logger.info(' • Review any warnings above for legacy API usage or custom AppDelegate URL/activity handlers.'); + logger.info(' • Full guide: https://capacitorjs.com/docs/updating/8-5'); +} + +async function loadTemplateAssets(config: Config): Promise { + const packageManager = await config.ios.packageManager; + const archiveName = packageManager === 'SPM' ? 'ios-spm-template.tar.gz' : 'ios-pods-template.tar.gz'; + const archivePath = join(config.cli.assetsDirAbs, archiveName); + const tempDir = join(config.cli.assetsDirAbs, 'tempUISceneTemplate'); + + try { + await extractTemplate(archivePath, tempDir); + const sceneDelegatePath = join(tempDir, 'App', 'App', 'SceneDelegate.swift'); + const appDelegatePath = join(tempDir, 'App', 'App', 'AppDelegate.swift'); + if (!existsSync(sceneDelegatePath) || !existsSync(appDelegatePath)) { + return null; + } + const sceneDelegate = readFileSync(sceneDelegatePath, 'utf-8'); + const appDelegateSource = readFileSync(appDelegatePath, 'utf-8'); + const configurationForConnectingSnippet = extractConfigurationForConnecting(appDelegateSource); + if (!configurationForConnectingSnippet) { + return null; + } + return { sceneDelegate, configurationForConnectingSnippet }; + } finally { + deleteFolderRecursive(tempDir); + } +} + +function writeSceneDelegate(config: Config, contents: string): { written: boolean } { + const path = join(config.ios.nativeTargetDirAbs, 'SceneDelegate.swift'); + if (existsSync(path)) { + return { written: false }; + } + writeFileSync(path, contents); + return { written: true }; +} + +function patchAppDelegate(config: Config, snippet: string): { patched: boolean; reason?: string } { + const path = join(config.ios.nativeTargetDirAbs, 'AppDelegate.swift'); + if (!existsSync(path)) { + return { patched: false, reason: 'AppDelegate.swift not found.' }; + } + const source = readFileSync(path, 'utf-8'); + if (source.includes('UISceneConfiguration(name:')) { + return { patched: false, reason: 'configurationForConnecting already present.' }; + } + const patched = insertBeforeAppDelegateClassEnd(source, snippet); + if (!patched) { + return { patched: false, reason: 'could not locate AppDelegate class body.' }; + } + writeFileSync(path, patched); + return { patched: true }; +} + +function extractConfigurationForConnecting(appDelegateSource: string): string | null { + const sigRegex = /^ {4}func application\(_ application: UIApplication,\n {21}configurationForConnecting\b/m; + const sigMatch = appDelegateSource.match(sigRegex); + if (!sigMatch || sigMatch.index === undefined) { + return null; + } + const openIdx = appDelegateSource.indexOf('{', sigMatch.index); + if (openIdx === -1) { + return null; + } + let depth = 1; + let i = openIdx + 1; + while (i < appDelegateSource.length && depth > 0) { + const ch = appDelegateSource[i]; + if (ch === '{') depth++; + else if (ch === '}') depth--; + i++; + } + if (depth !== 0) { + return null; + } + return '\n' + appDelegateSource.slice(sigMatch.index, i) + '\n'; +} + +function insertBeforeAppDelegateClassEnd(source: string, snippet: string): string | null { + const classDeclRegex = /\bclass\s+AppDelegate\b[^{]*\{/; + const match = source.match(classDeclRegex); + if (!match || match.index === undefined) { + return null; + } + const openIdx = source.indexOf('{', match.index); + let depth = 1; + let i = openIdx + 1; + while (i < source.length && depth > 0) { + const ch = source[i]; + if (ch === '{') depth++; + else if (ch === '}') depth--; + i++; + } + if (depth !== 0) { + return null; + } + const closeIdx = i - 1; + return source.slice(0, closeIdx) + snippet + source.slice(closeIdx); +} + +function readDetectionSignals(config: Config): UISceneDetectionSignals { + const sceneDelegatePath = join(config.ios.nativeTargetDirAbs, 'SceneDelegate.swift'); + const appDelegatePath = join(config.ios.nativeTargetDirAbs, 'AppDelegate.swift'); + + return { + hasManifest: hasSceneManifest(config), + hasSceneDelegate: existsSync(sceneDelegatePath), + hasConfigurationForConnecting: + existsSync(appDelegatePath) && readFileSync(appDelegatePath, 'utf-8').includes('UISceneConfiguration(name:'), + }; +} + +function classify(signals: UISceneDetectionSignals): PreUISceneState { + const { hasManifest, hasSceneDelegate, hasConfigurationForConnecting } = signals; + const trueCount = [hasManifest, hasSceneDelegate, hasConfigurationForConnecting].filter(Boolean).length; + if (trueCount === 0) return 'eligible'; + if (trueCount === 3) return 'already-migrated'; + return 'partial'; +} + +function describeSignals({ + hasManifest, + hasSceneDelegate, + hasConfigurationForConnecting, +}: UISceneDetectionSignals): string { + const present: string[] = []; + const missing: string[] = []; + (hasManifest ? present : missing).push('UIApplicationSceneManifest'); + (hasSceneDelegate ? present : missing).push('SceneDelegate.swift'); + (hasConfigurationForConnecting ? present : missing).push('AppDelegate.configurationForConnecting'); + return `present: [${present.join(', ')}]; missing: [${missing.join(', ')}]`; +} + +// Exported for tests. +export const __testables = { + classify, + describeSignals, + insertBeforeAppDelegateClassEnd, + extractConfigurationForConnecting, + hasCustomDelegateBody, + scanAndWarn, +}; diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 8524ad733..eec9673d5 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -13,6 +13,8 @@ import { deleteFolderRecursive } from '../util/fs'; import { runCommand } from '../util/subprocess'; import { extractTemplate } from '../util/template'; +import { migrateToUIScene } from './migrate-uiscene'; + // eslint-disable-next-line prefer-const let allDependencies: { [key: string]: any } = {}; const libs = ['@capacitor/core', '@capacitor/cli', '@capacitor/ios', '@capacitor/android']; @@ -175,6 +177,8 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem } else { logger.warn('Skipped updating deployment target'); } + + await migrateToUIScene(config); } if (!installFailed) { @@ -391,6 +395,12 @@ async function writeBreakingChanges() { )}.`, ); } + if (allDependencies['@capacitor/ios']) { + logger.info( + 'IMPORTANT: Capacitor 8.5 adopts UIScene on iOS. ' + + 'See https://capacitorjs.com/docs/updating/8-5 for the full 8.4 → 8.5 migration guide.', + ); + } } async function getAndroidVariablesAndClasspaths(config: Config) { diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 2ef26bcda..65cd0f11f 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -239,6 +239,48 @@ export async function addInfoPlistDebugIfNeeded(config: Config): Promise { } } +export function hasSceneManifest(config: Config): boolean { + const infoPlist = resolve(config.ios.nativeTargetDirAbs, 'Info.plist'); + if (!existsSync(infoPlist)) { + return false; + } + const entries = parse(readFileSync(infoPlist, 'utf-8')) as PlistObject; + return entries['UIApplicationSceneManifest'] !== undefined; +} + +export async function addSceneManifestIfNeeded(config: Config): Promise { + type Mutable = { -readonly [P in keyof T]: T[P] }; + + const infoPlist = resolve(config.ios.nativeTargetDirAbs, 'Info.plist'); + + if (!existsSync(infoPlist)) { + logger.warn(infoPlist + ' not found.'); + return; + } + + const entries = parse(readFileSync(infoPlist, 'utf-8')) as Mutable; + + if (entries['UIApplicationSceneManifest'] !== undefined) { + logger.warn('Found UIApplicationSceneManifest in ' + infoPlist + ', skipping.'); + return; + } + + entries['UIApplicationSceneManifest'] = { + UIApplicationSupportsMultipleScenes: false, + UISceneConfigurations: { + UIWindowSceneSessionRoleApplication: [ + { + UISceneConfigurationName: 'Default Configuration', + UISceneDelegateClassName: '$(PRODUCT_MODULE_NAME).SceneDelegate', + UISceneStoryboardFile: 'Main', + }, + ], + }, + }; + + writeFileSync(infoPlist, build(entries)); +} + export async function checkSwiftToolsVersion(config: Config, version: string | undefined): Promise { if (!version) { return null; diff --git a/cli/src/util/xcode.ts b/cli/src/util/xcode.ts new file mode 100644 index 000000000..64ab836a3 --- /dev/null +++ b/cli/src/util/xcode.ts @@ -0,0 +1,53 @@ +import { writeFileSync } from 'fs-extra'; +import { project as loadXcodeProject } from 'xcode'; +import type { XcodeProject } from 'xcode'; + +/** + * Register a Swift source file with the first native target of an Xcode project. + * + * Writes entries in PBXFileReference, PBXBuildFile, the named PBXGroup's children, + * and the target's Sources build phase. Idempotent: a second call is a no-op. + * + * @param pbxprojPath Absolute path to project.pbxproj + * @param groupName Comment/name of the PBXGroup the file belongs under (e.g. 'App') + * @param fileRelPath Path of the file relative to the group (e.g. 'SceneDelegate.swift') + */ +export function addSwiftFileToAppTarget( + pbxprojPath: string, + groupName: string, + fileRelPath: string, +): { added: boolean } { + const project = loadXcodeProject(pbxprojPath); + project.parseSync(); + + if (project.hasFile(fileRelPath)) { + return { added: false }; + } + + const groupUuid = findGroupUuidByComment(project, groupName); + if (!groupUuid) { + throw new Error(`Could not find PBXGroup with comment "${groupName}" in ${pbxprojPath}`); + } + + const targetUuid = project.getFirstTarget().uuid; + const result = project.addSourceFile(fileRelPath, { target: targetUuid }, groupUuid); + if (!result) { + throw new Error(`Failed to register ${fileRelPath} in ${pbxprojPath}`); + } + + writeFileSync(pbxprojPath, project.writeSync(), 'utf-8'); + return { added: true }; +} + +// Exported for tests. +export function findGroupUuidByComment(project: XcodeProject, comment: string): string | null { + const groups = project.hash.project.objects.PBXGroup; + const COMMENT_SUFFIX = '_comment'; + for (const key of Object.keys(groups)) { + if (!key.endsWith(COMMENT_SUFFIX)) continue; + if (groups[key] === comment) { + return key.substring(0, key.length - COMMENT_SUFFIX.length); + } + } + return null; +} diff --git a/cli/test/migrate-uiscene-detect.spec.ts b/cli/test/migrate-uiscene-detect.spec.ts new file mode 100644 index 000000000..4c73819e2 --- /dev/null +++ b/cli/test/migrate-uiscene-detect.spec.ts @@ -0,0 +1,36 @@ +import { __testables } from '../src/tasks/migrate-uiscene'; + +const { classify } = __testables; + +describe('migrate-uiscene classify', () => { + it('returns eligible when nothing scene-related is present', () => { + expect( + classify({ + hasManifest: false, + hasSceneDelegate: false, + hasConfigurationForConnecting: false, + }), + ).toBe('eligible'); + }); + + it('returns already-migrated when all three signals are present', () => { + expect( + classify({ + hasManifest: true, + hasSceneDelegate: true, + hasConfigurationForConnecting: true, + }), + ).toBe('already-migrated'); + }); + + it.each([ + [{ hasManifest: true, hasSceneDelegate: false, hasConfigurationForConnecting: false }], + [{ hasManifest: false, hasSceneDelegate: true, hasConfigurationForConnecting: false }], + [{ hasManifest: false, hasSceneDelegate: false, hasConfigurationForConnecting: true }], + [{ hasManifest: true, hasSceneDelegate: true, hasConfigurationForConnecting: false }], + [{ hasManifest: true, hasSceneDelegate: false, hasConfigurationForConnecting: true }], + [{ hasManifest: false, hasSceneDelegate: true, hasConfigurationForConnecting: true }], + ])('returns partial for mixed signals %j', (signals) => { + expect(classify(signals)).toBe('partial'); + }); +}); diff --git a/cli/test/migrate-uiscene-plist.spec.ts b/cli/test/migrate-uiscene-plist.spec.ts new file mode 100644 index 000000000..dc3bd2513 --- /dev/null +++ b/cli/test/migrate-uiscene-plist.spec.ts @@ -0,0 +1,159 @@ +import { readFileSync, writeFileSync } from 'fs-extra'; +import { join } from 'path'; +import type { PlistObject } from 'plist'; +import { parse } from 'plist'; + +import type { Config } from '../src/definitions'; +import { addSceneManifestIfNeeded, hasSceneManifest } from '../src/util/spm'; + +import { mktmp } from './util'; + +const PRE_UISCENE_INFO_PLIST = ` + + + + CFBundleDisplayName + My App + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + + +`; + +const POST_UISCENE_INFO_PLIST = ` + + + + CFBundleDisplayName + My App + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Existing Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).CustomSceneDelegate + + + + + + +`; + +function makeFakeConfig(nativeTargetDirAbs: string): Config { + return { ios: { nativeTargetDirAbs } } as unknown as Config; +} + +describe('addSceneManifestIfNeeded', () => { + let tmpDir: any; + let plistPath: string; + let config: Config; + + beforeEach(async () => { + tmpDir = await mktmp(); + plistPath = join(tmpDir.path, 'Info.plist'); + config = makeFakeConfig(tmpDir.path); + }); + + afterEach(() => { + tmpDir.cleanupCallback(); + }); + + it('adds the scene manifest when absent', async () => { + writeFileSync(plistPath, PRE_UISCENE_INFO_PLIST); + + await addSceneManifestIfNeeded(config); + + const parsed = parse(readFileSync(plistPath, 'utf-8')) as PlistObject; + const manifest = parsed['UIApplicationSceneManifest'] as PlistObject; + expect(manifest['UIApplicationSupportsMultipleScenes']).toBe(false); + const configs = manifest['UISceneConfigurations'] as PlistObject; + const roleArray = configs['UIWindowSceneSessionRoleApplication'] as PlistObject[]; + expect(roleArray).toHaveLength(1); + expect(roleArray[0]['UISceneConfigurationName']).toBe('Default Configuration'); + expect(roleArray[0]['UISceneDelegateClassName']).toBe('$(PRODUCT_MODULE_NAME).SceneDelegate'); + expect(roleArray[0]['UISceneStoryboardFile']).toBe('Main'); + }); + + it('preserves sibling keys', async () => { + writeFileSync(plistPath, PRE_UISCENE_INFO_PLIST); + + await addSceneManifestIfNeeded(config); + + const parsed = parse(readFileSync(plistPath, 'utf-8')) as PlistObject; + expect(parsed['CFBundleDisplayName']).toBe('My App'); + expect(parsed['UILaunchStoryboardName']).toBe('LaunchScreen'); + expect(parsed['UIMainStoryboardFile']).toBe('Main'); + }); + + it('is a no-op when the manifest already exists and does not overwrite user data', async () => { + writeFileSync(plistPath, POST_UISCENE_INFO_PLIST); + + await addSceneManifestIfNeeded(config); + + const parsed = parse(readFileSync(plistPath, 'utf-8')) as PlistObject; + const manifest = parsed['UIApplicationSceneManifest'] as PlistObject; + const configs = manifest['UISceneConfigurations'] as PlistObject; + const roleArray = configs['UIWindowSceneSessionRoleApplication'] as PlistObject[]; + expect(roleArray[0]['UISceneConfigurationName']).toBe('Existing Configuration'); + expect(roleArray[0]['UISceneDelegateClassName']).toBe('$(PRODUCT_MODULE_NAME).CustomSceneDelegate'); + }); + + it('is idempotent across repeated runs', async () => { + writeFileSync(plistPath, PRE_UISCENE_INFO_PLIST); + + await addSceneManifestIfNeeded(config); + const firstOutput = readFileSync(plistPath, 'utf-8'); + await addSceneManifestIfNeeded(config); + const secondOutput = readFileSync(plistPath, 'utf-8'); + await addSceneManifestIfNeeded(config); + const thirdOutput = readFileSync(plistPath, 'utf-8'); + + expect(secondOutput).toBe(firstOutput); + expect(thirdOutput).toBe(firstOutput); + }); + + it('is a no-op when the plist does not exist', async () => { + // No write — plist file is missing. + await expect(addSceneManifestIfNeeded(config)).resolves.toBeUndefined(); + }); +}); + +describe('hasSceneManifest', () => { + let tmpDir: any; + let plistPath: string; + let config: Config; + + beforeEach(async () => { + tmpDir = await mktmp(); + plistPath = join(tmpDir.path, 'Info.plist'); + config = makeFakeConfig(tmpDir.path); + }); + + afterEach(() => { + tmpDir.cleanupCallback(); + }); + + it('returns false when the manifest key is absent', () => { + writeFileSync(plistPath, PRE_UISCENE_INFO_PLIST); + expect(hasSceneManifest(config)).toBe(false); + }); + + it('returns true when the manifest key is present', () => { + writeFileSync(plistPath, POST_UISCENE_INFO_PLIST); + expect(hasSceneManifest(config)).toBe(true); + }); + + it('returns false when the plist does not exist', () => { + expect(hasSceneManifest(config)).toBe(false); + }); +}); diff --git a/cli/test/migrate-uiscene-scan.spec.ts b/cli/test/migrate-uiscene-scan.spec.ts new file mode 100644 index 000000000..c0d7964dd --- /dev/null +++ b/cli/test/migrate-uiscene-scan.spec.ts @@ -0,0 +1,167 @@ +import { mkdirp, writeFileSync } from 'fs-extra'; +import { join } from 'path'; + +import type { Config } from '../src/definitions'; +import { logger } from '../src/log'; +import { __testables } from '../src/tasks/migrate-uiscene'; + +import { mktmp } from './util'; + +const { hasCustomDelegateBody, scanAndWarn } = __testables; + +const OPEN_URL_SIG = /func application\([^)]*\bopen url:/; +const CONTINUE_SIG = /func application\([^)]*\bcontinue userActivity:/; + +const VANILLA_OPEN_URL = ` +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // Called when the app was launched with a url. + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } +} +`; + +const CUSTOM_OPEN_URL = ` +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + print("received url: \\(url)") + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } +} +`; + +const VANILLA_CONTINUE = ` +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } +} +`; + +const CUSTOM_CONTINUE = ` +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + MyAnalytics.track(userActivity) + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } +} +`; + +describe('hasCustomDelegateBody', () => { + it('returns false for the vanilla open-url body', () => { + expect(hasCustomDelegateBody(VANILLA_OPEN_URL, OPEN_URL_SIG)).toBe(false); + }); + + it('returns true for an open-url body with a print statement', () => { + expect(hasCustomDelegateBody(CUSTOM_OPEN_URL, OPEN_URL_SIG)).toBe(true); + }); + + it('returns false for the vanilla continue userActivity body', () => { + expect(hasCustomDelegateBody(VANILLA_CONTINUE, CONTINUE_SIG)).toBe(false); + }); + + it('returns true for a continue userActivity body with extra work', () => { + expect(hasCustomDelegateBody(CUSTOM_CONTINUE, CONTINUE_SIG)).toBe(true); + }); + + it('returns false when the method is not present', () => { + expect(hasCustomDelegateBody('class AppDelegate {}', OPEN_URL_SIG)).toBe(false); + }); + + it('ignores line comments inside the body', () => { + const source = ` +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // This comment is fine, feel free to add processing. + // Second comment line. + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } +} +`; + expect(hasCustomDelegateBody(source, OPEN_URL_SIG)).toBe(false); + }); +}); + +describe('scanAndWarn', () => { + let tmpDir: any; + let iosDir: string; + let appDir: string; + let warnSpy: jest.SpyInstance; + let infoSpy: jest.SpyInstance; + + beforeEach(async () => { + tmpDir = await mktmp(); + iosDir = join(tmpDir.path, 'ios'); + appDir = join(iosDir, 'App', 'App'); + await mkdirp(appDir); + warnSpy = jest.spyOn(logger, 'warn').mockImplementation(() => undefined); + infoSpy = jest.spyOn(logger, 'info').mockImplementation(() => undefined); + }); + + afterEach(() => { + warnSpy.mockRestore(); + infoSpy.mockRestore(); + tmpDir.cleanupCallback(); + }); + + function makeConfig(): Config { + return { + ios: { platformDirAbs: iosDir, nativeTargetDirAbs: appDir }, + } as unknown as Config; + } + + it('warns on UIApplication.shared.applicationState references', async () => { + writeFileSync( + join(appDir, 'SomeVC.swift'), + `import UIKit\nclass Foo {\n func check() {\n if UIApplication.shared.applicationState == .active { print("hi") }\n }\n}\n`, + ); + + await scanAndWarn(makeConfig()); + + const messages = warnSpy.mock.calls.map((c) => c[0]); + expect(messages.some((m) => m.includes('applicationState'))).toBe(true); + expect(messages.some((m) => m.includes('SomeVC.swift:4'))).toBe(true); + }); + + it('warns on tmpWindow and TmpViewController references', async () => { + writeFileSync(join(appDir, 'Legacy.swift'), `let w = tmpWindow\nlet vc: TmpViewController? = nil\n`); + + await scanAndWarn(makeConfig()); + + const messages = warnSpy.mock.calls.map((c) => c[0]); + expect(messages.some((m) => m.includes('tmpWindow'))).toBe(true); + expect(messages.some((m) => m.includes('TmpViewController'))).toBe(true); + }); + + it('warns on custom AppDelegate handlers', async () => { + writeFileSync(join(appDir, 'AppDelegate.swift'), CUSTOM_OPEN_URL + CUSTOM_CONTINUE); + + await scanAndWarn(makeConfig()); + + const messages = warnSpy.mock.calls.map((c) => c[0]); + expect(messages.some((m) => m.includes('custom application(_:open:) body'))).toBe(true); + expect(messages.some((m) => m.includes('custom application(_:continue:) body'))).toBe(true); + }); + + it('is silent on a clean project', async () => { + writeFileSync(join(appDir, 'AppDelegate.swift'), VANILLA_OPEN_URL + VANILLA_CONTINUE); + writeFileSync(join(appDir, 'CleanCode.swift'), `class Clean {}\n`); + + await scanAndWarn(makeConfig()); + + expect(warnSpy).not.toHaveBeenCalled(); + }); + + it('skips Pods/, build/, and DerivedData/ directories', async () => { + const podsDir = join(iosDir, 'App', 'Pods'); + const buildDir = join(iosDir, 'App', 'build'); + await mkdirp(podsDir); + await mkdirp(buildDir); + writeFileSync(join(podsDir, 'ThirdParty.swift'), `let x = UIApplication.shared.applicationState\n`); + writeFileSync(join(buildDir, 'Generated.swift'), `class TmpViewController {}\n`); + + await scanAndWarn(makeConfig()); + + expect(warnSpy).not.toHaveBeenCalled(); + }); +}); diff --git a/cli/test/migrate-uiscene-scene-delegate.spec.ts b/cli/test/migrate-uiscene-scene-delegate.spec.ts new file mode 100644 index 000000000..b2f400588 --- /dev/null +++ b/cli/test/migrate-uiscene-scene-delegate.spec.ts @@ -0,0 +1,98 @@ +import { readFileSync } from 'fs-extra'; +import { resolve } from 'path'; + +import { __testables } from '../src/tasks/migrate-uiscene'; + +const { extractConfigurationForConnecting, insertBeforeAppDelegateClassEnd } = __testables; + +const REPO_ROOT = resolve(__dirname, '..', '..'); +const SHIPPED_APP_DELEGATE_SPM = resolve(REPO_ROOT, 'ios-spm-template/App/App/AppDelegate.swift'); +const SHIPPED_APP_DELEGATE_PODS = resolve(REPO_ROOT, 'ios-pods-template/App/App/AppDelegate.swift'); + +describe('extractConfigurationForConnecting', () => { + it('slices the method out of the shipped SPM AppDelegate', () => { + const shipped = readFileSync(SHIPPED_APP_DELEGATE_SPM, 'utf-8'); + const snippet = extractConfigurationForConnecting(shipped); + expect(snippet).not.toBeNull(); + expect(snippet).toContain('configurationForConnecting connectingSceneSession: UISceneSession'); + expect(snippet).toContain('UISceneConfiguration(name: "Default Configuration"'); + expect(snippet).toContain('config.delegateClass = SceneDelegate.self'); + expect(snippet!.startsWith('\n')).toBe(true); + expect(snippet!.endsWith('\n')).toBe(true); + }); + + it('slices the method out of the shipped Pods AppDelegate', () => { + const shipped = readFileSync(SHIPPED_APP_DELEGATE_PODS, 'utf-8'); + const snippet = extractConfigurationForConnecting(shipped); + expect(snippet).not.toBeNull(); + expect(snippet).toContain('configurationForConnecting connectingSceneSession: UISceneSession'); + expect(snippet).toContain('config.delegateClass = SceneDelegate.self'); + }); + + it('returns null when the method signature is absent', () => { + const source = `import UIKit\n\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n var window: UIWindow?\n}\n`; + expect(extractConfigurationForConnecting(source)).toBeNull(); + }); +}); + +describe('insertBeforeAppDelegateClassEnd', () => { + it('turns a pre-UIScene AppDelegate into the shipped SPM AppDelegate', () => { + const shipped = readFileSync(SHIPPED_APP_DELEGATE_SPM, 'utf-8'); + const snippet = extractConfigurationForConnecting(shipped); + expect(snippet).not.toBeNull(); + const pre = stripConfigurationForConnecting(shipped); + + const patched = insertBeforeAppDelegateClassEnd(pre, snippet!); + + expect(patched).toBe(shipped); + }); + + it('returns null when no AppDelegate class is present', () => { + const source = `import UIKit\n\nstruct Something {}\n`; + expect(insertBeforeAppDelegateClassEnd(source, '\n func x() {}\n')).toBeNull(); + }); + + it('returns null when class braces are unbalanced', () => { + const source = `class AppDelegate: UIResponder {\n func foo() {\n`; + expect(insertBeforeAppDelegateClassEnd(source, '\n func x() {}\n')).toBeNull(); + }); + + it('inserts inside the class, before its closing brace, even with a trailing extension', () => { + const source = [ + 'class AppDelegate: UIResponder, UIApplicationDelegate {', + ' func a() {}', + '}', + '', + 'extension AppDelegate {', + ' func b() {}', + '}', + '', + ].join('\n'); + + const patched = insertBeforeAppDelegateClassEnd(source, '\n func injected() {}\n'); + + expect(patched).toBe( + [ + 'class AppDelegate: UIResponder, UIApplicationDelegate {', + ' func a() {}', + '', + ' func injected() {}', + '}', + '', + 'extension AppDelegate {', + ' func b() {}', + '}', + '', + ].join('\n'), + ); + }); +}); + +function stripConfigurationForConnecting(source: string): string { + // Remove the configurationForConnecting method + its leading blank line from the shipped template, + // yielding an 8.4-shaped AppDelegate for use as a fixture. + return source.replace( + /\n\n {4}func application\(_ application: UIApplication,\n {21}configurationForConnecting[\s\S]*?\n {4}\}\n\}/, + '\n}', + ); +} diff --git a/cli/test/xcode.spec.ts b/cli/test/xcode.spec.ts new file mode 100644 index 000000000..e6aa08357 --- /dev/null +++ b/cli/test/xcode.spec.ts @@ -0,0 +1,114 @@ +import { readFileSync, writeFileSync } from 'fs-extra'; +import { join, resolve } from 'path'; +import { project as loadXcodeProject } from 'xcode'; + +import { addSwiftFileToAppTarget, findGroupUuidByComment } from '../src/util/xcode'; + +import { mktmp } from './util'; + +const REPO_ROOT = resolve(__dirname, '..', '..'); +const SHIPPED_PBXPROJ = resolve(REPO_ROOT, 'ios-spm-template/App/App.xcodeproj/project.pbxproj'); + +function stripSceneDelegate(source: string): string { + return source + .split('\n') + .filter((line) => !line.includes('SceneDelegate')) + .join('\n'); +} + +describe('findGroupUuidByComment', () => { + it('returns the UUID of the App group in the shipped pbxproj', () => { + const project = loadXcodeProject(SHIPPED_PBXPROJ); + project.parseSync(); + + const uuid = findGroupUuidByComment(project, 'App'); + + expect(uuid).toMatch(/^[A-F0-9]{24}$/); + const group = project.getPBXGroupByKey(uuid!); + expect(group).toBeDefined(); + expect(group?.path).toBe('App'); + }); + + it('returns null for a group name that does not exist', () => { + const project = loadXcodeProject(SHIPPED_PBXPROJ); + project.parseSync(); + + expect(findGroupUuidByComment(project, 'NonExistentGroup')).toBeNull(); + }); +}); + +describe('addSwiftFileToAppTarget', () => { + let tmpDir: any; + let pbxprojPath: string; + + beforeEach(async () => { + tmpDir = await mktmp(); + pbxprojPath = join(tmpDir.path, 'project.pbxproj'); + }); + + afterEach(() => { + tmpDir.cleanupCallback(); + }); + + it('registers a new Swift file in all four pbxproj sections', () => { + const preUISceneSource = stripSceneDelegate(readFileSync(SHIPPED_PBXPROJ, 'utf-8')); + writeFileSync(pbxprojPath, preUISceneSource); + + const result = addSwiftFileToAppTarget(pbxprojPath, 'App', 'SceneDelegate.swift'); + + expect(result.added).toBe(true); + + // Reparse the written file and verify each section. + const project = loadXcodeProject(pbxprojPath); + project.parseSync(); + + const objects = project.hash.project.objects; + + const fileRefs = Object.entries(objects.PBXFileReference).filter(([k]) => !k.endsWith('_comment')); + expect(fileRefs.some(([, ref]) => typeof ref === 'object' && (ref as any).path === '"SceneDelegate.swift"')).toBe( + true, + ); + + const buildFiles = Object.entries(objects.PBXBuildFile).filter(([k]) => !k.endsWith('_comment')); + expect( + buildFiles.some(([k]) => (objects.PBXBuildFile as any)[`${k}_comment`]?.includes('SceneDelegate.swift')), + ).toBe(true); + + const appGroupUuid = findGroupUuidByComment(project, 'App')!; + const appGroup = project.getPBXGroupByKey(appGroupUuid)!; + expect(appGroup.children.some((c: any) => c.comment === 'SceneDelegate.swift')).toBe(true); + + const sourcesPhase = objects.PBXSourcesBuildPhase!; + const sourcesEntries = Object.entries(sourcesPhase).filter(([k]) => !k.endsWith('_comment')); + const [, sourcesObj] = sourcesEntries[0]; + expect((sourcesObj as any).files.some((f: any) => f.comment?.includes('SceneDelegate.swift'))).toBe(true); + }); + + it('is a no-op when the file is already registered', () => { + writeFileSync(pbxprojPath, readFileSync(SHIPPED_PBXPROJ, 'utf-8')); + + const before = readFileSync(pbxprojPath, 'utf-8'); + const result = addSwiftFileToAppTarget(pbxprojPath, 'App', 'SceneDelegate.swift'); + const after = readFileSync(pbxprojPath, 'utf-8'); + + expect(result.added).toBe(false); + expect(after).toBe(before); + }); + + it('is idempotent across repeated runs', () => { + const preUISceneSource = stripSceneDelegate(readFileSync(SHIPPED_PBXPROJ, 'utf-8')); + writeFileSync(pbxprojPath, preUISceneSource); + + expect(addSwiftFileToAppTarget(pbxprojPath, 'App', 'SceneDelegate.swift').added).toBe(true); + expect(addSwiftFileToAppTarget(pbxprojPath, 'App', 'SceneDelegate.swift').added).toBe(false); + expect(addSwiftFileToAppTarget(pbxprojPath, 'App', 'SceneDelegate.swift').added).toBe(false); + }); + + it('throws when the target group cannot be found', () => { + writeFileSync(pbxprojPath, stripSceneDelegate(readFileSync(SHIPPED_PBXPROJ, 'utf-8'))); + + expect(() => addSwiftFileToAppTarget(pbxprojPath, 'DoesNotExist', 'SceneDelegate.swift')).toThrow( + /Could not find PBXGroup/, + ); + }); +}); From 3ab4139bd0b8863cadcb175180ea941f4c244f08 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of theproducer)" Date: Fri, 31 Jul 2026 15:46:24 +0000 Subject: [PATCH 28/39] Release 8.5.0 --- CHANGELOG.md | 11 +++++++++++ android/CHANGELOG.md | 4 ++++ android/package.json | 4 ++-- cli/CHANGELOG.md | 10 ++++++++++ cli/package.json | 2 +- core/CHANGELOG.md | 4 ++++ core/package.json | 2 +- ios/CHANGELOG.md | 6 ++++++ ios/package.json | 4 ++-- lerna.json | 2 +- 10 files changed, 42 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41320fefa..a450e9376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) + +### Bug Fixes + +- **cli:** support TypeScript 7 when loading capacitor.config.ts ([#8534](https://github.com/ionic-team/capacitor/issues/8534)) ([4c1c870](https://github.com/ionic-team/capacitor/commit/4c1c8709413b9c19b008c99122ca330cc3c90e6f)) + +### Features + +- **cli:** add migrator functionality for adopting UIScene ([#8544](https://github.com/ionic-team/capacitor/issues/8544)) ([984fa85](https://github.com/ionic-team/capacitor/commit/984fa85ba0adab0aacf895aed6323bf4b503dccb)) +- **ios:** UIScene Support ([#8536](https://github.com/ionic-team/capacitor/issues/8536)) ([3fa04a3](https://github.com/ionic-team/capacitor/commit/3fa04a357c92af34cd6fccb8124791963804a9dc)) + ## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 106d9c0c8..9b7407f1b 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) + +**Note:** Version bump only for package @capacitor/android + ## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) ### Bug Fixes diff --git a/android/package.json b/android/package.json index 285d9ec78..9311c332a 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.4.2", + "version": "8.5.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", @@ -23,7 +23,7 @@ "verify": "./gradlew clean lint build test -b capacitor/build.gradle" }, "peerDependencies": { - "@capacitor/core": "^8.4.0" + "@capacitor/core": "^8.5.0" }, "publishConfig": { "access": "public" diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 3fb75e17a..166dc16c6 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) + +### Bug Fixes + +- **cli:** support TypeScript 7 when loading capacitor.config.ts ([#8534](https://github.com/ionic-team/capacitor/issues/8534)) ([4c1c870](https://github.com/ionic-team/capacitor/commit/4c1c8709413b9c19b008c99122ca330cc3c90e6f)) + +### Features + +- **cli:** add migrator functionality for adopting UIScene ([#8544](https://github.com/ionic-team/capacitor/issues/8544)) ([984fa85](https://github.com/ionic-team/capacitor/commit/984fa85ba0adab0aacf895aed6323bf4b503dccb)) + ## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) **Note:** Version bump only for package @capacitor/cli diff --git a/cli/package.json b/cli/package.json index 627f846a3..77d2cde8c 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.4.2", + "version": "8.5.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/core/CHANGELOG.md b/core/CHANGELOG.md index a90269b59..772a593c8 100644 --- a/core/CHANGELOG.md +++ b/core/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) + +**Note:** Version bump only for package @capacitor/core + ## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index 870ee47a7..b5db0ad35 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.4.2", + "version": "8.5.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index 9a30e6bb4..08e2603b1 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) + +### Features + +- **ios:** UIScene Support ([#8536](https://github.com/ionic-team/capacitor/issues/8536)) ([3fa04a3](https://github.com/ionic-team/capacitor/commit/3fa04a357c92af34cd6fccb8124791963804a9dc)) + ## [8.4.2](https://github.com/ionic-team/capacitor/compare/8.4.1...8.4.2) (2026-07-14) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index 5e0fbed66..41382350b 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.4.2", + "version": "8.5.0", "description": "Capacitor: Cross-platform apps with JavaScript and the web", "homepage": "https://capacitorjs.com", "author": "Ionic Team (https://ionic.io)", @@ -25,7 +25,7 @@ "xc:build:CapacitorCordova": "cd CapacitorCordova && xcodebuild && cd .." }, "peerDependencies": { - "@capacitor/core": "^8.4.0" + "@capacitor/core": "^8.5.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index fbd4baa8e..900fe9a29 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.4.2", + "version": "8.5.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 5e5bb3befc312477900252ab07e23b596f8cb0d1 Mon Sep 17 00:00:00 2001 From: Omri Willheim <48905545+omriwil@users.noreply.github.com> Date: Thu, 6 Aug 2026 18:11:13 +0300 Subject: [PATCH 29/39] fix(cli): use POSIX paths in CapApp-SPM Package.swift (#8549) Co-authored-by: Cursor --- cli/src/util/spm.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 65cd0f11f..93b1dd38f 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -12,6 +12,7 @@ import { getMajoriOSVersion } from '../ios/common'; import { logger } from '../log'; import type { Plugin } from '../plugin'; import { getPlatformElement, getPluginPlatform, getPluginType, PluginType } from '../plugin'; +import { convertToUnixPath } from '../util/fs'; import { runCommand } from '../util/subprocess'; export interface SwiftPlugin { @@ -122,7 +123,7 @@ let package = Package( if (getPluginType(plugin, config.ios.name) === PluginType.Cordova) { const platformTag = getPluginPlatform(plugin, config.ios.name); if (platformTag.$?.package) { - const relPath = relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath); + const relPath = convertToUnixPath(relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath)); packageSwiftText += `,\n .package(name: "${plugin.id}", path: "${relPath}")`; } else { const sourceFiles = getPlatformElement(plugin, config.ios.name, 'source-file'); @@ -136,7 +137,9 @@ let package = Package( const options = packageOptions[plugin.id]; const symlink = options?.symlink; const symlinkFolder = join('symlinks', plugin.name); - const relPath = symlink ? symlinkFolder : relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath); + const relPath = symlink + ? symlinkFolder + : convertToUnixPath(relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath)); if (symlink) { await ensureSymlink(plugin.rootPath, resolve(config.ios.nativeProjectDirAbs, 'CapApp-SPM', symlinkFolder)); } From 5ac4dd613ae989d8dc8738ea25b77efbd4fa21fe Mon Sep 17 00:00:00 2001 From: Manik Tyagi Date: Tue, 11 Aug 2026 01:18:36 +0530 Subject: [PATCH 30/39] fix(core): prevent removeListener from removing wrong listener (#8271) Co-authored-by: Eric Horodyski --- core/src/tests/web-plugin.spec.ts | 26 ++++++++++++++++++++++++++ core/src/web-plugin.ts | 4 +++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/src/tests/web-plugin.spec.ts b/core/src/tests/web-plugin.spec.ts index cb4a65ba0..1e6d4a7f8 100644 --- a/core/src/tests/web-plugin.spec.ts +++ b/core/src/tests/web-plugin.spec.ts @@ -181,4 +181,30 @@ describe('Web Plugin', () => { expect(handlerFunction).not.toHaveBeenCalled(); }); + + it('Should not remove a listener if it is not found', async () => { + const lf1 = (event: any) => { + console.log(event); + }; + const lf2 = (event: any) => { + console.log(event); + }; + const lf3 = (event: any) => { + console.log(event); + }; + + await plugin.addListener('test', lf1); + await plugin.addListener('test', lf2); + + const listenersBefore = plugin.getListeners()['test']; + expect(listenersBefore.length).toEqual(2); + + // Try to remove a listener that was never added + await (plugin as any).removeListener('test', lf3); + + const listenersAfter = plugin.getListeners()['test']; + expect(listenersAfter.length).toEqual(2); + expect(listenersAfter[0]).toBe(lf1); + expect(listenersAfter[1]).toBe(lf2); + }); }); diff --git a/core/src/web-plugin.ts b/core/src/web-plugin.ts index fbc8fcdd5..5fb324ee5 100644 --- a/core/src/web-plugin.ts +++ b/core/src/web-plugin.ts @@ -98,7 +98,9 @@ export class WebPlugin implements Plugin { } const index = listeners.indexOf(listenerFunc); - this.listeners[eventName].splice(index, 1); + if (index !== -1) { + this.listeners[eventName].splice(index, 1); + } // If there are no more listeners for this type of event, // remove the window listener From 0778449261e75459366e3012e2aa0e4fc75fbe04 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 14:48:30 +0000 Subject: [PATCH 31/39] fix: address PR #115 review findings and lint failures Restore @capacitor-plus package identity after upstream sync, fix SystemBars safe-area and navBarVisible handling, harden UIScene migration and CLI telemetry paths, align ci.yml with repo Bun policy, and restore plus-specific test coverage. Co-authored-by: Martin DONADIEU --- .github/workflows/ci.yml | 105 +++++++++------- .../getcapacitor/BridgeWebChromeClient.java | 6 + .../cordova/MockCordovaWebViewImpl.java | 14 ++- .../com/getcapacitor/plugin/SystemBars.java | 26 ++-- .../getcapacitor/plugin/SystemBarsTest.java | 65 +++++++++- .../plugin/util/HttpRequestHandlerTest.java | 4 +- android/package.json | 9 +- bun.lock | 34 ++++-- cli/package.json | 8 +- cli/src/ios/update.ts | 12 +- cli/src/ipc.ts | 6 + cli/src/tasks/migrate-uiscene.ts | 114 +++++++++++++----- cli/src/tasks/migrate.ts | 2 +- cli/src/tasks/run.ts | 5 +- cli/src/util/spm.ts | 10 +- cli/src/util/xcode.ts | 44 ++++++- cli/test/migrate-uiscene-scan.spec.ts | 8 +- .../migrate-uiscene-scene-delegate.spec.ts | 12 +- cli/test/xcode.spec.ts | 21 ++-- core/package.json | 8 +- .../Capacitor/CAPSceneDelegateProxy.swift | 4 +- ios/Capacitor/Capacitor/CapacitorBridge.swift | 8 ++ ios/package.json | 9 +- 23 files changed, 393 insertions(+), 141 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56fce5389..e8184ab49 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,6 +11,9 @@ on: branches: - '**' +permissions: + contents: read + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} @@ -18,79 +21,91 @@ concurrency: jobs: setup: runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 10 steps: - name: Get Latest uses: actions/setup-node@v6 with: - node-version: 22.x - - uses: actions/checkout@v5 + node-version: 24.x + - uses: oven-sh/setup-bun@v2 + - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Restore Dependency Cache uses: actions/cache@v4 with: - path: ~/.npm - key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} + path: ~/.bun/install/cache + key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} lint: runs-on: macos-15 - timeout-minutes: 30 + timeout-minutes: 10 steps: - uses: actions/setup-node@v6 with: - node-version: 22.x - - uses: actions/checkout@v5 + node-version: 24.x + - uses: oven-sh/setup-bun@v2 + - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Restore Dependency Cache uses: actions/cache@v4 with: - path: ~/.npm - key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} - - run: npm install + path: ~/.bun/install/cache + key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} + - run: bun install --frozen-lockfile --linker=hoisted - run: brew install swiftlint - - run: npm run lint + - run: bun run lint test-cli: runs-on: macos-15 - timeout-minutes: 30 + timeout-minutes: 10 needs: - setup - lint steps: - uses: actions/setup-node@v6 with: - node-version: 22.x - - uses: actions/checkout@v5 + node-version: 24.x + - uses: oven-sh/setup-bun@v2 + - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Restore Dependency Cache uses: actions/cache@v4 with: - path: ~/.npm - key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} - - run: npm install - - run: npm run build + path: ~/.bun/install/cache + key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} + - run: bun install --frozen-lockfile --linker=hoisted + - run: bun run build working-directory: ./cli - - run: npm test + - run: bun run test working-directory: ./cli test-core: runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 10 needs: - setup - lint steps: - uses: actions/setup-node@v6 with: - node-version: 22.x - - uses: actions/checkout@v5 + node-version: 24.x + - uses: oven-sh/setup-bun@v2 + - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Restore Dependency Cache uses: actions/cache@v4 with: - path: ~/.npm - key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} - - run: npm install - - run: npm run build + path: ~/.bun/install/cache + key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} + - run: bun install --frozen-lockfile --linker=hoisted + - run: bun run build working-directory: ./core - - run: npm test + - run: bun run test working-directory: ./core test-ios: runs-on: macos-15 - timeout-minutes: 30 + timeout-minutes: 10 needs: - setup - lint @@ -104,39 +119,45 @@ jobs: - run: xcodebuild -downloadPlatform iOS - uses: actions/setup-node@v6 with: - node-version: 22.x - - uses: actions/checkout@v5 + node-version: 24.x + - uses: oven-sh/setup-bun@v2 + - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Restore Dependency Cache uses: actions/cache@v4 with: - path: ~/.npm - key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} - - run: npm install - - run: npm run verify + path: ~/.bun/install/cache + key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} + - run: bun install --frozen-lockfile --linker=hoisted + - run: bun run verify working-directory: ./ios - name: Validate native podspec run: sh ./scripts/native-podspec.sh lint test-android: runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 10 needs: - setup - lint steps: - uses: actions/setup-node@v6 with: - node-version: 22.x + node-version: 24.x + - uses: oven-sh/setup-bun@v2 - name: set up JDK 21 uses: actions/setup-java@v5 with: java-version: '21' distribution: 'zulu' - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 + with: + persist-credentials: false - name: Restore Dependency Cache uses: actions/cache@v4 with: - path: ~/.npm - key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} - - run: npm install - - run: npm run verify + path: ~/.bun/install/cache + key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} + - run: bun install --frozen-lockfile --linker=hoisted + - run: bun run verify working-directory: ./android diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java index bac57209f..c2075811a 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java @@ -412,6 +412,12 @@ private boolean showImageCapturePicker(final ValueCallback filePathCallba } takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); + + // Store in static variables to survive activity recreation + pendingFilePathCallback = filePathCallback; + pendingImageFileUri = imageFileUri; + pendingFileChooserType = FileChooserType.IMAGE_CAPTURE; + activityListener = (activityResult) -> { Uri[] result = null; if (activityResult.getResultCode() == Activity.RESULT_OK) { diff --git a/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java b/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java index 020c1457a..1115429d7 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java +++ b/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java @@ -70,12 +70,14 @@ public CapacitorEvalBridgeMode(WebView webView, CordovaInterface cordova) { @Override public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) { - cordova.getActivity().runOnUiThread(() -> { - String js = queue.popAndEncodeAsJs(); - if (js != null) { - webView.evaluateJavascript(js, null); - } - }); + cordova + .getActivity() + .runOnUiThread(() -> { + String js = queue.popAndEncodeAsJs(); + if (js != null) { + webView.evaluateJavascript(js, null); + } + }); } } diff --git a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java index 9a50858f4..84a4bfa8a 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -44,17 +44,17 @@ public class SystemBars extends Plugin { private static final int WEBVIEW_VERSION_WITH_SAFE_AREA_KEYBOARD_FIX = 144; static final String viewportMetaJSFunction = """ - function capacitorSystemBarsCheckMetaViewport() { - const meta = document.querySelectorAll("meta[name=viewport]"); - if (meta.length == 0) { - return false; + function capacitorSystemBarsCheckMetaViewport() { + const meta = document.querySelectorAll("meta[name=viewport]"); + if (meta.length == 0) { + return false; + } + // get the last found meta viewport tag + const metaContent = meta[meta.length - 1].content; + return metaContent.includes("viewport-fit=cover"); } - // get the last found meta viewport tag - const metaContent = meta[meta.length - 1].content; - return metaContent.includes("viewport-fit=cover"); - } - capacitorSystemBarsCheckMetaViewport(); - """; + capacitorSystemBarsCheckMetaViewport(); + """; private String insetsHandling = INSETS_HANDLING_CSS; private boolean hasViewportCover = false; @@ -272,7 +272,7 @@ private void initWindowInsetsListener() { // We need to correct for a possible shown IME v.setPadding(0, 0, 0, keyboardVisible ? imeInsets.bottom : 0); - Insets safeAreaInsets = calcSafeAreaInsets(insets); + Insets safeAreaInsets = calcSafeAreaInsets(safeAreaSource); injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); return new WindowInsetsCompat.Builder(insets) @@ -297,7 +297,7 @@ private void initWindowInsetsListener() { .setInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), Insets.of(0, 0, 0, 0)) .build(); - Insets safeAreaInsets = calcSafeAreaInsets(newInsets); + Insets safeAreaInsets = calcSafeAreaInsets(safeAreaSource); injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); return newInsets; @@ -364,6 +364,7 @@ private void setHidden(boolean hide, String bar) { if (hide) { if (bar.isEmpty()) { windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.systemBars()); + navBarVisible = false; } else if (bar.equals(BAR_STATUS_BAR)) { windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.statusBars()); } else if (bar.equals(BAR_GESTURE_BAR)) { @@ -375,6 +376,7 @@ private void setHidden(boolean hide, String bar) { if (bar.isEmpty()) { windowInsetsControllerCompat.show(WindowInsetsCompat.Type.systemBars()); + navBarVisible = true; } else if (bar.equals(BAR_STATUS_BAR)) { windowInsetsControllerCompat.show(WindowInsetsCompat.Type.statusBars()); } else if (bar.equals(BAR_GESTURE_BAR)) { diff --git a/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java b/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java index f72373a88..0ea955ae8 100644 --- a/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java +++ b/android/capacitor/src/test/java/com/getcapacitor/plugin/SystemBarsTest.java @@ -1,5 +1,7 @@ package com.getcapacitor.plugin; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.never; @@ -13,6 +15,7 @@ import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; import com.getcapacitor.Bridge; +import java.lang.reflect.Field; import java.lang.reflect.Method; import org.junit.Test; import org.mockito.MockedStatic; @@ -46,8 +49,66 @@ public void showWithNavigationBarShowsOnlyNavigationBars() throws Exception { verify(controller, never()).show(WindowInsetsCompat.Type.statusBars()); } - private WindowInsetsControllerCompat invokeSetHidden(String bar) throws Exception { + @Test + public void hideWithEmptyBarHidesSystemBars() throws Exception { + WindowInsetsControllerCompat controller = invokeSetHidden(new SystemBars(), true, ""); + + verify(controller).hide(WindowInsetsCompat.Type.systemBars()); + verify(controller, never()).hide(WindowInsetsCompat.Type.statusBars()); + verify(controller, never()).hide(WindowInsetsCompat.Type.navigationBars()); + } + + @Test + public void hideWithStatusBarHidesOnlyStatusBars() throws Exception { + WindowInsetsControllerCompat controller = invokeSetHidden(new SystemBars(), true, "StatusBar"); + + verify(controller).hide(WindowInsetsCompat.Type.statusBars()); + verify(controller, never()).hide(WindowInsetsCompat.Type.systemBars()); + verify(controller, never()).hide(WindowInsetsCompat.Type.navigationBars()); + } + + @Test + public void togglingNavigationBarTracksNavBarVisible() throws Exception { + SystemBars plugin = new SystemBars(); + + invokeSetHidden(plugin, true, "NavigationBar"); + assertFalse(navBarVisible(plugin)); + + invokeSetHidden(plugin, false, "NavigationBar"); + assertTrue(navBarVisible(plugin)); + } + + @Test + public void togglingAllBarsTracksNavBarVisible() throws Exception { SystemBars plugin = new SystemBars(); + + invokeSetHidden(plugin, true, ""); + assertFalse(navBarVisible(plugin)); + + invokeSetHidden(plugin, false, ""); + assertTrue(navBarVisible(plugin)); + } + + @Test + public void hidingOnlyStatusBarLeavesNavBarVisible() throws Exception { + SystemBars plugin = new SystemBars(); + + invokeSetHidden(plugin, true, "StatusBar"); + + assertTrue(navBarVisible(plugin)); + } + + private boolean navBarVisible(SystemBars plugin) throws Exception { + Field field = SystemBars.class.getDeclaredField("navBarVisible"); + field.setAccessible(true); + return field.getBoolean(plugin); + } + + private WindowInsetsControllerCompat invokeSetHidden(String bar) throws Exception { + return invokeSetHidden(new SystemBars(), false, bar); + } + + private WindowInsetsControllerCompat invokeSetHidden(SystemBars plugin, boolean hide, String bar) throws Exception { Bridge bridge = mock(Bridge.class); AppCompatActivity activity = mock(AppCompatActivity.class); Window window = mock(Window.class); @@ -65,7 +126,7 @@ private WindowInsetsControllerCompat invokeSetHidden(String bar) throws Exceptio Method setHidden = SystemBars.class.getDeclaredMethod("setHidden", boolean.class, String.class); setHidden.setAccessible(true); - setHidden.invoke(plugin, false, bar); + setHidden.invoke(plugin, hide, bar); } return controller; diff --git a/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java b/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java index 100672123..fd8b686ee 100644 --- a/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java +++ b/android/capacitor/src/test/java/com/getcapacitor/plugin/util/HttpRequestHandlerTest.java @@ -11,8 +11,8 @@ public class HttpRequestHandlerTest { static final String BASE_URL = "https://httpbin.org/get"; static final String PARAMS_JSON = """ - {"k": "a&b"} - """; + {"k": "a&b"} + """; @Test public void testHttpURLConnectionBuilderSetUrlParamsEncoded() throws Exception { diff --git a/android/package.json b/android/package.json index 1148b0e4a..f8fafe628 100644 --- a/android/package.json +++ b/android/package.json @@ -1,9 +1,9 @@ { - "name": "@capacitor/android", + "name": "@capacitor-plus/android", "version": "8.5.0", - "description": "Capacitor: Cross-platform apps with JavaScript and the web", - "homepage": "https://capacitorjs.com", - "author": "Ionic Team (https://ionic.io)", + "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", + "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", + "author": "Capgo Team (https://capgo.app)", "license": "MIT", "repository": { "type": "git", @@ -23,6 +23,7 @@ "verify": "./gradlew clean lint build test -b capacitor/build.gradle" }, "peerDependencies": { + "@capacitor-plus/core": "^8.5.0", "@capacitor/core": "^8.5.0" }, "publishConfig": { diff --git a/bun.lock b/bun.lock index a38c3ecef..827a6ffd0 100644 --- a/bun.lock +++ b/bun.lock @@ -23,15 +23,15 @@ }, "android": { "name": "@capacitor-plus/android", - "version": "8.3.1", + "version": "8.5.0", "peerDependencies": { - "@capacitor-plus/core": "^8.3.0", - "@capacitor/core": "^8.3.0", + "@capacitor-plus/core": "^8.5.0", + "@capacitor/core": "^8.5.0", }, }, "cli": { "name": "@capacitor-plus/cli", - "version": "8.3.1", + "version": "8.5.0", "bin": { "capacitor": "./bin/capacitor", "cap": "./bin/capacitor", @@ -53,6 +53,7 @@ "semver": "^7.6.3", "tar": "^7.5.3", "tslib": "^2.8.1", + "xcode": "^3.0.1", "xml2js": "^0.6.2", }, "devDependencies": { @@ -63,6 +64,7 @@ "@types/prompts": "^2.4.9", "@types/semver": "^7.5.8", "@types/tmp": "^0.2.6", + "@types/xcode": "^3.0.0", "@types/xml2js": "0.4.5", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", @@ -74,7 +76,7 @@ }, "core": { "name": "@capacitor-plus/core", - "version": "8.3.1", + "version": "8.5.0", "dependencies": { "tslib": "^2.1.0", }, @@ -94,10 +96,10 @@ }, "ios": { "name": "@capacitor-plus/ios", - "version": "8.3.1", + "version": "8.5.0", "peerDependencies": { - "@capacitor-plus/core": "^8.3.0", - "@capacitor/core": "^8.3.0", + "@capacitor-plus/core": "^8.5.0", + "@capacitor/core": "^8.5.0", }, }, }, @@ -180,7 +182,7 @@ "@capacitor-plus/ios": ["@capacitor-plus/ios@workspace:ios"], - "@capacitor/core": ["@capacitor/core@8.0.0", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-250HTVd/W/KdMygoqaedisvNbHbpbQTN2Hy/8ZYGm1nAqE0Fx7sGss4l0nDg33STxEdDhtVRoL2fIaaiukKseA=="], + "@capacitor/core": ["@capacitor/core@8.5.0", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-Ca4krtqH1hothjtBIwf2J2TW7IhYq1ujp8QeItTiJohNsqij8ja2DYYH3DU0l8RmxCWaBAFTGA2TgOgOMCSNsQ=="], "@capacitor/docgen": ["@capacitor/docgen@0.2.2", "", { "dependencies": { "@types/node": "^14.18.0", "colorette": "^2.0.16", "github-slugger": "^1.4.0", "minimist": "^1.2.5", "typescript": "~4.2.4" }, "bin": { "docgen": "bin/docgen" } }, "sha512-617jB5DlKjUljxfoANORWeqffsHqHekckH48oslKWFGzfCHYIAEPfJfMa5M4mVSzn2ifSvWB5C3st4augwhl5w=="], @@ -456,6 +458,8 @@ "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="], + "@types/xcode": ["@types/xcode@3.0.0", "", {}, "sha512-QF542gE2z7c5mVAKYPu7WnLv7TX+O/m2ZcCAsK2mstzeh8X0Q4ueC52DL8sSRFnQdTzF4WU+G/sWWx5cRO7HcQ=="], + "@types/xml2js": ["@types/xml2js@0.4.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w=="], "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], @@ -584,6 +588,8 @@ "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + "bplist-creator": ["bplist-creator@0.1.0", "", { "dependencies": { "stream-buffers": "2.2.x" } }, "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg=="], + "bplist-parser": ["bplist-parser@0.3.2", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ=="], "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], @@ -1600,6 +1606,8 @@ "sigstore": ["sigstore@1.9.0", "", { "dependencies": { "@sigstore/bundle": "^1.1.0", "@sigstore/protobuf-specs": "^0.2.0", "@sigstore/sign": "^1.0.0", "@sigstore/tuf": "^1.0.3", "make-fetch-happen": "^11.0.1" }, "bin": { "sigstore": "bin/sigstore.js" } }, "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A=="], + "simple-plist": ["simple-plist@1.3.1", "", { "dependencies": { "bplist-creator": "0.1.0", "bplist-parser": "0.3.1", "plist": "^3.0.5" } }, "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw=="], + "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], @@ -1640,6 +1648,8 @@ "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + "stream-buffers": ["stream-buffers@2.2.0", "", {}, "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg=="], + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1816,6 +1826,8 @@ "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + "xcode": ["xcode@3.0.1", "", { "dependencies": { "simple-plist": "^1.1.0", "uuid": "^7.0.3" } }, "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA=="], + "xml-name-validator": ["xml-name-validator@4.0.0", "", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="], @@ -2134,6 +2146,8 @@ "read-pkg-up/find-up": ["find-up@2.1.0", "", { "dependencies": { "locate-path": "^2.0.0" } }, "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ=="], + "simple-plist/bplist-parser": ["bplist-parser@0.3.1", "", { "dependencies": { "big-integer": "1.6.x" } }, "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA=="], + "ssri/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], @@ -2166,6 +2180,8 @@ "write-pkg/type-fest": ["type-fest@0.4.1", "", {}, "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw=="], + "xcode/uuid": ["uuid@7.0.3", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg=="], + "xml2js/xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="], "yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], diff --git a/cli/package.json b/cli/package.json index 9387c3fac..05bdffcb0 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,9 +1,9 @@ { - "name": "@capacitor/cli", + "name": "@capacitor-plus/cli", "version": "8.5.0", - "description": "Capacitor: Cross-platform apps with JavaScript and the web", - "homepage": "https://capacitorjs.com", - "author": "Ionic Team (https://ionic.io)", + "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", + "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", + "author": "Capgo Team (https://capgo.app)", "license": "MIT", "repository": { "type": "git", diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 232826f55..5cd08736f 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -1,6 +1,6 @@ import { copy, remove, pathExists, readFile, realpath, writeFile } from 'fs-extra'; import { basename, dirname, join, relative } from 'path'; -import { major, prerelease } from 'semver'; +import { major, prerelease, valid } from 'semver'; import c from '../colors'; import { checkPlatformVersions, getCapacitorPackageVersion, runTask } from '../common'; @@ -59,17 +59,21 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: await generateCordovaPackageFiles(cordovaPlugins, config); const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); + const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); await Promise.all( validSPMPackages.map(async (plugin) => { - const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); let content = await readFile(packageSwiftPath, { encoding: 'utf-8' }); const regex = new RegExp( - 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*from:\\s*"([^"]+)"', + 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*(?:from|exact):\\s*"([^"]+)"', ); const version = content.match(regex)?.[1]; + if (!version || !valid(version)) { + logger.warn(`${plugin.id}: skipping Package.swift version check for invalid version "${version ?? ''}"`); + return; + } const majorCapVersion = major(iosPlatformVersion); - if (version && major(version) != majorCapVersion) { + if (major(version) != majorCapVersion) { const preCapVersion = prerelease(iosPlatformVersion); const forceVersion = preCapVersion ? iosPlatformVersion : `${majorCapVersion}.0.0`; content = setAllStringIn( diff --git a/cli/src/ipc.ts b/cli/src/ipc.ts index 37c38110b..998a7c673 100644 --- a/cli/src/ipc.ts +++ b/cli/src/ipc.ts @@ -53,6 +53,7 @@ export async function receive(msg: IPCMessage): Promise { port: 443, path: '/metrics', method: 'POST', + timeout: 5000, headers: { 'Content-Type': 'application/json', }, @@ -68,6 +69,11 @@ export async function receive(msg: IPCMessage): Promise { }, ); + req.on('timeout', () => req.destroy()); + req.on('error', (err) => { + debug('Failed to send metric to events service: %O', err); + }); + const body = { metrics: [data], sent_at: now, diff --git a/cli/src/tasks/migrate-uiscene.ts b/cli/src/tasks/migrate-uiscene.ts index 9f6dfa278..241c3fea6 100644 --- a/cli/src/tasks/migrate-uiscene.ts +++ b/cli/src/tasks/migrate-uiscene.ts @@ -134,21 +134,96 @@ async function scanAndWarn(config: Config): Promise { } } -function hasCustomDelegateBody(source: string, sigRegex: RegExp): boolean { - const match = source.match(sigRegex); - if (!match || match.index === undefined) return false; - const openIdx = source.indexOf('{', match.index); - if (openIdx === -1) return false; +function findMatchingBrace(source: string, openIdx: number): number | null { let depth = 1; let i = openIdx + 1; + let inLineComment = false; + let inBlockComment = false; + let inString: '"' | '"""' | null = null; + while (i < source.length && depth > 0) { const ch = source[i]; + const next = source[i + 1]; + const next2 = source[i + 2]; + + if (inLineComment) { + if (ch === '\n') inLineComment = false; + i++; + continue; + } + + if (inBlockComment) { + if (ch === '*' && next === '/') { + inBlockComment = false; + i += 2; + continue; + } + i++; + continue; + } + + if (inString === '"') { + if (ch === '\\') { + i += 2; + continue; + } + if (ch === '"') { + inString = null; + } + i++; + continue; + } + + if (inString === '"""') { + if (ch === '"' && next === '"' && next2 === '"') { + inString = null; + i += 3; + continue; + } + i++; + continue; + } + + if (ch === '/' && next === '/') { + inLineComment = true; + i += 2; + continue; + } + + if (ch === '/' && next === '*') { + inBlockComment = true; + i += 2; + continue; + } + + if (ch === '"' && next === '"' && next2 === '"') { + inString = '"""'; + i += 3; + continue; + } + + if (ch === '"') { + inString = '"'; + i++; + continue; + } + if (ch === '{') depth++; else if (ch === '}') depth--; i++; } - if (depth !== 0) return false; - const body = source.slice(openIdx + 1, i - 1); + + return depth === 0 ? i - 1 : null; +} + +function hasCustomDelegateBody(source: string, sigRegex: RegExp): boolean { + const match = source.match(sigRegex); + if (!match || match.index === undefined) return false; + const openIdx = source.indexOf('{', match.index); + if (openIdx === -1) return false; + const closeIdx = findMatchingBrace(source, openIdx); + if (closeIdx === null) return false; + const body = source.slice(openIdx + 1, closeIdx); const codeLines = body .split('\n') .map((l) => l.trim()) @@ -225,18 +300,11 @@ function extractConfigurationForConnecting(appDelegateSource: string): string | if (openIdx === -1) { return null; } - let depth = 1; - let i = openIdx + 1; - while (i < appDelegateSource.length && depth > 0) { - const ch = appDelegateSource[i]; - if (ch === '{') depth++; - else if (ch === '}') depth--; - i++; - } - if (depth !== 0) { + const closeIdx = findMatchingBrace(appDelegateSource, openIdx); + if (closeIdx === null) { return null; } - return '\n' + appDelegateSource.slice(sigMatch.index, i) + '\n'; + return '\n' + appDelegateSource.slice(sigMatch.index, closeIdx + 1) + '\n'; } function insertBeforeAppDelegateClassEnd(source: string, snippet: string): string | null { @@ -246,18 +314,10 @@ function insertBeforeAppDelegateClassEnd(source: string, snippet: string): strin return null; } const openIdx = source.indexOf('{', match.index); - let depth = 1; - let i = openIdx + 1; - while (i < source.length && depth > 0) { - const ch = source[i]; - if (ch === '{') depth++; - else if (ch === '}') depth--; - i++; - } - if (depth !== 0) { + const closeIdx = findMatchingBrace(source, openIdx); + if (closeIdx === null) { return null; } - const closeIdx = i - 1; return source.slice(0, closeIdx) + snippet + source.slice(closeIdx); } diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 863189729..ca6f1e7f0 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -446,7 +446,7 @@ async function writeBreakingChanges() { )}.`, ); } - if (allDependencies['@capacitor/ios']) { + if (allDependencies['@capacitor/ios'] || allDependencies['@capacitor-plus/ios']) { logger.info( 'IMPORTANT: Capacitor 8.5 adopts UIScene on iOS. ' + 'See https://capacitorjs.com/docs/updating/8-5 for the full 8.4 → 8.5 migration guide.', diff --git a/cli/src/tasks/run.ts b/cli/src/tasks/run.ts index c25a2c285..ad31f7b8e 100644 --- a/cli/src/tasks/run.ts +++ b/cli/src/tasks/run.ts @@ -89,11 +89,11 @@ export async function runCommand( return; } + const cordovaPlugins = await getCordovaPlugins(config, platformName); try { if (options.sync) { await sync(config, platformName, false, true); } - const cordovaPlugins = await getCordovaPlugins(config, platformName); if (options.liveReload) { await CapLiveReloadHelper.editCapConfigForLiveReload(config, platformName, options); if (platformName === config.android.name) { @@ -118,6 +118,9 @@ export async function runCommand( } catch (e: any) { if (options.liveReload) { await CapLiveReloadHelper.revertCapConfigForLiveReload(); + if (platformName === config.android.name) { + await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, false); + } } if (!isFatal(e)) { fatal(e.stack ?? e); diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 78e0e1e3f..8742821ed 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -137,9 +137,9 @@ let package = Package( const options = packageOptions[plugin.id]; const symlink = options?.symlink; const symlinkFolder = join('symlinks', plugin.name); - const relPath = symlink - ? symlinkFolder - : convertToUnixPath(relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath)); + const relPath = convertToUnixPath( + symlink ? symlinkFolder : relative(config.ios.nativeXcodeProjDirAbs, plugin.rootPath), + ); if (symlink) { await ensureSymlink(plugin.rootPath, resolve(config.ios.nativeProjectDirAbs, 'CapApp-SPM', symlinkFolder)); } @@ -178,7 +178,7 @@ let package = Package( if (getPluginType(plugin, config.ios.name) === PluginType.Cordova) { const platformTag = getPluginPlatform(plugin, config.ios.name); if (platformTag.$?.package) { - pluginText = `,\n .product(name: "${plugin.id}", package: "${plugin.id}")`; + pluginText = `,\n .product(name: "${plugin.id}", package: "${plugin.id}"${aliasText})`; } else { const sourceFiles = getPlatformElement(plugin, config.ios.name, 'source-file'); const headerFiles = getPlatformElement(plugin, config.ios.name, 'header-file'); @@ -275,7 +275,7 @@ export async function addSceneManifestIfNeeded(config: Config): Promise { { UISceneConfigurationName: 'Default Configuration', UISceneDelegateClassName: '$(PRODUCT_MODULE_NAME).SceneDelegate', - UISceneStoryboardFile: 'Main', + UISceneStoryboardFile: entries['UIMainStoryboardFile'] ?? 'Main', }, ], }, diff --git a/cli/src/util/xcode.ts b/cli/src/util/xcode.ts index 64ab836a3..813ee0c41 100644 --- a/cli/src/util/xcode.ts +++ b/cli/src/util/xcode.ts @@ -20,7 +20,8 @@ export function addSwiftFileToAppTarget( const project = loadXcodeProject(pbxprojPath); project.parseSync(); - if (project.hasFile(fileRelPath)) { + const targetUuid = project.getFirstTarget().uuid; + if (project.hasFile(fileRelPath) && isSwiftFileInTargetSources(project, fileRelPath, targetUuid)) { return { added: false }; } @@ -29,7 +30,19 @@ export function addSwiftFileToAppTarget( throw new Error(`Could not find PBXGroup with comment "${groupName}" in ${pbxprojPath}`); } - const targetUuid = project.getFirstTarget().uuid; + if (project.hasFile(fileRelPath) && !isSwiftFileInTargetSources(project, fileRelPath, targetUuid)) { + const existingFile = project.hasFile(fileRelPath) as { fileRef?: string; path?: string }; + const file = { + ...existingFile, + target: targetUuid, + uuid: project.generateUuid(), + }; + (project as XcodeProject & { addToPbxBuildFileSection: (file: unknown) => void }).addToPbxBuildFileSection(file); + (project as XcodeProject & { addToPbxSourcesBuildPhase: (file: unknown) => void }).addToPbxSourcesBuildPhase(file); + writeFileSync(pbxprojPath, project.writeSync(), 'utf-8'); + return { added: true }; + } + const result = project.addSourceFile(fileRelPath, { target: targetUuid }, groupUuid); if (!result) { throw new Error(`Failed to register ${fileRelPath} in ${pbxprojPath}`); @@ -39,6 +52,33 @@ export function addSwiftFileToAppTarget( return { added: true }; } +function fileReferenceMatchesPath(ref: { path?: string }, fileRelPath: string): boolean { + const path = ref.path; + return path === fileRelPath || path === `"${fileRelPath}"`; +} + +function isSwiftFileInTargetSources(project: XcodeProject, fileRelPath: string, targetUuid: string): boolean { + const objects = project.hash.project.objects; + const fileRefs = Object.entries(objects.PBXFileReference).filter(([k]) => !k.endsWith('_comment')); + const fileRefEntry = fileRefs.find( + ([, ref]) => typeof ref === 'object' && fileReferenceMatchesPath(ref as { path?: string }, fileRelPath), + ); + if (!fileRefEntry) { + return false; + } + + const fileRefUuid = fileRefEntry[0]; + const sourcesPhase = project.pbxSourcesBuildPhaseObj(targetUuid); + if (!sourcesPhase?.files) { + return false; + } + + return sourcesPhase.files.some((file: { value?: string }) => { + const buildFile = objects.PBXBuildFile[file.value ?? '']; + return typeof buildFile === 'object' && buildFile?.fileRef === fileRefUuid; + }); +} + // Exported for tests. export function findGroupUuidByComment(project: XcodeProject, comment: string): string | null { const groups = project.hash.project.objects.PBXGroup; diff --git a/cli/test/migrate-uiscene-scan.spec.ts b/cli/test/migrate-uiscene-scan.spec.ts index c0d7964dd..015d776ee 100644 --- a/cli/test/migrate-uiscene-scan.spec.ts +++ b/cli/test/migrate-uiscene-scan.spec.ts @@ -152,13 +152,19 @@ describe('scanAndWarn', () => { expect(warnSpy).not.toHaveBeenCalled(); }); - it('skips Pods/, build/, and DerivedData/ directories', async () => { + it('skips Pods/, build/, DerivedData/, and .build/ directories', async () => { const podsDir = join(iosDir, 'App', 'Pods'); const buildDir = join(iosDir, 'App', 'build'); + const derivedDataDir = join(iosDir, 'App', 'DerivedData'); + const dotBuildDir = join(iosDir, 'App', '.build'); await mkdirp(podsDir); await mkdirp(buildDir); + await mkdirp(derivedDataDir); + await mkdirp(dotBuildDir); writeFileSync(join(podsDir, 'ThirdParty.swift'), `let x = UIApplication.shared.applicationState\n`); writeFileSync(join(buildDir, 'Generated.swift'), `class TmpViewController {}\n`); + writeFileSync(join(derivedDataDir, 'BuildOutput.swift'), `class TmpViewController {}\n`); + writeFileSync(join(dotBuildDir, 'Artifact.swift'), `class TmpViewController {}\n`); await scanAndWarn(makeConfig()); diff --git a/cli/test/migrate-uiscene-scene-delegate.spec.ts b/cli/test/migrate-uiscene-scene-delegate.spec.ts index b2f400588..6711edcbf 100644 --- a/cli/test/migrate-uiscene-scene-delegate.spec.ts +++ b/cli/test/migrate-uiscene-scene-delegate.spec.ts @@ -14,11 +14,14 @@ describe('extractConfigurationForConnecting', () => { const shipped = readFileSync(SHIPPED_APP_DELEGATE_SPM, 'utf-8'); const snippet = extractConfigurationForConnecting(shipped); expect(snippet).not.toBeNull(); + if (!snippet) { + throw new Error('Expected configurationForConnecting snippet'); + } expect(snippet).toContain('configurationForConnecting connectingSceneSession: UISceneSession'); expect(snippet).toContain('UISceneConfiguration(name: "Default Configuration"'); expect(snippet).toContain('config.delegateClass = SceneDelegate.self'); - expect(snippet!.startsWith('\n')).toBe(true); - expect(snippet!.endsWith('\n')).toBe(true); + expect(snippet.startsWith('\n')).toBe(true); + expect(snippet.endsWith('\n')).toBe(true); }); it('slices the method out of the shipped Pods AppDelegate', () => { @@ -40,9 +43,12 @@ describe('insertBeforeAppDelegateClassEnd', () => { const shipped = readFileSync(SHIPPED_APP_DELEGATE_SPM, 'utf-8'); const snippet = extractConfigurationForConnecting(shipped); expect(snippet).not.toBeNull(); + if (!snippet) { + throw new Error('Expected configurationForConnecting snippet'); + } const pre = stripConfigurationForConnecting(shipped); - const patched = insertBeforeAppDelegateClassEnd(pre, snippet!); + const patched = insertBeforeAppDelegateClassEnd(pre, snippet); expect(patched).toBe(shipped); }); diff --git a/cli/test/xcode.spec.ts b/cli/test/xcode.spec.ts index e6aa08357..ea2ed6371 100644 --- a/cli/test/xcode.spec.ts +++ b/cli/test/xcode.spec.ts @@ -24,7 +24,10 @@ describe('findGroupUuidByComment', () => { const uuid = findGroupUuidByComment(project, 'App'); expect(uuid).toMatch(/^[A-F0-9]{24}$/); - const group = project.getPBXGroupByKey(uuid!); + if (!uuid) { + throw new Error('Expected App group UUID'); + } + const group = project.getPBXGroupByKey(uuid); expect(group).toBeDefined(); expect(group?.path).toBe('App'); }); @@ -38,7 +41,7 @@ describe('findGroupUuidByComment', () => { }); describe('addSwiftFileToAppTarget', () => { - let tmpDir: any; + let tmpDir: Awaited> | undefined; let pbxprojPath: string; beforeEach(async () => { @@ -47,7 +50,8 @@ describe('addSwiftFileToAppTarget', () => { }); afterEach(() => { - tmpDir.cleanupCallback(); + const cleanup = tmpDir?.cleanupCallback as unknown as (() => void) | undefined; + cleanup?.(); }); it('registers a new Swift file in all four pbxproj sections', () => { @@ -74,11 +78,14 @@ describe('addSwiftFileToAppTarget', () => { buildFiles.some(([k]) => (objects.PBXBuildFile as any)[`${k}_comment`]?.includes('SceneDelegate.swift')), ).toBe(true); - const appGroupUuid = findGroupUuidByComment(project, 'App')!; - const appGroup = project.getPBXGroupByKey(appGroupUuid)!; - expect(appGroup.children.some((c: any) => c.comment === 'SceneDelegate.swift')).toBe(true); + const appGroupUuid = findGroupUuidByComment(project, 'App'); + if (!appGroupUuid) { + throw new Error('Expected App group UUID'); + } + const appGroup = project.getPBXGroupByKey(appGroupUuid); + expect(appGroup?.children.some((c: any) => c.comment === 'SceneDelegate.swift')).toBe(true); - const sourcesPhase = objects.PBXSourcesBuildPhase!; + const sourcesPhase = objects.PBXSourcesBuildPhase ?? {}; const sourcesEntries = Object.entries(sourcesPhase).filter(([k]) => !k.endsWith('_comment')); const [, sourcesObj] = sourcesEntries[0]; expect((sourcesObj as any).files.some((f: any) => f.comment?.includes('SceneDelegate.swift'))).toBe(true); diff --git a/core/package.json b/core/package.json index 1b364837c..c88567696 100644 --- a/core/package.json +++ b/core/package.json @@ -1,9 +1,9 @@ { - "name": "@capacitor/core", + "name": "@capacitor-plus/core", "version": "8.5.0", - "description": "Capacitor: Cross-platform apps with JavaScript and the web", - "homepage": "https://capacitorjs.com", - "author": "Ionic Team (https://ionic.io)", + "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", + "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", + "author": "Capgo Team (https://capgo.app)", "license": "MIT", "repository": { "type": "git", diff --git a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift index 782efe4cf..000198a38 100644 --- a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift +++ b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift @@ -7,6 +7,7 @@ // import Foundation +import UIKit @objc(CAPSceneDelegateProxy) public class SceneDelegateProxy: NSObject, UISceneDelegate { @@ -21,10 +22,11 @@ public class SceneDelegateProxy: NSObject, UISceneDelegate { // missed. Deliver them on the first capacitorViewDidAppear, once plugins are // registered. var token: NSObjectProtocol? - token = NotificationCenter.default.addObserver(forName: .capacitorViewDidAppear, object: nil, queue: .main) { _ in + token = NotificationCenter.default.addObserver(forName: .capacitorViewDidAppear, object: nil, queue: .main) { [weak self] _ in if let token { NotificationCenter.default.removeObserver(token) } + token = nil if !connectionOptions.urlContexts.isEmpty { self.scene(scene, openURLContexts: connectionOptions.urlContexts) } diff --git a/ios/Capacitor/Capacitor/CapacitorBridge.swift b/ios/Capacitor/Capacitor/CapacitorBridge.swift index 9c1ecb5da..4251102e4 100644 --- a/ios/Capacitor/Capacitor/CapacitorBridge.swift +++ b/ios/Capacitor/Capacitor/CapacitorBridge.swift @@ -263,6 +263,14 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { exportCordovaJS() registerCordovaPlugins() } else { + observers.append(NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: OperationQueue.main) { [weak self] _ in + guard self?.viewController?.view.window?.windowScene == nil else { return } + self?.triggerDocumentJSEvent(eventName: "resume") + }) + observers.append(NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: OperationQueue.main) { [weak self] _ in + guard self?.viewController?.view.window?.windowScene == nil else { return } + self?.triggerDocumentJSEvent(eventName: "pause") + }) observers.append(NotificationCenter.default.addObserver(forName: UIScene.willEnterForegroundNotification, object: nil, queue: OperationQueue.main) { [weak self] notification in if let scene = notification.object as? UIWindowScene, scene === self?.viewController?.view.window?.windowScene { self?.triggerDocumentJSEvent(eventName: "resume") diff --git a/ios/package.json b/ios/package.json index 7c87d8f35..5e16ff6aa 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,9 +1,9 @@ { - "name": "@capacitor/ios", + "name": "@capacitor-plus/ios", "version": "8.5.0", - "description": "Capacitor: Cross-platform apps with JavaScript and the web", - "homepage": "https://capacitorjs.com", - "author": "Ionic Team (https://ionic.io)", + "description": "Capacitor+: Enhanced Capacitor with automated upstream sync - Cross-platform apps with JavaScript and the web", + "homepage": "https://capgo.app/docs/plugins/capacitor-plus/", + "author": "Capgo Team (https://capgo.app)", "license": "MIT", "repository": { "type": "git", @@ -25,6 +25,7 @@ "xc:build:CapacitorCordova": "cd CapacitorCordova && xcodebuild && cd .." }, "peerDependencies": { + "@capacitor-plus/core": "^8.5.0", "@capacitor/core": "^8.5.0" }, "publishConfig": { From 086fa59625aadcf35ac6296d1b79e5fd7754924f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 14:53:25 +0000 Subject: [PATCH 32/39] fix(ios): unwrap weak self in CAPSceneDelegateProxy observer Co-authored-by: Martin DONADIEU --- ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift index 000198a38..f5c033ecc 100644 --- a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift +++ b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift @@ -27,6 +27,7 @@ public class SceneDelegateProxy: NSObject, UISceneDelegate { NotificationCenter.default.removeObserver(token) } token = nil + guard let self else { return } if !connectionOptions.urlContexts.isEmpty { self.scene(scene, openURLContexts: connectionOptions.urlContexts) } From 42ecd8dc6d82e924aaa16b300f271d4d993f315b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 15:06:08 +0000 Subject: [PATCH 33/39] fix(cli): set fileRef when adding existing PBXFileReference to target Co-authored-by: Martin DONADIEU --- cli/src/util/xcode.ts | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/cli/src/util/xcode.ts b/cli/src/util/xcode.ts index 813ee0c41..3476c069f 100644 --- a/cli/src/util/xcode.ts +++ b/cli/src/util/xcode.ts @@ -31,9 +31,19 @@ export function addSwiftFileToAppTarget( } if (project.hasFile(fileRelPath) && !isSwiftFileInTargetSources(project, fileRelPath, targetUuid)) { - const existingFile = project.hasFile(fileRelPath) as { fileRef?: string; path?: string }; + const fileRefUuid = findFileRefUuid(project, fileRelPath); + if (!fileRefUuid) { + throw new Error(`Could not find PBXFileReference for ${fileRelPath} in ${pbxprojPath}`); + } + + const group = project.getPBXGroupByKey(groupUuid); + if (group && !group.children.some((child: { comment?: string }) => child.comment === fileRelPath)) { + group.children.push({ value: fileRefUuid, comment: fileRelPath }); + } + const file = { - ...existingFile, + fileRef: fileRefUuid, + path: fileRelPath, target: targetUuid, uuid: project.generateUuid(), }; @@ -57,17 +67,22 @@ function fileReferenceMatchesPath(ref: { path?: string }, fileRelPath: string): return path === fileRelPath || path === `"${fileRelPath}"`; } -function isSwiftFileInTargetSources(project: XcodeProject, fileRelPath: string, targetUuid: string): boolean { +function findFileRefUuid(project: XcodeProject, fileRelPath: string): string | null { const objects = project.hash.project.objects; const fileRefs = Object.entries(objects.PBXFileReference).filter(([k]) => !k.endsWith('_comment')); const fileRefEntry = fileRefs.find( ([, ref]) => typeof ref === 'object' && fileReferenceMatchesPath(ref as { path?: string }, fileRelPath), ); - if (!fileRefEntry) { + return fileRefEntry?.[0] ?? null; +} + +function isSwiftFileInTargetSources(project: XcodeProject, fileRelPath: string, targetUuid: string): boolean { + const fileRefUuid = findFileRefUuid(project, fileRelPath); + if (!fileRefUuid) { return false; } - const fileRefUuid = fileRefEntry[0]; + const objects = project.hash.project.objects; const sourcesPhase = project.pbxSourcesBuildPhaseObj(targetUuid); if (!sourcesPhase?.files) { return false; From 11d4d0eb692064043c384bbd6e6efe09a38c16c1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 15:17:11 +0000 Subject: [PATCH 34/39] fix(ci): pin workflow actions to immutable commit SHAs Co-authored-by: Martin DONADIEU --- .github/workflows/ci.yml | 50 ++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e8184ab49..80a064c68 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,15 +24,15 @@ jobs: timeout-minutes: 10 steps: - name: Get Latest - uses: actions/setup-node@v6 + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24.x - - uses: oven-sh/setup-bun@v2 - - uses: actions/checkout@v6 + - uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Restore Dependency Cache - uses: actions/cache@v4 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 with: path: ~/.bun/install/cache key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} @@ -40,15 +40,15 @@ jobs: runs-on: macos-15 timeout-minutes: 10 steps: - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24.x - - uses: oven-sh/setup-bun@v2 - - uses: actions/checkout@v6 + - uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Restore Dependency Cache - uses: actions/cache@v4 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 with: path: ~/.bun/install/cache key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} @@ -62,15 +62,15 @@ jobs: - setup - lint steps: - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24.x - - uses: oven-sh/setup-bun@v2 - - uses: actions/checkout@v6 + - uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Restore Dependency Cache - uses: actions/cache@v4 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 with: path: ~/.bun/install/cache key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} @@ -86,15 +86,15 @@ jobs: - setup - lint steps: - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24.x - - uses: oven-sh/setup-bun@v2 - - uses: actions/checkout@v6 + - uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Restore Dependency Cache - uses: actions/cache@v4 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 with: path: ~/.bun/install/cache key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} @@ -117,15 +117,15 @@ jobs: - run: sudo xcode-select --switch ${{ matrix.xcode }} - run: xcrun simctl list > /dev/null - run: xcodebuild -downloadPlatform iOS - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24.x - - uses: oven-sh/setup-bun@v2 - - uses: actions/checkout@v6 + - uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Restore Dependency Cache - uses: actions/cache@v4 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 with: path: ~/.bun/install/cache key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} @@ -141,20 +141,20 @@ jobs: - setup - lint steps: - - uses: actions/setup-node@v6 + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: 24.x - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@735343b667d3e6f658f44d0eca948eb6282f2b76 # v2.0.2 - name: set up JDK 21 - uses: actions/setup-java@v5 + uses: actions/setup-java@0f481fcb613427c0f801b606911222b5b6f3083a # v5.5.0 with: java-version: '21' distribution: 'zulu' - - uses: actions/checkout@v6 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Restore Dependency Cache - uses: actions/cache@v4 + uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4.2.2 with: path: ~/.bun/install/cache key: ${{ runner.OS }}-bun-dependencies-cache-${{ hashFiles('bun.lock') }} From f379726413affd02fa1f76943637d6588518210e Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 15:35:19 +0000 Subject: [PATCH 35/39] fix: resolve 18 Minor/Trivial PR review threads - Changelog: restore plus release history, fix MD001 headings, add 8.3.12 section - CLI: TS7 strip-only fallback via bundled compiler, run.ts error handling, migrate-uiscene brace scanner, SPM version lookup guard, xcode.spec guard order - iOS: per-scene bridge readiness in CAPSceneDelegateProxy, drop redundant delegateClass in TestsHostApp, remove UISceneStoryboardFile from templates Co-authored-by: Martin DONADIEU --- CHANGELOG.md | 273 ++++----- cli/CHANGELOG.md | 529 +++++++++++++++--- cli/src/ios/update.ts | 62 +- cli/src/tasks/migrate-uiscene.ts | 58 +- cli/src/tasks/run.ts | 11 +- cli/src/util/node.ts | 74 ++- cli/src/util/spm.ts | 1 - cli/test/xcode.spec.ts | 2 +- ios-pods-template/App/App/Info.plist | 28 +- ios-spm-template/App/App/Info.plist | 28 +- ios/CHANGELOG.md | 469 +++++++++++++--- .../Capacitor/CAPSceneDelegateProxy.swift | 18 +- ios/Capacitor/TestsHostApp/AppDelegate.swift | 6 +- 13 files changed, 1151 insertions(+), 408 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47afc296e..0ce33e422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) -### Bug Fixes +## Bug Fixes - **cli:** support TypeScript 7 when loading capacitor.config.ts ([#8534](https://github.com/ionic-team/capacitor/issues/8534)) ([4c1c870](https://github.com/ionic-team/capacitor/commit/4c1c8709413b9c19b008c99122ca330cc3c90e6f)) -### Features +## Features - **cli:** add migrator functionality for adopting UIScene ([#8544](https://github.com/ionic-team/capacitor/issues/8544)) ([984fa85](https://github.com/ionic-team/capacitor/commit/984fa85ba0adab0aacf895aed6323bf4b503dccb)) - **ios:** UIScene Support ([#8536](https://github.com/ionic-team/capacitor/issues/8536)) ([3fa04a3](https://github.com/ionic-team/capacitor/commit/3fa04a357c92af34cd6fccb8124791963804a9dc)) @@ -29,14 +29,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) -### Bug Fixes +## Bug Fixes - **android:** show only the requested system bar ([#8480](https://github.com/ionic-team/capacitor/issues/8480)) ([4c6c321](https://github.com/ionic-team/capacitor/commit/4c6c3219afb5223211e857457e46283c37eb9424)) - **cli:** revert live reload config on failure ([#8485](https://github.com/ionic-team/capacitor/issues/8485)) ([1d031a4](https://github.com/ionic-team/capacitor/commit/1d031a4abec2c793079ba8897ad2e40c4cc6c7f9)) - **SystemBars:** make `safe-area-inset-x` available on API <= 34 ([#8424](https://github.com/ionic-team/capacitor/issues/8424)) ([e456de0](https://github.com/ionic-team/capacitor/commit/e456de083e19644f484bec5a5359cb67960ac8bc)) - **SystemBars:** respect `insetsHandling` disable ([#8481](https://github.com/ionic-team/capacitor/issues/8481)) ([d4ad7ff](https://github.com/ionic-team/capacitor/commit/d4ad7ffe39daf66e0cfc63af9028d5c05543bde7)) -### Features +## Features - add method getDouble to plugin config ([#7638](https://github.com/ionic-team/capacitor/issues/7638)) ([93c72de](https://github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e)) - **cli:** add experimental packageOptions ([#8471](https://github.com/ionic-team/capacitor/issues/8471)) ([258867b](https://github.com/ionic-team/capacitor/commit/258867b7bf37b1837b99b02ec9638e5a6df08d97)) @@ -68,6 +68,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) +**Note:** Version bump only for package capacitor + + + + +## [8.3.12](https://github.com/Cap-go/capacitor-plus/compare/8.3.11...8.3.12) (2026-08-13) + + ### Bug Fixes * **android:** sync upstream SystemBars fixes [#8480](https://github.com/Cap-go/capacitor-plus/issues/8480) and [#8481](https://github.com/Cap-go/capacitor-plus/issues/8481) ([#106](https://github.com/Cap-go/capacitor-plus/issues/106)) ([a63975d](https://github.com/Cap-go/capacitor-plus/commit/a63975d5450a91a11128c7c4fd7df2cea63dd3c8)) @@ -76,6 +84,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline + ## [8.3.11](https://github.com/Cap-go/capacitor-plus/compare/8.3.9...8.3.11) (2026-08-13) **Note:** Version bump only for package capacitor @@ -667,19 +676,19 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) -### Bug Fixes +## Bug Fixes - **cli:** Android apk name multi flavor dimensions parsing ([#7598](https://github.com/ionic-team/capacitor/issues/7598)) ([2dc20ee](https://github.com/ionic-team/capacitor/commit/2dc20ee894c2f5761431caa8269e9f418fc222b6)) - **cli:** make migrate update to 8.0.0 ([#8250](https://github.com/ionic-team/capacitor/issues/8250)) ([ee8ba7b](https://github.com/ionic-team/capacitor/commit/ee8ba7bbeeeef6db0461f7a59c91095fd7cbd78b)) - **ios:** move PrivacyInfo.xcprivacy to resource_bundles to fix build… ([#8264](https://github.com/ionic-team/capacitor/issues/8264)) ([e6f50b8](https://github.com/ionic-team/capacitor/commit/e6f50b8c0c41acaaa21af373e195751508c37e9d)) -### Features +## Features - **android:** Improving SystemBars inset handling ([#8268](https://github.com/ionic-team/capacitor/issues/8268)) ([81ae30a](https://github.com/ionic-team/capacitor/commit/81ae30a503797e417dd125b06262dabc4696c88a)) # [8.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/8.0.0-alpha.3...8.0.0-beta.0) (2025-11-14) -### Bug Fixes +## Bug Fixes - **android-template:** replace deprecated Gradle property name syntax ([#8204](https://github.com/ionic-team/capacitor/issues/8204)) ([e48694b](https://github.com/ionic-team/capacitor/commit/e48694b9e1ff1d3f2de2f8b140cbbeb280d6a21d)) - **android:** add command not changing namespace ([#8224](https://github.com/ionic-team/capacitor/issues/8224)) ([60cf666](https://github.com/ionic-team/capacitor/commit/60cf66675159fb09cd41c94ce657202d01e05c74)) @@ -690,7 +699,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** use ReturnPromise for SystemBars returnType ([#8239](https://github.com/ionic-team/capacitor/issues/8239)) ([eb51288](https://github.com/ionic-team/capacitor/commit/eb5128866953281dc7bed88bd734fc3804b3a702)) - make Plugin.resolve act consistently ([#8225](https://github.com/ionic-team/capacitor/issues/8225)) ([06aeb9e](https://github.com/ionic-team/capacitor/commit/06aeb9e85d162d6be9d96820edcb2008cd74da84)) -### Features +## Features - **android-template:** Update com.google.gms:google-service version ([#8195](https://github.com/ionic-team/capacitor/issues/8195)) ([ba05dd3](https://github.com/ionic-team/capacitor/commit/ba05dd3da26dbe807e7405f98f4160ba6aea73ce)) - **cli:** Select a cap run target by target name ([#8199](https://github.com/ionic-team/capacitor/issues/8199)) ([b30c472](https://github.com/ionic-team/capacitor/commit/b30c472490117a5dbb14a9556ef1b6ca6e39b45b)) @@ -699,7 +708,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0-alpha.3](https://github.com/ionic-team/capacitor/compare/8.0.0-alpha.2...8.0.0-alpha.3) (2025-10-22) -### Bug Fixes +## Bug Fixes - **cli:** change SPM incompatible plugin message ([#8129](https://github.com/ionic-team/capacitor/issues/8129)) ([28c2a96](https://github.com/ionic-team/capacitor/commit/28c2a96d898b07a05ae763f798e8903601cc3f67)) - **cli:** Don't exclude Cordova plugins from SPM management ([#8140](https://github.com/ionic-team/capacitor/issues/8140)) ([69bbd3d](https://github.com/ionic-team/capacitor/commit/69bbd3dc59cd6f56252c06f23b351952af8661be)) @@ -715,11 +724,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/7.4.2...8.0.0-alpha.1) (2025-08-20) -### Bug Fixes +## Bug Fixes - http content headers not sent when using axios ([#8039](https://github.com/ionic-team/capacitor/issues/8039)) ([67cac40](https://github.com/ionic-team/capacitor/commit/67cac40660b3e8cc78d1d228b7c6915450948ef1)) -### Features +## Features - **android-template:** Bump minSdkVersion to 24 ([#8080](https://github.com/ionic-team/capacitor/issues/8080)) ([c5f9ea9](https://github.com/ionic-team/capacitor/commit/c5f9ea9db85bcf0eaf5d3c67060f10092c434e23)) - **android:** Bump default minSdkVersion to 24 ([#8083](https://github.com/ionic-team/capacitor/issues/8083)) ([c022ddf](https://github.com/ionic-team/capacitor/commit/c022ddf21452379bb183ff7c846f73bd07a15dbf)) @@ -738,14 +747,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.4.0](https://github.com/ionic-team/capacitor/compare/7.3.0...7.4.0) (2025-06-18) -### Features +## Features - **cli:** add spm-migration-assistant command ([#7963](https://github.com/ionic-team/capacitor/issues/7963)) ([ef42722](https://github.com/ionic-team/capacitor/commit/ef427225f63056b1731b3cd8941aea2311d3bc4d)) - **cli:** fail cap update on uninstalled cordova dependencies ([#8032](https://github.com/ionic-team/capacitor/issues/8032)) ([b393de8](https://github.com/ionic-team/capacitor/commit/b393de8bc9e68aff2cb70428a7c86c98367feade)) # [7.3.0](https://github.com/ionic-team/capacitor/compare/7.2.0...7.3.0) (2025-06-05) -### Bug Fixes +## Bug Fixes - add error code checking to `runPlatformHook` ([#7994](https://github.com/ionic-team/capacitor/issues/7994)) ([8717680](https://github.com/ionic-team/capacitor/commit/871768049187afe9f5d358d3fe08b6f18f70533e)) - **cli:** Don't downgrade deployment target on migrate ([#7953](https://github.com/ionic-team/capacitor/issues/7953)) ([46e8792](https://github.com/ionic-team/capacitor/commit/46e87925b675933b413737854b1376eb1c71a23e)) @@ -755,7 +764,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **core:** Prevent error when hasListeners is empty ([#7975](https://github.com/ionic-team/capacitor/issues/7975)) ([a4a0942](https://github.com/ionic-team/capacitor/commit/a4a0942eddba068e078bd782bb093ed1ecff9e00)) - Remove all plugin listeners in bridge reset ([#7962](https://github.com/ionic-team/capacitor/issues/7962)) ([06aeea9](https://github.com/ionic-team/capacitor/commit/06aeea973aa56ac2fb791f893ebd899253ee65f9)) -### Features +## Features - **cli:** Initial Cordova plugin SPM support ([#7999](https://github.com/ionic-team/capacitor/issues/7999)) ([c030354](https://github.com/ionic-team/capacitor/commit/c03035426343ddc4e303ca3420e476bb7f1e2201)) - expose `appStartPath` on cap config server configuration ([#8019](https://github.com/ionic-team/capacitor/issues/8019)) ([a274fef](https://github.com/ionic-team/capacitor/commit/a274fef069176a8e528a22f4734d1e29a539709c)) @@ -763,20 +772,20 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.2.0](https://github.com/ionic-team/capacitor/compare/7.1.0...7.2.0) (2025-03-31) -### Bug Fixes +## Bug Fixes - **android:** rename bridge layout to avoid collision ([#7919](https://github.com/ionic-team/capacitor/issues/7919)) ([a629f16](https://github.com/ionic-team/capacitor/commit/a629f167b345cda1c44f37131235d14353eff504)) - **cli:** Don't migrate Podfile on SPM projects ([#7939](https://github.com/ionic-team/capacitor/issues/7939)) ([ab4e700](https://github.com/ionic-team/capacitor/commit/ab4e700035289f445668dfd2f86278ffc71ab269)) - **ios:** respect shouldEncodeUrlParams value ([#7931](https://github.com/ionic-team/capacitor/issues/7931)) ([4fb12a0](https://github.com/ionic-team/capacitor/commit/4fb12a03a92c0f38b0d48b114252342f4bdc17bf)) -### Features +## Features - **http:** Apply overrideUserAgent to requests ([#7906](https://github.com/ionic-team/capacitor/issues/7906)) ([52482c9](https://github.com/ionic-team/capacitor/commit/52482c9d3c575b737054b41f9d1730c70cc5f471)) - **ios:** Enable Fullscreen API on WebView ([#7909](https://github.com/ionic-team/capacitor/issues/7909)) ([172638e](https://github.com/ionic-team/capacitor/commit/172638ec7b6eb67bf25f8dac2818122ba31c2c91)) # [7.1.0](https://github.com/ionic-team/capacitor/compare/7.0.1...7.1.0) (2025-03-12) -### Bug Fixes +## Bug Fixes - **android:** add EdgeToEdge compatibility ([#7871](https://github.com/ionic-team/capacitor/issues/7871)) ([64a8bc4](https://github.com/ionic-team/capacitor/commit/64a8bc40de2522c75a94a40cba6c8ccd82481cb8)) - **android:** sanitize portable file name ([#7894](https://github.com/ionic-team/capacitor/issues/7894)) ([5f09297](https://github.com/ionic-team/capacitor/commit/5f092970e33da1ec896efc4e2a5ae3fb77fca658)) @@ -787,7 +796,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** listen for CapacitorViewDidAppear ([#7850](https://github.com/ionic-team/capacitor/issues/7850)) ([e24ffb7](https://github.com/ionic-team/capacitor/commit/e24ffb7d4de0bf3d53e92537f21c864f121c1fad)) - **ios:** Reset plugin listeners when WebView process is terminated ([#7905](https://github.com/ionic-team/capacitor/issues/7905)) ([d039157](https://github.com/ionic-team/capacitor/commit/d0391576726955b2c1b484f1ca9a03465b9ef67e)) -### Features +## Features - Add function to inject external JS into WebView before document load ([#7864](https://github.com/ionic-team/capacitor/issues/7864)) ([ec0954c](https://github.com/ionic-team/capacitor/commit/ec0954c197543e913939f3ab9c4bcb172bfa3530)) - **android:** add adjustMarginsForEdgeToEdge configuration option ([#7885](https://github.com/ionic-team/capacitor/issues/7885)) ([1ea86d1](https://github.com/ionic-team/capacitor/commit/1ea86d166afd315e72847c5e734a8c175fb90e04)) @@ -814,31 +823,31 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/7.0.0-alpha.2...7.0.0-beta.0) (2024-12-20) -### Bug Fixes +## Bug Fixes - **cli:** correct rimraf import ([#7811](https://github.com/ionic-team/capacitor/issues/7811)) ([0891624](https://github.com/ionic-team/capacitor/commit/0891624c46b78a0fd39f617f834d5cdd1f54f5e6)) - **cli:** update link to telemetry information ([e922e2b](https://github.com/ionic-team/capacitor/commit/e922e2b718f5c6f2e4062cdccdeb92da3321e67d)) - **ios:** Make Bridge webView first responder ([#7753](https://github.com/ionic-team/capacitor/issues/7753)) ([77e4668](https://github.com/ionic-team/capacitor/commit/77e4668fa8dbb24b4561387e101547f74e37538e)) -### Features +## Features - Add global initialFocus configuration ([#7775](https://github.com/ionic-team/capacitor/issues/7775)) ([61d0165](https://github.com/ionic-team/capacitor/commit/61d01653685d8e3594d2d8a6bd870fa9643ba95c)) # [7.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/7.0.0-alpha.1...7.0.0-alpha.2) (2024-11-19) -### Bug Fixes +## Bug Fixes - **cli:** make Cordova plugins use same default kotlin version as Capacitor ([#7752](https://github.com/ionic-team/capacitor/issues/7752)) ([a4aeb55](https://github.com/ionic-team/capacitor/commit/a4aeb55720ecc83b3870bf32bf9825d6aee4644f)) # [7.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/6.1.2...7.0.0-alpha.1) (2024-10-14) -### Bug Fixes +## Bug Fixes - **android-template:** prevent app restart on bluetooh keyboard changes ([#7652](https://github.com/ionic-team/capacitor/issues/7652)) ([200c7cb](https://github.com/ionic-team/capacitor/commit/200c7cb911898fbfb12b0b25e8cfd1982e0a6bf0)) - **cli:** replace app-store deprecated method on build ([#7637](https://github.com/ionic-team/capacitor/issues/7637)) ([942b108](https://github.com/ionic-team/capacitor/commit/942b108c1d506539c0c53276ed4ec35eed36634e)) - **ios:** fix retain cycle caused by CDVPluginManager ([#7692](https://github.com/ionic-team/capacitor/issues/7692)) ([02bdb3d](https://github.com/ionic-team/capacitor/commit/02bdb3d1d15907dcc577f16b7f2e22050e54ffef)) -### Features +## Features - **core:** expose `methodName` via `CAPPluginCall` ([#7641](https://github.com/ionic-team/capacitor/issues/7641)) ([df109aa](https://github.com/ionic-team/capacitor/commit/df109aa1cfa1ea824e22feecbd2b7183a57fc693)) - **ios:** JSValueEncoder/Decoder feature parity with JSONEncoder/Decoder ([#7647](https://github.com/ionic-team/capacitor/issues/7647)) ([410249b](https://github.com/ionic-team/capacitor/commit/410249b6c626e67235f25b466ed4969d52148bd1)), closes [#7576](https://github.com/ionic-team/capacitor/issues/7576) @@ -866,7 +875,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.1.0](https://github.com/ionic-team/capacitor/compare/6.0.0...6.1.0) (2024-06-11) -### Bug Fixes +## Bug Fixes - **android:** avoid crash if server url ends in / ([#7426](https://github.com/ionic-team/capacitor/issues/7426)) ([f8264cc](https://github.com/ionic-team/capacitor/commit/f8264ccae1f2fec553521bc62d767c4909ea6d79)) - **cli:** Avoid duplicate entries in packageClassList ([#7470](https://github.com/ionic-team/capacitor/issues/7470)) ([cca0b80](https://github.com/ionic-team/capacitor/commit/cca0b805291bd002c515be0a1c15de84ee23c5d3)) @@ -874,14 +883,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **http:** don't override readyState for non POST requests ([#7488](https://github.com/ionic-team/capacitor/issues/7488)) ([30c13a8](https://github.com/ionic-team/capacitor/commit/30c13a865e7710e6dc5f0ee014e951d52d030795)) - **ios:** check if urlSchemeTask is stopped before calling its methods ([#7482](https://github.com/ionic-team/capacitor/issues/7482)) ([b32b5b1](https://github.com/ionic-team/capacitor/commit/b32b5b17ed14bd43c846b3fcb930bfd88e245e40)) -### Features +## Features - **cli:** run plugin hooks ([#7499](https://github.com/ionic-team/capacitor/issues/7499)) ([3b847ea](https://github.com/ionic-team/capacitor/commit/3b847eac42673c812a4538c319b81c8f8afc9955)) - **ios:** CAPPluginMethod selector-based initializer ([#7412](https://github.com/ionic-team/capacitor/issues/7412)) ([44c5b55](https://github.com/ionic-team/capacitor/commit/44c5b55e36b85471a85ee5a1af47bdb1a5d83a8b)) # [6.0.0](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.2...6.0.0) (2024-04-15) -### Bug Fixes +## Bug Fixes - **cli:** Change Capacitor plugin files check ([#7375](https://github.com/ionic-team/capacitor/issues/7375)) ([fbfb778](https://github.com/ionic-team/capacitor/commit/fbfb77825fdd3343e85868ea28b8e14a482dcf4a)) - **cli:** Don't downgrade gradle version on migrate ([#7385](https://github.com/ionic-team/capacitor/issues/7385)) ([c79211e](https://github.com/ionic-team/capacitor/commit/c79211ec9dde81a57aca5cee8ab09cdef0c9ad86)) @@ -890,13 +899,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **http:** prevent POST request from being proxied ([#7395](https://github.com/ionic-team/capacitor/issues/7395)) ([7b8c352](https://github.com/ionic-team/capacitor/commit/7b8c3523decd5610dcf09e926640bf35b382d61d)) - secure cookies often are not set by the cookie plugin ([#7261](https://github.com/ionic-team/capacitor/issues/7261)) ([cda1886](https://github.com/ionic-team/capacitor/commit/cda18861aea3ced7835f959cba612cea98761c58)) -### Features +## Features - **cli:** Support bun when running cap migrate ([#7386](https://github.com/ionic-team/capacitor/issues/7386)) ([3f96ff9](https://github.com/ionic-team/capacitor/commit/3f96ff911588c517dc2d924f55ef28a25c30bd33)) # [6.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.1...6.0.0-rc.2) (2024-03-25) -### Bug Fixes +## Bug Fixes - **cli:** also generate packageClassList on copy ([#7358](https://github.com/ionic-team/capacitor/issues/7358)) ([865cceb](https://github.com/ionic-team/capacitor/commit/865cceb1bf7e1b973e8f83f3c77040add71b403c)) - **cli:** use correct pass signature for apksigner signing ([#7365](https://github.com/ionic-team/capacitor/issues/7365)) ([e4f8610](https://github.com/ionic-team/capacitor/commit/e4f86103c2806df4ca2729600361e6338c30f083)) @@ -906,7 +915,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.0...6.0.0-rc.1) (2024-03-15) -### Bug Fixes +## Bug Fixes - **android:** handle http errors on the proxy ([#7280](https://github.com/ionic-team/capacitor/issues/7280)) ([cca3c80](https://github.com/ionic-team/capacitor/commit/cca3c80298b768a5eaf1da4d95f659e303ed7042)) - **android:** incorrect http url params encoding ([#6586](https://github.com/ionic-team/capacitor/issues/6586)) ([e9ddb0c](https://github.com/ionic-team/capacitor/commit/e9ddb0cfdb1ed320b650e1d01a04d37e644f6dd3)) @@ -931,13 +940,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** overwrite CORS headers on livereload ([#7339](https://github.com/ionic-team/capacitor/issues/7339)) ([0c8d69b](https://github.com/ionic-team/capacitor/commit/0c8d69b7f9c163730e7d74bb0147b61742c61676)) - **spm:** add product lines to Package.swift ([#7278](https://github.com/ionic-team/capacitor/issues/7278)) ([e45d60d](https://github.com/ionic-team/capacitor/commit/e45d60d15445fa55320eb6274de67d4b4191f30a)) -### Features +## Features - **webview:** add setServerAssetPath method ([881235b](https://github.com/ionic-team/capacitor/commit/881235b14de23ef988746bfb89a5a0fc3c8d8466)) # [6.0.0-rc.0](https://github.com/ionic-team/capacitor/compare/6.0.0-beta.2...6.0.0-rc.0) (2024-01-23) -### Bug Fixes +## Bug Fixes - **android:** don't proxy requests if no jsInjector ([#7199](https://github.com/ionic-team/capacitor/issues/7199)) ([7dc5585](https://github.com/ionic-team/capacitor/commit/7dc5585996c17eedd154b5d9118eb880fef616fe)) - **android:** handle deprecation warnings ([#7190](https://github.com/ionic-team/capacitor/issues/7190)) ([06636d7](https://github.com/ionic-team/capacitor/commit/06636d73a1b12c8f932642ee7caf91432690fea5)) @@ -949,7 +958,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - stop crashing from `objc_getClassList` ([#7187](https://github.com/ionic-team/capacitor/issues/7187)) ([e148db7](https://github.com/ionic-team/capacitor/commit/e148db7758e4186ad45fd74185a10fb757ff9b29)) - **web:** Implement `retainUntilConsumed` on notifyListeners ([#7127](https://github.com/ionic-team/capacitor/issues/7127)) ([526292e](https://github.com/ionic-team/capacitor/commit/526292eb273ee7d8fa9a9912ce3b59e9a104c19e)) -### Features +## Features - **android:** Load alternative layout when no WebView ([#7141](https://github.com/ionic-team/capacitor/issues/7141)) ([87c399a](https://github.com/ionic-team/capacitor/commit/87c399ab6b41f217b4d8a58bfb916a5d78641fd0)) - **cli:** allow async in capacitor config file ([#4299](https://github.com/ionic-team/capacitor/issues/4299)) ([5cecc3e](https://github.com/ionic-team/capacitor/commit/5cecc3ee22868f9397792ec80a4b753a07b68f30)) @@ -961,33 +970,33 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-beta.1](https://github.com/ionic-team/capacitor/compare/6.0.0-beta.0...6.0.0-beta.1) (2023-12-14) -### Bug Fixes +## Bug Fixes - **ios:** Add Codable folder to podspec source_files ([#7131](https://github.com/ionic-team/capacitor/issues/7131)) ([04d1d55](https://github.com/ionic-team/capacitor/commit/04d1d557b51fcac31281a3f547300f06c6dacfb2)) # [6.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/6.0.0-alpha.2...6.0.0-beta.0) (2023-12-13) -### Bug Fixes +## Bug Fixes - **http:** parse readablestream data on fetch request objects ([#6919](https://github.com/ionic-team/capacitor/issues/6919)) ([80ec3b7](https://github.com/ionic-team/capacitor/commit/80ec3b73db18b7b6841bf90ed50a67389946ab87)) - **http:** properly write form-urlencoded data on android request body ([#7001](https://github.com/ionic-team/capacitor/issues/7001)) ([a986ee5](https://github.com/ionic-team/capacitor/commit/a986ee541f54a1d3ac637b514fe547b224b36903)) - **http:** set formdata boundary and body when content-type not explicitly set ([0c2ccd9](https://github.com/ionic-team/capacitor/commit/0c2ccd910a92ce3deaa67eb1819a4faa39c6af6e)) - **ios:** add some new cordova-ios classes used by Cordova plugins ([#7096](https://github.com/ionic-team/capacitor/issues/7096)) ([3db9051](https://github.com/ionic-team/capacitor/commit/3db9051eb015cf5f402f81b4cbaa7b27a5c9477a)) -### Features +## Features - **ios:** Add Codable support for CAPPluginCall and JSValueContainer ([#7119](https://github.com/ionic-team/capacitor/issues/7119)) ([af417e0](https://github.com/ionic-team/capacitor/commit/af417e0cbbb1a3a7b3b62756eebb8d1dc0952cc4)) - support for Amazon Fire WebView ([#6603](https://github.com/ionic-team/capacitor/issues/6603)) ([3cb4eb8](https://github.com/ionic-team/capacitor/commit/3cb4eb89632bce8dc872418fdb130bfd4de40b68)) # [6.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/6.0.0-alpha.1...6.0.0-alpha.2) (2023-11-15) -### Bug Fixes +## Bug Fixes - **ios:** Remove CocoaPods Xcode 15 workaround that causes issues ([#7059](https://github.com/ionic-team/capacitor/issues/7059)) ([043a8db](https://github.com/ionic-team/capacitor/commit/043a8dba4059e33c7445696c186110bef1130e16)) # [6.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/5.2.3...6.0.0-alpha.1) (2023-11-08) -### Bug Fixes +## Bug Fixes - allow double quotes in Gemfile ([#6903](https://github.com/ionic-team/capacitor/issues/6903)) ([3abdbed](https://github.com/ionic-team/capacitor/commit/3abdbed38844d5d59d244f6f0dfc2647f29ce446)) - **android:** handle webview version for developer builds ([#6907](https://github.com/ionic-team/capacitor/issues/6907)) ([88498e6](https://github.com/ionic-team/capacitor/commit/88498e6228492a9ae917d3a7b37c242881f9fe52)) @@ -1005,7 +1014,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios-template:** added workaround for Cocoapods bug in XC15 ([#6847](https://github.com/ionic-team/capacitor/issues/6847)) ([10ccc76](https://github.com/ionic-team/capacitor/commit/10ccc769b67eda12a2899c447949a4865d3e9954)) - Update migrate to Capacitor 6 ([#6872](https://github.com/ionic-team/capacitor/issues/6872)) ([98eec8f](https://github.com/ionic-team/capacitor/commit/98eec8fe9fd332d6669965fa5a21412233b3e06e)) -### Features +## Features - add livereload to run command ([#6831](https://github.com/ionic-team/capacitor/issues/6831)) ([4099969](https://github.com/ionic-team/capacitor/commit/4099969f70e9b995182bacecc16e160d89bbc746)) - Add the spm root project to the template ([#6877](https://github.com/ionic-team/capacitor/issues/6877)) ([02c44c2](https://github.com/ionic-team/capacitor/commit/02c44c2d9ed1b76a72b0f8a2c338b556133c9582)) @@ -1017,14 +1026,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.6.0](https://github.com/ionic-team/capacitor/compare/5.5.1...5.6.0) (2023-12-14) -### Bug Fixes +## Bug Fixes - **cli:** Use latest native-run ([#7030](https://github.com/ionic-team/capacitor/issues/7030)) ([1d948d4](https://github.com/ionic-team/capacitor/commit/1d948d4df6b6b6f8cfdc02e72d84ae8be963f4a0)) - **http:** properly write form-urlencoded data on android request body ([#7130](https://github.com/ionic-team/capacitor/issues/7130)) ([a745a89](https://github.com/ionic-team/capacitor/commit/a745a89e18a5082ae4e737d78aa20929f6952382)) - **http:** set formdata boundary and body when content-type not explicitly set ([#7133](https://github.com/ionic-team/capacitor/issues/7133)) ([3862d6e](https://github.com/ionic-team/capacitor/commit/3862d6e6721793d78add9acf5b14fd9a8f7a5b60)) - **ios:** add some new cordova-ios classes used by Cordova plugins ([#7115](https://github.com/ionic-team/capacitor/issues/7115)) ([5fb902b](https://github.com/ionic-team/capacitor/commit/5fb902b232d9afded2edc865c8d3c0c0e7efe5e7)) -### Features +## Features - support for Amazon Fire WebView ([#6603](https://github.com/ionic-team/capacitor/issues/6603)) ([#7129](https://github.com/ionic-team/capacitor/issues/7129)) ([421d2c0](https://github.com/ionic-team/capacitor/commit/421d2c02e4d1954d16d573facae9c235fee60f02)) @@ -1036,7 +1045,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.5.0](https://github.com/ionic-team/capacitor/compare/5.4.2...5.5.0) (2023-10-11) -### Features +## Features - **android:** allow developers to provide logic for onRenderProcessGone in WebViewListener ([#6946](https://github.com/ionic-team/capacitor/issues/6946)) ([34b724a](https://github.com/ionic-team/capacitor/commit/34b724a4cf406c23b2a9952ef81e0327b78a3b3a)) @@ -1060,26 +1069,26 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.4.0](https://github.com/ionic-team/capacitor/compare/5.3.0...5.4.0) (2023-09-14) -### Bug Fixes +## Bug Fixes - **cli:** use helper in Podfile with correct path ([#6888](https://github.com/ionic-team/capacitor/issues/6888)) ([9048432](https://github.com/ionic-team/capacitor/commit/9048432755095ce3dcca9d3bab39894f2b6c3967)) - **http:** add support for defining xhr and angular http response types ([09bd040](https://github.com/ionic-team/capacitor/commit/09bd040dfe4b8808d7499b6ee592005420406cac)) - **http:** add support for Request objects in fetch ([2fe4535](https://github.com/ionic-team/capacitor/commit/2fe4535e781b1a5cfa0f3359c1afa5c360073b6a)) - **http:** inherit object properties on window.XMLHttpRequest ([5cd3b2f](https://github.com/ionic-team/capacitor/commit/5cd3b2fa6d6936864e1aab2e98963df2d4da3b95)) -### Features +## Features - add livereload to run command ([#6831](https://github.com/ionic-team/capacitor/issues/6831)) ([54a63ae](https://github.com/ionic-team/capacitor/commit/54a63ae0a5f0845d5ef2c0d10bd0c27682866940)) # [5.3.0](https://github.com/ionic-team/capacitor/compare/5.2.3...5.3.0) (2023-08-23) -### Bug Fixes +## Bug Fixes - **cookies:** remove session cookies when initializing the cookie manager ([037863b](https://github.com/ionic-team/capacitor/commit/037863bea6f3a00978125dc2f8ecba1e896c0740)) - **http:** disconnect active connections if call or bridge is destroyed ([a1ed6cc](https://github.com/ionic-team/capacitor/commit/a1ed6cc6f07465d683b95e3796d944f863a7b857)) - **http:** return numbers and booleans as-is when application/json is the content type ([03dd3f9](https://github.com/ionic-team/capacitor/commit/03dd3f96c7ee75b6fff2b7c40d0c9a58fb04fce5)) -### Features +## Features - better support monorepos ([#6811](https://github.com/ionic-team/capacitor/issues/6811)) ([ae35e29](https://github.com/ionic-team/capacitor/commit/ae35e29fb8c886dea867683a23a558d2d344073b)) @@ -1108,13 +1117,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.2.0](https://github.com/ionic-team/capacitor/compare/5.1.1...5.2.0) (2023-07-12) -### Bug Fixes +## Bug Fixes - **cli:** make migrate not error if there are no dependencies ([#6707](https://github.com/ionic-team/capacitor/issues/6707)) ([25ca83a](https://github.com/ionic-team/capacitor/commit/25ca83a8a76fe0eaf73c0db24fd950b33fd16063)) - **cookies:** sanitize url before retrieving/setting cookies ([ca40634](https://github.com/ionic-team/capacitor/commit/ca4063471f215d3f7525e51592d9c72138a52855)) - **http:** fire events in correct order when using xhr ([5ed3617](https://github.com/ionic-team/capacitor/commit/5ed361787596bb5949f6ae5e366495f296352bf3)) -### Features +## Features - **http:** support for FormData requests ([#6708](https://github.com/ionic-team/capacitor/issues/6708)) ([849c564](https://github.com/ionic-team/capacitor/commit/849c56458205bea3b078b1ee19807d7fd84c47b1)) @@ -1126,14 +1135,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.1.0](https://github.com/ionic-team/capacitor/compare/5.0.5...5.1.0) (2023-06-29) -### Bug Fixes +## Bug Fixes - **android:** Move bridge localUrl initialization to initWebView ([#6685](https://github.com/ionic-team/capacitor/issues/6685)) ([7f5f0ca](https://github.com/ionic-team/capacitor/commit/7f5f0ca4220d40d6a19c778c18f9534ef3b65899)) - **android:** revert cookie manager initialization to plugin load ([53a2d47](https://github.com/ionic-team/capacitor/commit/53a2d4792e026a89723a672a01fc34990add71f0)) - **ios:** Return proper MIME Type for local WASM files ([#6675](https://github.com/ionic-team/capacitor/issues/6675)) ([d7856de](https://github.com/ionic-team/capacitor/commit/d7856de62a4c058ac474ae91a5fd221dabf99c0a)) - **ios:** set cors headers in asset handler for live reload ([e5a1c81](https://github.com/ionic-team/capacitor/commit/e5a1c81fe81904dfd7e3f5100a04088173effc1c)) -### Features +## Features - **android:** add check for excluded domains before ssl request ([7906d36](https://github.com/ionic-team/capacitor/commit/7906d3616e8bfb2e2c1c81ee123424c06fc4e5ab)) - **cli:** add apksigner as a build option ([#6442](https://github.com/ionic-team/capacitor/issues/6442)) ([9818a76](https://github.com/ionic-team/capacitor/commit/9818a76ab4ea6660b444354f239344d37c77d3b3)) @@ -1185,13 +1194,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/5.0.0-rc.1...5.0.0-rc.2) (2023-05-03) -### Bug Fixes +## Bug Fixes - check for android and JDK ([#6554](https://github.com/ionic-team/capacitor/issues/6554)) ([ddcc818](https://github.com/ionic-team/capacitor/commit/ddcc818e828b290459d3ddffe9102fc312139823)) # [5.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/5.0.0-rc.0...5.0.0-rc.1) (2023-05-02) -### Bug Fixes +## Bug Fixes - **cli:** Avoid infinite loop in namespace migration ([#6551](https://github.com/ionic-team/capacitor/issues/6551)) ([d3aacde](https://github.com/ionic-team/capacitor/commit/d3aacdeb0c86d3941464954e7d1f582e405be489)) - **cli:** Migrate more plugin variables ([#6552](https://github.com/ionic-team/capacitor/issues/6552)) ([b7da5b9](https://github.com/ionic-team/capacitor/commit/b7da5b988ce7da5ea3991eaec46b9e52ff3635f1)) @@ -1202,11 +1211,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-beta.3](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.2...5.0.0-beta.3) (2023-04-21) -### Bug Fixes +## Bug Fixes - **cookies:** init cookie manager after server url is set ([0ee772f](https://github.com/ionic-team/capacitor/commit/0ee772ff6456ad0948a0dd025dfcf2658a5563a0)) -### Features +## Features - **android:** update gradle to 8.0.2 and gradle plugin to 8.0.0 ([#6497](https://github.com/ionic-team/capacitor/issues/6497)) ([01b5b39](https://github.com/ionic-team/capacitor/commit/01b5b399324ae5d0896989478a6910fb946542d7)) - **cli:** android manifest to build.gradle migration ([#6533](https://github.com/ionic-team/capacitor/issues/6533)) ([245b6ab](https://github.com/ionic-team/capacitor/commit/245b6ab85b0f481f08c21e25f2b2a7eb6da9996c)) @@ -1214,7 +1223,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.1...5.0.0-beta.2) (2023-04-13) -### Bug Fixes +## Bug Fixes - **android:** launching intents without host ([#6489](https://github.com/ionic-team/capacitor/issues/6489)) ([95f7474](https://github.com/ionic-team/capacitor/commit/95f747401ac5a666de4338a18666060e9c1ff39e)) - **android:** unify kotlin dependency version ([#6501](https://github.com/ionic-team/capacitor/issues/6501)) ([0a40477](https://github.com/ionic-team/capacitor/commit/0a4047768cbde9bc17d92955e64ab11d2e3b3335)) @@ -1222,25 +1231,25 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios/android:** copy url from nativeResponse to response ([#6482](https://github.com/ionic-team/capacitor/issues/6482)) ([828fb71](https://github.com/ionic-team/capacitor/commit/828fb71ebb52c0655d5879ad0edaac7368ab2b96)) - remove accept-charset ([#6386](https://github.com/ionic-team/capacitor/issues/6386)) ([bbf6f7e](https://github.com/ionic-team/capacitor/commit/bbf6f7e1af0c49c0bc917942b6715c613be3f557)) -### Features +## Features - **ios:** Add Bundler support ([#5205](https://github.com/ionic-team/capacitor/issues/5205)) ([f21c6d0](https://github.com/ionic-team/capacitor/commit/f21c6d01fc30e46c151afc93da9727dbf6c9ddcf)) - **ios:** add webContentsDebuggingEnabled configuration ([#6495](https://github.com/ionic-team/capacitor/issues/6495)) ([c691e4a](https://github.com/ionic-team/capacitor/commit/c691e4aecbfb7a45ce0465d1fe9020ab715815d3)) # [5.0.0-beta.1](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.0...5.0.0-beta.1) (2023-04-03) -### Bug Fixes +## Bug Fixes - copy url from nativeResponse to response in native-bridge.ts ([#6397](https://github.com/ionic-team/capacitor/issues/6397)) ([e81a2ff](https://github.com/ionic-team/capacitor/commit/e81a2ff42ddd446f3004ab5af6e74209f7ff076a)) -### Features +## Features - **cli:** add npm update step to migrate ([#6462](https://github.com/ionic-team/capacitor/issues/6462)) ([65520c3](https://github.com/ionic-team/capacitor/commit/65520c36cdb4ac6f8811eb72624c447f2a0d884a)) - **cli:** non interactive migrate ([#6461](https://github.com/ionic-team/capacitor/issues/6461)) ([53dfeaf](https://github.com/ionic-team/capacitor/commit/53dfeaf77ace5b165260b68351eae8e5bf72ea0a)) # [5.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/5.0.0-alpha.1...5.0.0-beta.0) (2023-03-31) -### Bug Fixes +## Bug Fixes - 204 http response ([#6266](https://github.com/ionic-team/capacitor/issues/6266)) ([771f6ce](https://github.com/ionic-team/capacitor/commit/771f6ce1f35159848db218a42dc4f56b5106f750)) - **android:** Allow WebView to load data urls ([#6418](https://github.com/ionic-team/capacitor/issues/6418)) ([daf2ec6](https://github.com/ionic-team/capacitor/commit/daf2ec64df0c567c6a42560488e5d2515eff8a33)) @@ -1249,7 +1258,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** Fix cordova plugin config checker over checking 5.x ([#6444](https://github.com/ionic-team/capacitor/issues/6444)) ([9d21a0e](https://github.com/ionic-team/capacitor/commit/9d21a0e363141fa0792c12d977b13692be67cf6d)) - **ios:** Event listeners were unexpectedly nil ([#6445](https://github.com/ionic-team/capacitor/issues/6445)) ([209d4ed](https://github.com/ionic-team/capacitor/commit/209d4edace610b00e689440a5c08e72f5da60cc2)) -### Features +## Features - **android:** Fix for [#6258](https://github.com/ionic-team/capacitor/issues/6258), Add support for modern Huawei devices ([#6402](https://github.com/ionic-team/capacitor/issues/6402)) ([17f2f4a](https://github.com/ionic-team/capacitor/commit/17f2f4ac744a038c1dae3cbd74a670d5ede92ef3)) - **cli:** Add missing Cap 4 to Cap 5 migration tasks ([#6453](https://github.com/ionic-team/capacitor/issues/6453)) ([7dff363](https://github.com/ionic-team/capacitor/commit/7dff36376d6efa6ea8793b81550979ee9254991b)) @@ -1260,7 +1269,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/4.7.0...5.0.0-alpha.1) (2023-03-16) -### Bug Fixes +## Bug Fixes - **android:** handle empty permission list ([#6375](https://github.com/ionic-team/capacitor/issues/6375)) ([b11a9df](https://github.com/ionic-team/capacitor/commit/b11a9df070f18a25364a9109e295556fc75ea7f9)) - **android:** handle null http headers and params ([#6370](https://github.com/ionic-team/capacitor/issues/6370)) ([e486672](https://github.com/ionic-team/capacitor/commit/e486672731818d5c64c50956562aa4766f169d41)) @@ -1268,7 +1277,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** point build to proper workspace name ([#6371](https://github.com/ionic-team/capacitor/issues/6371)) ([78b7a59](https://github.com/ionic-team/capacitor/commit/78b7a591429b5fc1dc7bf87e06e9a1afd3599408)) - **iOS:** Separate cookies by `; ` rather than `;` when accessing through `document.cookie` ([#6313](https://github.com/ionic-team/capacitor/issues/6313)) ([beade60](https://github.com/ionic-team/capacitor/commit/beade6020e25dc405e796e1b06bf6dd90b217693)) -### Features +## Features - **android-template:** Removing enableJetifier ([#6339](https://github.com/ionic-team/capacitor/issues/6339)) ([e118175](https://github.com/ionic-team/capacitor/commit/e11817544fcdc7fb6ecc02907d9a002f4f61c277)) - **android:** Removing enableJetifier ([#6333](https://github.com/ionic-team/capacitor/issues/6333)) ([fc0b403](https://github.com/ionic-team/capacitor/commit/fc0b403265f63eab35cdb2f262fb1e047db4b6bd)) @@ -1277,7 +1286,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.7.0](https://github.com/ionic-team/capacitor/compare/4.6.3...4.7.0) (2023-02-22) -### Bug Fixes +## Bug Fixes - handle fetch headers that are Headers objects ([#6320](https://github.com/ionic-team/capacitor/issues/6320)) ([cb00e49](https://github.com/ionic-team/capacitor/commit/cb00e4952acca8e877555f30b2190f6685d25934)) - **cli:** prevent error on manifest element without children ([#6278](https://github.com/ionic-team/capacitor/issues/6278)) ([a7e374f](https://github.com/ionic-team/capacitor/commit/a7e374fc4d834ded437edb4c8a0be98b6691be4c)) @@ -1285,7 +1294,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** Avoid double encoding on http urls ([#6288](https://github.com/ionic-team/capacitor/issues/6288)) ([4768085](https://github.com/ionic-team/capacitor/commit/4768085414768bb2c013afcc6c645664893cd297)) - **ios:** Correctly Attach Headers to Request ([#6303](https://github.com/ionic-team/capacitor/issues/6303)) ([a3f875c](https://github.com/ionic-team/capacitor/commit/a3f875cf42e111fde07d6e87643264b19ed77573)) -### Features +## Features - **android:** add ability to create config from a custom file path ([#6264](https://github.com/ionic-team/capacitor/issues/6264)) ([42b4f0f](https://github.com/ionic-team/capacitor/commit/42b4f0f416c8038ae368860007910bb09c8ec84e)) - **android:** Add SSL Pinning logic ([#6314](https://github.com/ionic-team/capacitor/issues/6314)) ([07f113e](https://github.com/ionic-team/capacitor/commit/07f113e6933e15c45d772f69f7128cbb3706f7b9)) @@ -1318,21 +1327,21 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.6.0](https://github.com/ionic-team/capacitor/compare/4.5.0...4.6.0) (2022-12-01) -### Bug Fixes +## Bug Fixes - **android:** Don't run Cordova plugins on ui thread ([#6108](https://github.com/ionic-team/capacitor/issues/6108)) ([592ee86](https://github.com/ionic-team/capacitor/commit/592ee862a58f5cb0737620a0246fe8ae295d27cf)) - **cli:** useLegacyBridge should be optional ([#6095](https://github.com/ionic-team/capacitor/issues/6095)) ([20f68fe](https://github.com/ionic-team/capacitor/commit/20f68feab2cb88cf8a79a987533839aa49255607)) - **cli:** warns about config that is present ([#6060](https://github.com/ionic-team/capacitor/issues/6060)) ([7ac43e7](https://github.com/ionic-team/capacitor/commit/7ac43e722139a61129cfecf98da373659b1aeac8)) - **cookies:** Use Set-Cookie headers to persist cookies ([57f8b39](https://github.com/ionic-team/capacitor/commit/57f8b39d7f4c5ee0e5e5cb316913e9450a81d22b)) -### Features +## Features - **android:** Plugin Instance Support ([#6073](https://github.com/ionic-team/capacitor/issues/6073)) ([3d5b7c2](https://github.com/ionic-team/capacitor/commit/3d5b7c2d372cf764c625f46d1e8761e05b8959da)) - **ios:** Plugin Registration and Plugin Instance Support ([#6072](https://github.com/ionic-team/capacitor/issues/6072)) ([9f1d863](https://github.com/ionic-team/capacitor/commit/9f1d863c1222096334a0dd05f39ce7f984a2763a)) # [4.5.0](https://github.com/ionic-team/capacitor/compare/4.4.0...4.5.0) (2022-11-16) -### Bug Fixes +## Bug Fixes - **android:** Silence deprecation warning on handlePermissionResult ([#6092](https://github.com/ionic-team/capacitor/issues/6092)) ([888b13e](https://github.com/ionic-team/capacitor/commit/888b13e89c48dab949b38135a3ec443ac4fd852e)) - **cli:** add vite config to framework detection ([#6039](https://github.com/ionic-team/capacitor/issues/6039)) ([3796d42](https://github.com/ionic-team/capacitor/commit/3796d42665f3150f99c761aa561a9e34d03cae28)) @@ -1340,21 +1349,21 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** Update gradle versions only if they are older ([#6015](https://github.com/ionic-team/capacitor/issues/6015)) ([ae94101](https://github.com/ionic-team/capacitor/commit/ae941017fff3bcfa75e0788535f356a56ce6fa05)) - **cli/ios:** Read handleApplicationNotifications configuration option ([#6030](https://github.com/ionic-team/capacitor/issues/6030)) ([99ccf18](https://github.com/ionic-team/capacitor/commit/99ccf181f6ee8a00ed97bdbf9076e2b2ea27cd57)) -### Features +## Features - **android/cli:** Allow to use the old addJavascriptInterface bridge ([#6043](https://github.com/ionic-team/capacitor/issues/6043)) ([a6e7c54](https://github.com/ionic-team/capacitor/commit/a6e7c5422687b703492a5fcc49369eacc376143d)) - **cookies:** add get cookies plugin method ([ba1e770](https://github.com/ionic-team/capacitor/commit/ba1e7702a3338714aee24388c0afea39706c9341)) # [4.4.0](https://github.com/ionic-team/capacitor/compare/4.3.0...4.4.0) (2022-10-21) -### Bug Fixes +## Bug Fixes - **android:** added ServerPath object and building options for setting initial load from portals ([#6008](https://github.com/ionic-team/capacitor/issues/6008)) ([205b6e6](https://github.com/ionic-team/capacitor/commit/205b6e61806158244846608b1e6c0c7b26ee4ab7)) - **cookies:** make document.cookie setter synchronous ([2272abf](https://github.com/ionic-team/capacitor/commit/2272abf3d3d9dc82d9ca0d03b17e2b78f11f61fc)) - **http:** fix exception thrown on 204 responses ([1f6e8be](https://github.com/ionic-team/capacitor/commit/1f6e8be9d8813c4397e2c54ac4c06beb55f97b5f)) - **http:** fix local http requests on native platforms ([c4e040a](https://github.com/ionic-team/capacitor/commit/c4e040a6f8c6b54bac6ae320e5f0f008604fe50f)) -### Features +## Features - **cli:** add build command for android ([#5891](https://github.com/ionic-team/capacitor/issues/5891)) ([6d4e620](https://github.com/ionic-team/capacitor/commit/6d4e620308b6dd97376e3af7de1dd1a530083f1c)) - **cli:** add build command for ios ([#5925](https://github.com/ionic-team/capacitor/issues/5925)) ([8e8414f](https://github.com/ionic-team/capacitor/commit/8e8414fa6f4ccb245576cc113eb969937613bbf7)) @@ -1362,7 +1371,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.3.0](https://github.com/ionic-team/capacitor/compare/4.2.0...4.3.0) (2022-09-21) -### Bug Fixes +## Bug Fixes - **android:** open external links in browser ([#5913](https://github.com/ionic-team/capacitor/issues/5913)) ([7553ede](https://github.com/ionic-team/capacitor/commit/7553ede93170971e21ab3dec1798443d084ead2a)) - **android:** set all cookies on proxied requests ([#5781](https://github.com/ionic-team/capacitor/issues/5781)) ([5ef6a38](https://github.com/ionic-team/capacitor/commit/5ef6a3889121dd39a9159ff80250df18854bc557)) @@ -1373,13 +1382,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** show error if npm install on migration failed ([#5904](https://github.com/ionic-team/capacitor/issues/5904)) ([aa60a75](https://github.com/ionic-team/capacitor/commit/aa60a75d9c2c784e127a4d89e4079b412fbe7262)) - **core:** Exception object was not set on Cap ([#5917](https://github.com/ionic-team/capacitor/issues/5917)) ([9ca27a4](https://github.com/ionic-team/capacitor/commit/9ca27a4f8441b368f8bf9d97dda57b1a55ac0e4e)) -### Features +## Features - Capacitor Cookies & Capacitor Http core plugins ([d4047cf](https://github.com/ionic-team/capacitor/commit/d4047cfa947676777f400389a8d65defae140b45)) # [4.2.0](https://github.com/ionic-team/capacitor/compare/4.1.0...4.2.0) (2022-09-08) -### Features +## Features - **cli:** add inline option to copy command ([#5901](https://github.com/ionic-team/capacitor/issues/5901)) ([17fbabb](https://github.com/ionic-team/capacitor/commit/17fbabb2a77d1b356d24048efc5883bd4d049104)) - **cli:** add scheme and flavor options to run command ([#5873](https://github.com/ionic-team/capacitor/issues/5873)) ([e4c143d](https://github.com/ionic-team/capacitor/commit/e4c143d4da653533570215964808c2f32f5469d3)) @@ -1387,7 +1396,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.1.0](https://github.com/ionic-team/capacitor/compare/4.0.1...4.1.0) (2022-08-18) -### Bug Fixes +## Bug Fixes - **cli:** Also update preferences plugin if present ([#5831](https://github.com/ionic-team/capacitor/issues/5831)) ([b9d5954](https://github.com/ionic-team/capacitor/commit/b9d5954ca0b333f2caa20179b96b049379860ea5)) - **cli:** Don't add google-services plugin if missing ([#5825](https://github.com/ionic-team/capacitor/issues/5825)) ([48ff9e6](https://github.com/ionic-team/capacitor/commit/48ff9e6461e8037a5c6da87c90efc6bc872d7f08)) @@ -1400,7 +1409,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** return proper mimeType on M1 x86_64 simulators ([#5853](https://github.com/ionic-team/capacitor/issues/5853)) ([325b6fe](https://github.com/ionic-team/capacitor/commit/325b6fe83939efaaef44c7e8624e33de742a57e2)), closes [#5793](https://github.com/ionic-team/capacitor/issues/5793) - update @types/tar to prevent core build failure ([#5822](https://github.com/ionic-team/capacitor/issues/5822)) ([59e64b7](https://github.com/ionic-team/capacitor/commit/59e64b7c548341c27a8477ddc867290592c43815)) -### Features +## Features - **cli:** Option to inline JS source maps during sync ([#5843](https://github.com/ionic-team/capacitor/issues/5843)) ([7ce6dd4](https://github.com/ionic-team/capacitor/commit/7ce6dd4b6fb5cdc395add6f656fbedc785178ae3)) - **ios:** Add `setServerBasePath(_:)` to CAPBridgeProtocol ([#5860](https://github.com/ionic-team/capacitor/issues/5860)) ([76f28e7](https://github.com/ionic-team/capacitor/commit/76f28e70a5c0a03e4c6b9a93a0c068666a2c38ff)) @@ -1415,12 +1424,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.2...4.0.0) (2022-07-27) -### Bug Fixes +## Bug Fixes - **android:** Publish proguard-rules.pro on npm ([#5761](https://github.com/ionic-team/capacitor/issues/5761)) ([df77103](https://github.com/ionic-team/capacitor/commit/df77103ca411fa452239099769289eeeea2404d2)) - **ios:** error data is optional ([#5782](https://github.com/ionic-team/capacitor/issues/5782)) ([da48d79](https://github.com/ionic-team/capacitor/commit/da48d798c3463de9de188ae6a6475fd6afba6091)) -### Features +## Features - **android:** Add android.minWebviewVersion configuration option ([#5768](https://github.com/ionic-team/capacitor/issues/5768)) ([ad83827](https://github.com/ionic-team/capacitor/commit/ad838279e9cd190ce6f1a020a0ac9e3916786324)) - **android:** Add Optional Data Param for Error Object ([#5719](https://github.com/ionic-team/capacitor/issues/5719)) ([174172b](https://github.com/ionic-team/capacitor/commit/174172b6c64dc9117c48ed0e20c25e0b6c2fb625)) @@ -1433,36 +1442,36 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.1...4.0.0-beta.2) (2022-07-08) -### Bug Fixes +## Bug Fixes - **ios:** Add check for both serverURL and localURL in navigation ([#5736](https://github.com/ionic-team/capacitor/issues/5736)) ([8e824f3](https://github.com/ionic-team/capacitor/commit/8e824f33ad4df898fb8c0936a8f5e9041832a5c5)) - **ios:** properly deliver retained events after listener re-add [#5732](https://github.com/ionic-team/capacitor/issues/5732) ([c5d6328](https://github.com/ionic-team/capacitor/commit/c5d632831924a1bcc868bc46b42f7ff619408752)) -### Features +## Features - **ios:** Add `setServerBasePath(path:)` to CAPWebView ([#5742](https://github.com/ionic-team/capacitor/issues/5742)) ([1afbf8a](https://github.com/ionic-team/capacitor/commit/1afbf8a9dd0b8f7b1ac439d24e5d8ba26f786318)) - Add CapWebView ([#5715](https://github.com/ionic-team/capacitor/issues/5715)) ([143d266](https://github.com/ionic-team/capacitor/commit/143d266ef0a818bac59dbbdaeda3b5c382ebfa1d)) # [4.0.0-beta.1](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.0...4.0.0-beta.1) (2022-06-27) -### Bug Fixes +## Bug Fixes - **ios:** Remove Cordova as an embedded framework ([#5709](https://github.com/ionic-team/capacitor/issues/5709)) ([bbf6d24](https://github.com/ionic-team/capacitor/commit/bbf6d248bf9217a5c5c6c15c7bcfeda209aba5b1)) -### Features +## Features - **ios:** Allow to configure popover size ([#5717](https://github.com/ionic-team/capacitor/issues/5717)) ([ca1a125](https://github.com/ionic-team/capacitor/commit/ca1a125e5ab05d6066dd303bc75e99dfe21f210a)) # [4.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/3.6.0...4.0.0-beta.0) (2022-06-17) -### Bug Fixes +## Bug Fixes - **android:** make removeAllListeners return a promise ([#5527](https://github.com/ionic-team/capacitor/issues/5527)) ([6f4d858](https://github.com/ionic-team/capacitor/commit/6f4d858ea879d97109c0c7da2d664d04806adc2a)) - **android:** prevent app from loading if server.url is invalid ([d4a0dea](https://github.com/ionic-team/capacitor/commit/d4a0deaa37eda4476f0be030e266c2c1260fc6e8)) - **cli:** Use CURRENT_PROJECT_VERSION variable on ios template ([#5418](https://github.com/ionic-team/capacitor/issues/5418)) ([0a07648](https://github.com/ionic-team/capacitor/commit/0a07648b4d1c5fb1fd7de3c72ac1bbcb30f48203)) - **ios:** make removeAllListeners return a promise ([#5526](https://github.com/ionic-team/capacitor/issues/5526)) ([815f71b](https://github.com/ionic-team/capacitor/commit/815f71b6b62f6c4d5f66e6a36c190bb00a96fdcc)) -### Features +## Features - **android:** don't allow server.androidScheme to be set to schemes handled by WebView ([01285ba](https://github.com/ionic-team/capacitor/commit/01285ba253d602b08a41240ad2ccf370730d51a3)) - **android:** set default targetSDK to 31 ([#5442](https://github.com/ionic-team/capacitor/issues/5442)) ([4442459](https://github.com/ionic-team/capacitor/commit/4442459b24cdbac25cb1e4de11583d22c21452b3)) @@ -1480,25 +1489,25 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.6.0](https://github.com/ionic-team/capacitor/compare/3.5.1...3.6.0) (2022-06-17) -### Bug Fixes +## Bug Fixes - **ios:** Use `URL(fileURLWithPath:)` instead of `URL(string:)` ([#5603](https://github.com/ionic-team/capacitor/issues/5603)) ([5fac1b2](https://github.com/ionic-team/capacitor/commit/5fac1b2da5aa5882087716cb2aa862d89173f4a1)) -### Features +## Features - **android:** update support for Portals for Capacitor to include Live Updates ([#5660](https://github.com/ionic-team/capacitor/issues/5660)) ([62f0a5e](https://github.com/ionic-team/capacitor/commit/62f0a5eaa40776aad79dbf8f8c0900037d3cc97e)) - **iOS, Android:** add AppUUID Lib for plugins ([#5690](https://github.com/ionic-team/capacitor/issues/5690)) ([05e76cf](https://github.com/ionic-team/capacitor/commit/05e76cf526a44e07fa75f9482fa2223a13918638)) # [4.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.2) (2022-05-12) -### Bug Fixes +## Bug Fixes - **android:** make removeAllListeners return a promise ([#5527](https://github.com/ionic-team/capacitor/issues/5527)) ([6f4d858](https://github.com/ionic-team/capacitor/commit/6f4d858ea879d97109c0c7da2d664d04806adc2a)) - **android:** prevent app from loading if server.url is invalid ([d4a0dea](https://github.com/ionic-team/capacitor/commit/d4a0deaa37eda4476f0be030e266c2c1260fc6e8)) - **cli:** Use CURRENT_PROJECT_VERSION variable on ios template ([#5418](https://github.com/ionic-team/capacitor/issues/5418)) ([0a07648](https://github.com/ionic-team/capacitor/commit/0a07648b4d1c5fb1fd7de3c72ac1bbcb30f48203)) - **ios:** make removeAllListeners return a promise ([#5526](https://github.com/ionic-team/capacitor/issues/5526)) ([815f71b](https://github.com/ionic-team/capacitor/commit/815f71b6b62f6c4d5f66e6a36c190bb00a96fdcc)) -### Features +## Features - **android:** don't allow server.androidScheme to be set to schemes handled by WebView ([01285ba](https://github.com/ionic-team/capacitor/commit/01285ba253d602b08a41240ad2ccf370730d51a3)) - **android:** set default targetSDK to 31 ([#5442](https://github.com/ionic-team/capacitor/issues/5442)) ([4442459](https://github.com/ionic-team/capacitor/commit/4442459b24cdbac25cb1e4de11583d22c21452b3)) @@ -1519,7 +1528,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.5.0](https://github.com/ionic-team/capacitor/compare/3.4.3...3.5.0) (2022-04-22) -### Features +## Features - **android:** Add overridable routing for WebViewLocalServer ([#5553](https://github.com/ionic-team/capacitor/issues/5553)) ([3bb288e](https://github.com/ionic-team/capacitor/commit/3bb288e848c5c0e49c1e58c0782e0b1ffd7b1f31)) - **cli:** support capacitor portals plugin changes needed ([#5558](https://github.com/ionic-team/capacitor/issues/5558)) ([6810a19](https://github.com/ionic-team/capacitor/commit/6810a19ae2bbda1f4b2afad61d37ca822ca157f5)) @@ -1527,11 +1536,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.1) (2022-03-25) -### Bug Fixes +## Bug Fixes - **cli:** Use CURRENT_PROJECT_VERSION variable on ios template ([#5418](https://github.com/ionic-team/capacitor/issues/5418)) ([0a07648](https://github.com/ionic-team/capacitor/commit/0a07648b4d1c5fb1fd7de3c72ac1bbcb30f48203)) -### Features +## Features - **android:** set default targetSDK to 31 ([#5442](https://github.com/ionic-team/capacitor/issues/5442)) ([4442459](https://github.com/ionic-team/capacitor/commit/4442459b24cdbac25cb1e4de11583d22c21452b3)) - **android:** Upgrade gradle to 7.4 ([#5445](https://github.com/ionic-team/capacitor/issues/5445)) ([28eaf18](https://github.com/ionic-team/capacitor/commit/28eaf1851fa7a912917dbb40c68fb4dd583d08ad)) @@ -1563,12 +1572,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.4.0](https://github.com/ionic-team/capacitor/compare/3.3.4...3.4.0) (2022-01-19) -### Bug Fixes +## Bug Fixes - **android:** Add appcompat to capacitor-cordova-android-plugins module ([#5373](https://github.com/ionic-team/capacitor/issues/5373)) ([1c756b7](https://github.com/ionic-team/capacitor/commit/1c756b77bf334036a4b30ddac86ac926fa6c0b3d)) - **android:** prevent input file crash if accept has . ([#5363](https://github.com/ionic-team/capacitor/issues/5363)) ([bdacb30](https://github.com/ionic-team/capacitor/commit/bdacb300bb6391dc4b84bb2bab075df993a15cba)) -### Features +## Features - **android:** Add getLong helper on PluginCall ([#5235](https://github.com/ionic-team/capacitor/issues/5235)) ([26261fb](https://github.com/ionic-team/capacitor/commit/26261fb49211330c4db72c259359565da7d7bc4b)) - **ios:** Add new iOS 15 Motion permission delegate ([#5317](https://github.com/ionic-team/capacitor/issues/5317)) ([c05a3cb](https://github.com/ionic-team/capacitor/commit/c05a3cbbf02217e3972d5e067970cae18bff3faa)) @@ -1609,7 +1618,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.3.0](https://github.com/ionic-team/capacitor/compare/3.2.5...3.3.0) (2021-11-03) -### Bug Fixes +## Bug Fixes - **cli:** Add Batch plugin to static list ([#5138](https://github.com/ionic-team/capacitor/issues/5138)) ([9470633](https://github.com/ionic-team/capacitor/commit/94706338c096b30390fa288c9b107e253923a644)) - **cli:** Add onesignal-cordova-plugin to static pod list ([#5143](https://github.com/ionic-team/capacitor/issues/5143)) ([937e240](https://github.com/ionic-team/capacitor/commit/937e2408f9bb60691e653b70d8b7cb02f540b251)) @@ -1617,7 +1626,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **core:** avoid crash on logging circular objects ([#5186](https://github.com/ionic-team/capacitor/issues/5186)) ([1451ec8](https://github.com/ionic-team/capacitor/commit/1451ec850a9ef73267a032638e73f1fc440647b9)) - **ios:** Avoid CDVScreenOrientationDelegate umbrella header warning ([#5156](https://github.com/ionic-team/capacitor/issues/5156)) ([31ec30d](https://github.com/ionic-team/capacitor/commit/31ec30de193aa3117dbb7eda928ef3a365d5667c)) -### Features +## Features - **android:** ability to reload the webview ([#5184](https://github.com/ionic-team/capacitor/issues/5184)) ([c495bed](https://github.com/ionic-team/capacitor/commit/c495bed216ddf05450f185d2d3f09b4052b281a8)) - **cli:** add support for 'pod install' in VM based environments ([#5144](https://github.com/ionic-team/capacitor/issues/5144)) ([32ecf22](https://github.com/ionic-team/capacitor/commit/32ecf22de0a550756dbfa68b3b17c2333c89a430)) @@ -1662,13 +1671,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.2.0](https://github.com/ionic-team/capacitor/compare/3.1.2...3.2.0) (2021-08-18) -### Bug Fixes +## Bug Fixes - **android:** Don't inject map files into capacitor script ([#4893](https://github.com/ionic-team/capacitor/issues/4893)) ([992bebc](https://github.com/ionic-team/capacitor/commit/992bebce5a54128ec09b4905c4424fbe392719be)) - **cli:** Put cordova git pod dependencies in Podfile ([#4940](https://github.com/ionic-team/capacitor/issues/4940)) ([642dbf4](https://github.com/ionic-team/capacitor/commit/642dbf433e22bb695e5f782bd685de42eb2afada)) - **cli:** Separate Swift plugins from ObjC plugins ([#4925](https://github.com/ionic-team/capacitor/issues/4925)) ([43ce803](https://github.com/ionic-team/capacitor/commit/43ce803975ccd66823aab1e8c0d44d0ca81c6b2f)) -### Features +## Features - **core:** implement CapacitorCustomPlatform for 3rd party platforms ([#4771](https://github.com/ionic-team/capacitor/issues/4771)) ([12c6294](https://github.com/ionic-team/capacitor/commit/12c6294b9eb82976b1322f00da9ba5a6004f7977)) @@ -1690,12 +1699,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.1.0](https://github.com/ionic-team/capacitor/compare/3.0.2...3.1.0) (2021-07-07) -### Bug Fixes +## Bug Fixes - **cli:** Don't error if there are no scripts ([#4763](https://github.com/ionic-team/capacitor/issues/4763)) ([dec3fb2](https://github.com/ionic-team/capacitor/commit/dec3fb285239912980f2abea1cf48c583da6a163)) - **ios:** isNewBinary is true if defaults have no stored versions ([#4779](https://github.com/ionic-team/capacitor/issues/4779)) ([bd86dbe](https://github.com/ionic-team/capacitor/commit/bd86dbeb74771ed201d0100773babf49e6764818)) -### Features +## Features - **cli:** Add hooks to call into npm scripts when capacitor commands run ([#4739](https://github.com/ionic-team/capacitor/issues/4739)) ([515230c](https://github.com/ionic-team/capacitor/commit/515230ccefec76d4b7ed03ef1122709d1b63b58a)) - **cli:** allow run command to use flavors ([#4782](https://github.com/ionic-team/capacitor/issues/4782)) ([05cb853](https://github.com/ionic-team/capacitor/commit/05cb8533d4479efd3dc823b18f48699302f462ba)) @@ -1727,13 +1736,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.4...3.0.0) (2021-05-18) -### Bug Fixes +## Bug Fixes - **cli:** create-react-app framework detection should not look for react-dev-utils ([#4585](https://github.com/ionic-team/capacitor/issues/4585)) ([9f7910e](https://github.com/ionic-team/capacitor/commit/9f7910ee39ea7721d01428ec65b3d101b8ba963e)) # [3.0.0-rc.4](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.3...3.0.0-rc.4) (2021-05-18) -### Features +## Features - **cli:** auto detect framework's webDir ([#4550](https://github.com/ionic-team/capacitor/issues/4550)) ([329448a](https://github.com/ionic-team/capacitor/commit/329448a26846b5167b16f9169d62a9ff61eef87d)) @@ -1743,19 +1752,19 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.1...3.0.0-rc.2) (2021-05-07) -### Bug Fixes +## Bug Fixes - **bridge:** Fix type errors with new Platforms API ([#4524](https://github.com/ionic-team/capacitor/issues/4524)) ([7bbaea8](https://github.com/ionic-team/capacitor/commit/7bbaea85494c53a950abab40bb77f37087e22abe)) - **bridge:** Safely JSON.Stringify circular json on log ([#4507](https://github.com/ionic-team/capacitor/issues/4507)) ([e4c8fe4](https://github.com/ionic-team/capacitor/commit/e4c8fe41ec3992df5c20e4d0d3b69240ce672e44)), closes [#4506](https://github.com/ionic-team/capacitor/issues/4506) - **ios:** Don't auto release saved calls ([#4535](https://github.com/ionic-team/capacitor/issues/4535)) ([4f76933](https://github.com/ionic-team/capacitor/commit/4f76933b98d0461564d3dca9b36d4ea1eba8ed49)) -### Features +## Features - **core:** platforms api ([#4255](https://github.com/ionic-team/capacitor/issues/4255)) ([7d62713](https://github.com/ionic-team/capacitor/commit/7d6271369cb15eeab07c0bc7f606de6447a17cd4)) # [3.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.0...3.0.0-rc.1) (2021-04-29) -### Bug Fixes +## Bug Fixes - generate Capacitor.Plugins object ([#4496](https://github.com/ionic-team/capacitor/issues/4496)) ([1c71b7a](https://github.com/ionic-team/capacitor/commit/1c71b7adb2c325e34d980dbf578dc22afb2c332b)) - **android:** Release the call after reject/resolve ([#4318](https://github.com/ionic-team/capacitor/issues/4318)) ([a9f30a8](https://github.com/ionic-team/capacitor/commit/a9f30a88bf3cf239a59c4e901e2a9a2a141a9044)) @@ -1769,7 +1778,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** fire resume/pause events if no cordova plugins installed ([#4467](https://github.com/ionic-team/capacitor/issues/4467)) ([0105f7a](https://github.com/ionic-team/capacitor/commit/0105f7a2c68f2e7bec16ca23384b6acbb2f3057b)) - **ios:** put cancel button of confirm/prompt on the left ([#4464](https://github.com/ionic-team/capacitor/issues/4464)) ([e5b53aa](https://github.com/ionic-team/capacitor/commit/e5b53aa687a70938994802c7b1367cfcbb1e3811)) -### Features +## Features - Unify logging behavior across environments ([#4416](https://github.com/ionic-team/capacitor/issues/4416)) ([bae0f3d](https://github.com/ionic-team/capacitor/commit/bae0f3d2cee84978636d0f589bc7e2f745671baf)) - **android:** ability to add listeners to the Capacitor WebView ([#4405](https://github.com/ionic-team/capacitor/issues/4405)) ([7bdcc15](https://github.com/ionic-team/capacitor/commit/7bdcc15a20248fc17b5867b215bba0c43e29b2c0)) @@ -1778,13 +1787,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-rc.0](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.6...3.0.0-rc.0) (2021-03-10) -### Bug Fixes +## Bug Fixes - **android:** calls re-saved during permission/activity result callbacks were being released ([502a2d1](https://github.com/ionic-team/capacitor/commit/502a2d18ddce870f4caf810b405f7363f2340067)) - **android:** live reload not working when using adb reverse ([362f221](https://github.com/ionic-team/capacitor/commit/362f2219767a5f28e3ce1f6857a0e20024adc6b6)) - **cli:** Make tests work on npm 7 ([#4297](https://github.com/ionic-team/capacitor/issues/4297)) ([676c907](https://github.com/ionic-team/capacitor/commit/676c907c7ce84fdc57d00152024144a74d24b137)) -### Features +## Features - **android:** add configurable app path for embedded capacitor ([#4264](https://github.com/ionic-team/capacitor/issues/4264)) ([e433691](https://github.com/ionic-team/capacitor/commit/e43369144f7f378edc4f5d4f8dbbafe6cff6a70d)) - **android:** Unifying saving plugin calls ([#4254](https://github.com/ionic-team/capacitor/issues/4254)) ([a648c51](https://github.com/ionic-team/capacitor/commit/a648c51588627404b5ad30c35943fed18af4a546)) @@ -1801,25 +1810,25 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-beta.4](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.3...3.0.0-beta.4) (2021-02-26) -### Bug Fixes +## Bug Fixes - **cli:** init failure if config.xml is present ([#4227](https://github.com/ionic-team/capacitor/issues/4227)) ([f1703dc](https://github.com/ionic-team/capacitor/commit/f1703dcb3ebaa83df9f2b72ca00eb6721e96dfd9)) # [3.0.0-beta.3](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.2...3.0.0-beta.3) (2021-02-18) -### Bug Fixes +## Bug Fixes - **cli:** do not error if webDir is missing when adding platforms ([#4215](https://github.com/ionic-team/capacitor/issues/4215)) ([4583add](https://github.com/ionic-team/capacitor/commit/4583add61f5f7ac60de8722664811d96d4095459)) - **core:** do not add window.cordova on web apps ([#4214](https://github.com/ionic-team/capacitor/issues/4214)) ([6d673ef](https://github.com/ionic-team/capacitor/commit/6d673ef7076f00c37eac0f801c4c487415df6d4d)) -### Features +## Features - **cli:** do not require webDir when server.url is set ([#4200](https://github.com/ionic-team/capacitor/issues/4200)) ([91ddfbd](https://github.com/ionic-team/capacitor/commit/91ddfbd3cd1f598906b2ddc5cab8904420f231f6)) - **iOS:** Add automatic Date serialization to bridge communication ([#4177](https://github.com/ionic-team/capacitor/issues/4177)) ([3dabc69](https://github.com/ionic-team/capacitor/commit/3dabc69eab1c8ce0b7734acb641b67d349ec3093)) # [3.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.1...3.0.0-beta.2) (2021-02-08) -### Bug Fixes +## Bug Fixes - **core:** handle js.error messages to fix window error handler ([#4124](https://github.com/ionic-team/capacitor/issues/4124)) ([c0deb1d](https://github.com/ionic-team/capacitor/commit/c0deb1de349f5631af08eecbffc0ea4dea97c60d)) - address bug in `isPluginAvailable()` for web and native ([#4114](https://github.com/ionic-team/capacitor/issues/4114)) ([2fbd954](https://github.com/ionic-team/capacitor/commit/2fbd95465a321b8f4c50d4daf22a63d8043cee9b)) @@ -1829,7 +1838,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **iOS:** preserve null values in bridged types ([#4072](https://github.com/ionic-team/capacitor/issues/4072)) ([6dc691e](https://github.com/ionic-team/capacitor/commit/6dc691e66a07a421d5d4b08028ea05a65b3ddd84)) - remove USE_PUSH flag and code from iOS template ([#4070](https://github.com/ionic-team/capacitor/issues/4070)) ([6d54243](https://github.com/ionic-team/capacitor/commit/6d54243108883e0b07d725dcc7a1cb8700f1b35e)) -### Features +## Features - **android:** activity result use new API and update permission result callbacks to match ([#4127](https://github.com/ionic-team/capacitor/issues/4127)) ([002f1e5](https://github.com/ionic-team/capacitor/commit/002f1e55173a50b9fe918b4eda73b5113b713282)) - **android:** androidxActivityVersion & androidxFragmentVersion gradle variables ([#4103](https://github.com/ionic-team/capacitor/issues/4103)) ([4f77b96](https://github.com/ionic-team/capacitor/commit/4f77b962be85fc6bfc555a106c5b3e6707526626)) @@ -1842,43 +1851,43 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.14...3.0.0-beta.0) (2021-01-13) -### Features +## Features - **core:** add commonjs output format ([#4064](https://github.com/ionic-team/capacitor/issues/4064)) ([74b7be8](https://github.com/ionic-team/capacitor/commit/74b7be89ef1bbf13ccd103410037cfe81c8fc124)) # [3.0.0-alpha.14](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.13...3.0.0-alpha.14) (2021-01-13) -### Bug Fixes +## Bug Fixes - **android:** append missing new lines on injected cordova files ([#4058](https://github.com/ionic-team/capacitor/issues/4058)) ([dbdc78d](https://github.com/ionic-team/capacitor/commit/dbdc78dc08e016dfbc2454d4f53a49f16f744b3e)) - **cli:** bump minimum node version to 12.4.0 ([#4059](https://github.com/ionic-team/capacitor/issues/4059)) ([61e3be0](https://github.com/ionic-team/capacitor/commit/61e3be0c865a3591a0d6bcfc27d0bbb72ee98395)) - **cli:** default to new directory instead of crashing ([70fdf0b](https://github.com/ionic-team/capacitor/commit/70fdf0be0e0f06b4f20e20a3ae4bfef4de2374e9)) -### Features +## Features - **android:** method to check permission for an alias ([#4062](https://github.com/ionic-team/capacitor/issues/4062)) ([c88c4b4](https://github.com/ionic-team/capacitor/commit/c88c4b46b949a87c1b89476b75273adef725242b)) # [3.0.0-alpha.13](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.12...3.0.0-alpha.13) (2021-01-13) -### Bug Fixes +## Bug Fixes - **cli:** use stderr for logs when using --json option ([#4044](https://github.com/ionic-team/capacitor/issues/4044)) ([452a101](https://github.com/ionic-team/capacitor/commit/452a101648fe6da4232d18985c5d814920505920)) - **iOS:** properly handle date types during JSValue coercion ([#4043](https://github.com/ionic-team/capacitor/issues/4043)) ([1affae7](https://github.com/ionic-team/capacitor/commit/1affae7cf8d2f49681bf25be48633ab985bbd12f)) - **iOS:** skip Swift type coercion on Cordova plugin calls ([#4048](https://github.com/ionic-team/capacitor/issues/4048)) ([7bb9e0f](https://github.com/ionic-team/capacitor/commit/7bb9e0f22fdea369a6522c2d63a5b56baab9f5ca)) -### Features +## Features - **cli:** create TS configuration files in `init` ([#3999](https://github.com/ionic-team/capacitor/issues/3999)) ([fa7003e](https://github.com/ionic-team/capacitor/commit/fa7003e4ef1d988633abb85b1b109c51b94fda42)) # [3.0.0-alpha.12](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.11...3.0.0-alpha.12) (2021-01-08) -### Bug Fixes +## Bug Fixes - move `public` into iOS target directory ([#4002](https://github.com/ionic-team/capacitor/issues/4002)) ([4f41296](https://github.com/ionic-team/capacitor/commit/4f41296a109cf73fdf8e695849e95f292a543f85)) - **cli:** run an actual debug build for iOS ([#4014](https://github.com/ionic-team/capacitor/issues/4014)) ([dc6399c](https://github.com/ionic-team/capacitor/commit/dc6399cf0b5eb6afb50274a84dc71486cd3e4173)) - **core:** fix $$typeof() not implemented error ([#4013](https://github.com/ionic-team/capacitor/issues/4013)) ([c7f80b5](https://github.com/ionic-team/capacitor/commit/c7f80b577c1de60cd0a105f3aaf0d1c314f3150d)) -### Features +## Features - **android:** switch to new callback-style permission requests ([#4033](https://github.com/ionic-team/capacitor/issues/4033)) ([cc459de](https://github.com/ionic-team/capacitor/commit/cc459de7fc070c0227e066f3e8b92062728ab45d)) - **cli:** allow 'export default' style TS config files ([#4031](https://github.com/ionic-team/capacitor/issues/4031)) ([9393667](https://github.com/ionic-team/capacitor/commit/9393667bbe629d6c18a22b16fe3f3c6fe83e11f6)) @@ -1886,31 +1895,31 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.11](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.10...3.0.0-alpha.11) (2020-12-26) -### Features +## Features - **android:** expose CapConfig.loadDefault(), deprecate v2 constructor ([#3964](https://github.com/ionic-team/capacitor/issues/3964)) ([94ae977](https://github.com/ionic-team/capacitor/commit/94ae9774d2467fa7ba0336e7183f6d28cae45908)) - **iOS:** Open CAPBridgeViewController for subclassing ([#3973](https://github.com/ionic-team/capacitor/issues/3973)) ([a601705](https://github.com/ionic-team/capacitor/commit/a601705f8116ac10d1a0b5942511952c07cf474e)) # [3.0.0-alpha.10](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.9...3.0.0-alpha.10) (2020-12-15) -### Bug Fixes +## Bug Fixes - **android:** include lint.xml for downstream lint tasks ([efa72f3](https://github.com/ionic-team/capacitor/commit/efa72f38c5f64d3b91cc4c4c7d4d87ab38219893)) # [3.0.0-alpha.9](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.8...3.0.0-alpha.9) (2020-12-15) -### Bug Fixes +## Bug Fixes - **android:** include lint-baseline.xml for downstream lint tasks ([20ccaa0](https://github.com/ionic-team/capacitor/commit/20ccaa0311dcf8468019325ad976156d92ed0202)) # [3.0.0-alpha.8](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.7...3.0.0-alpha.8) (2020-12-15) -### Bug Fixes +## Bug Fixes - **Android:** Use plugin's getPermissionStates() to support overriding ([#3939](https://github.com/ionic-team/capacitor/issues/3939)) ([855a607](https://github.com/ionic-team/capacitor/commit/855a60711bcf6cff3215a36fac7e5314a2c4d159)) - **ios:** expose lastURL getter ([#3898](https://github.com/ionic-team/capacitor/issues/3898)) ([90b7fe3](https://github.com/ionic-team/capacitor/commit/90b7fe39f5a7cb9d584618a6fba66338f2bbf5fe)) -### Features +## Features - **android:** add onConfigurationChanged() activity lifecycle hook ([#3936](https://github.com/ionic-team/capacitor/issues/3936)) ([29e9e2c](https://github.com/ionic-team/capacitor/commit/29e9e2c5c30f23eb3ea2e88b1427eed0636e8125)) - **android:** Add WebColor utility for parsing color ([#3947](https://github.com/ionic-team/capacitor/issues/3947)) ([3746404](https://github.com/ionic-team/capacitor/commit/3746404240459ca9ea8175f2bb241d80746e8328)) @@ -1918,7 +1927,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.7](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.6...3.0.0-alpha.7) (2020-12-02) -### Bug Fixes +## Bug Fixes - **android:** dont release calls that are manually saved, eg listeners/watchers ([#3857](https://github.com/ionic-team/capacitor/issues/3857)) ([f1c8fe9](https://github.com/ionic-team/capacitor/commit/f1c8fe9e039d25eff2122fe915f17e84477427eb)) - **android:** fixed breaking change to `handleOnActivityResult` ([#3888](https://github.com/ionic-team/capacitor/issues/3888)) ([5fd60e6](https://github.com/ionic-team/capacitor/commit/5fd60e607b79b46cec08c6af1674305b1199d0a4)) @@ -1929,7 +1938,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **core:** export PermissionState ([#3775](https://github.com/ionic-team/capacitor/issues/3775)) ([2d5ac96](https://github.com/ionic-team/capacitor/commit/2d5ac963d131a704628f8a421be8429b9f63cf61)) - **ios:** share message handler between webview and bridge ([#3875](https://github.com/ionic-team/capacitor/issues/3875)) ([f7dff2e](https://github.com/ionic-team/capacitor/commit/f7dff2e661a54bee770940ee1ebd9eab6456ba2e)) -### Features +## Features - automatically import Android plugins ([#3788](https://github.com/ionic-team/capacitor/issues/3788)) ([aa1e1c6](https://github.com/ionic-team/capacitor/commit/aa1e1c604e260cc8babb0e7f5230f692bdcf6f09)) - **android:** Add handlePermissions function for plugins to call ([#3768](https://github.com/ionic-team/capacitor/issues/3768)) ([3a7e282](https://github.com/ionic-team/capacitor/commit/3a7e282a7515784dd343bbf1e3d52e0299bac887)) @@ -1948,11 +1957,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.6](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.5...3.0.0-alpha.6) (2020-10-30) -### Bug Fixes +## Bug Fixes - **android:** avoid crash on input file capture ([#3715](https://github.com/ionic-team/capacitor/issues/3715)) ([f502a99](https://github.com/ionic-team/capacitor/commit/f502a9964e28012980d636014043e86e918031d7)) -### Features +## Features - improve permissions ([eec61a6](https://github.com/ionic-team/capacitor/commit/eec61a6d8d8edfe94aea1a361787d1e6c736e20d)) - unified errors and error codes ([#3673](https://github.com/ionic-team/capacitor/issues/3673)) ([f9e0803](https://github.com/ionic-team/capacitor/commit/f9e08038aa88f7453e8235f380d2767a12a7a073)) @@ -1964,25 +1973,25 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.4](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.3...3.0.0-alpha.4) (2020-09-23) -### Features +## Features - **cli:** ability to specify custom platform directories ([#3565](https://github.com/ionic-team/capacitor/issues/3565)) ([c6eda55](https://github.com/ionic-team/capacitor/commit/c6eda55482ef56abdfe9a33444e828b771af9386)) # [3.0.0-alpha.3](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.2...3.0.0-alpha.3) (2020-09-15) -### Bug Fixes +## Bug Fixes - **android:** allow directories beginning with underscore in assets dir to be packaged ([c23d993](https://github.com/ionic-team/capacitor/commit/c23d99315acea2f0894e5ff8a08dd42a867b2982)) # [3.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.1...3.0.0-alpha.2) (2020-08-31) -### Features +## Features - Add extension for creating data from data url ([#3474](https://github.com/ionic-team/capacitor/issues/3474)) ([2909fd0](https://github.com/ionic-team/capacitor/commit/2909fd0ac0d9fdb2cdb7fd25e38742451aa05fb1)) # [3.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.0...3.0.0-alpha.1) (2020-08-21) -### Bug Fixes +## Bug Fixes - **cli:** update plugin template to compile using java 8 ([#3350](https://github.com/ionic-team/capacitor/issues/3350)) ([676917e](https://github.com/ionic-team/capacitor/commit/676917eb81580ea5327d496bd80986e68df6ad04)) - **core:** provide mock implementation for unimplemented platforms ([#3352](https://github.com/ionic-team/capacitor/issues/3352)) ([befe230](https://github.com/ionic-team/capacitor/commit/befe2300435dbd54b22882fb6586c722f5ef466d)) @@ -1990,14 +1999,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **core:** use own type for backButton event result ([#3348](https://github.com/ionic-team/capacitor/issues/3348)) ([05d0e45](https://github.com/ionic-team/capacitor/commit/05d0e457eb69d5d39c8bb1d0117bc3d31afdca93)) - **ios:** config bug from swiftlint refactor ([ace879f](https://github.com/ionic-team/capacitor/commit/ace879f42b19aa064efa80142c3783f736745344)) -### Features +## Features - **cli:** add fmt script to plugin template ([#3354](https://github.com/ionic-team/capacitor/issues/3354)) ([9ca1e72](https://github.com/ionic-team/capacitor/commit/9ca1e723334f5d21706a8586c11d73162b47a13a)) - **core:** add unsupported browser exception ([#3389](https://github.com/ionic-team/capacitor/issues/3389)) ([c51e8f8](https://github.com/ionic-team/capacitor/commit/c51e8f8960c795421b35ad1fdd1cd6afbd7a7dfc)) # [3.0.0-alpha.0](https://github.com/ionic-team/capacitor/compare/2.4.6...3.0.0-alpha.0) (2020-07-23) -### Features +## Features - **android:** add custom plugins to BridgeFragment ([#3280](https://github.com/ionic-team/capacitor/issues/3280)) ([d131a5f](https://github.com/ionic-team/capacitor/commit/d131a5fed2b9ae29b6952397ec2f81104545b749)) - **core:** add `registerPlugin` for importing from plugin packages ([#3305](https://github.com/ionic-team/capacitor/issues/3305)) ([95475cc](https://github.com/ionic-team/capacitor/commit/95475cceb4cbd5be2cc7e18f2cf3045eb6c6f7fd)) diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index a7b21affb..7940d2348 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -5,11 +5,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) -### Bug Fixes +## Bug Fixes - **cli:** support TypeScript 7 when loading capacitor.config.ts ([#8534](https://github.com/ionic-team/capacitor/issues/8534)) ([4c1c870](https://github.com/ionic-team/capacitor/commit/4c1c8709413b9c19b008c99122ca330cc3c90e6f)) -### Features +## Features - **cli:** add migrator functionality for adopting UIScene ([#8544](https://github.com/ionic-team/capacitor/issues/8544)) ([984fa85](https://github.com/ionic-team/capacitor/commit/984fa85ba0adab0aacf895aed6323bf4b503dccb)) @@ -26,11 +26,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) -### Bug Fixes +## Bug Fixes - **cli:** revert live reload config on failure ([#8485](https://github.com/ionic-team/capacitor/issues/8485)) ([1d031a4](https://github.com/ionic-team/capacitor/commit/1d031a4abec2c793079ba8897ad2e40c4cc6c7f9)) -### Features +## Features - **cli:** add experimental packageOptions ([#8471](https://github.com/ionic-team/capacitor/issues/8471)) ([258867b](https://github.com/ionic-team/capacitor/commit/258867b7bf37b1837b99b02ec9638e5a6df08d97)) - **cli:** capture ios_package_manager in telemetry ([#8482](https://github.com/ionic-team/capacitor/issues/8482)) ([b4b297a](https://github.com/ionic-team/capacitor/commit/b4b297a52f8732659662d5e5aaeff81c0f7d9835)) @@ -64,6 +64,364 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** check CAPACITOR_COCOAPODS_PATH in determinePackageManager ([#8407](https://github.com/ionic-team/capacitor/issues/8407)) ([acb64ab](https://github.com/ionic-team/capacitor/commit/acb64ab92a37ff53701cde453558e272e2e11eb6)) + +## [8.3.12](https://github.com/Cap-go/capacitor-plus/compare/8.3.11...8.3.12) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.11](https://github.com/Cap-go/capacitor-plus/compare/8.3.9...8.3.11) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.10](https://github.com/Cap-go/capacitor-plus/compare/8.3.9...8.3.10) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.9](https://github.com/Cap-go/capacitor-plus/compare/8.3.8...8.3.9) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.8](https://github.com/Cap-go/capacitor-plus/compare/8.3.7...8.3.8) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.7](https://github.com/Cap-go/capacitor-plus/compare/8.3.6...8.3.7) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.6](https://github.com/Cap-go/capacitor-plus/compare/8.3.5...8.3.6) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.5](https://github.com/Cap-go/capacitor-plus/compare/8.3.4...8.3.5) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.3.4](https://github.com/Cap-go/capacitor-plus/compare/8.3.3...8.3.4) (2026-05-07) + + +### Bug Fixes + +* **cli:** link plugin dependencies in Package.swift ([#8457](https://github.com/Cap-go/capacitor-plus/issues/8457)) ([b3c769e](https://github.com/Cap-go/capacitor-plus/commit/b3c769e856c826b1174518877cf86ac7ce73bf09)) + + + + + +## [8.3.3](https://github.com/Cap-go/capacitor-plus/compare/8.3.2...8.3.3) (2026-05-06) + + +### Bug Fixes + +* **cli:** generate resource entries in Package.swift ([#8455](https://github.com/Cap-go/capacitor-plus/issues/8455)) ([790bd27](https://github.com/Cap-go/capacitor-plus/commit/790bd27123497111984227010c3162cec94a108e)) + + + + + +## [8.3.2](https://github.com/Cap-go/capacitor-plus/compare/8.0.8...8.3.2) (2026-05-05) + + +### Bug Fixes + +* address follow-up review comments ([8bee786](https://github.com/Cap-go/capacitor-plus/commit/8bee786e2c68ca6c351e88f104b518291c1f81e3)) +* **cli:** add cSettings support for compiler flags in generated Package.swift ([#8448](https://github.com/Cap-go/capacitor-plus/issues/8448)) ([0bd0676](https://github.com/Cap-go/capacitor-plus/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0)) +* **cli:** add system framework and weak framework support in SPM Package.swift ([#8447](https://github.com/Cap-go/capacitor-plus/issues/8447)) ([3232f0f](https://github.com/Cap-go/capacitor-plus/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8)) +* **cli:** Allow to run update on non macOS ([#8344](https://github.com/Cap-go/capacitor-plus/issues/8344)) ([a441280](https://github.com/Cap-go/capacitor-plus/commit/a441280d7c6b310ca516d6fb2736c09525987774)) +* **cli:** check CAPACITOR_COCOAPODS_PATH in determinePackageManager ([#8407](https://github.com/Cap-go/capacitor-plus/issues/8407)) ([acb64ab](https://github.com/Cap-go/capacitor-plus/commit/acb64ab92a37ff53701cde453558e272e2e11eb6)) +* **cli:** correct Capacitor plugin SPM compat check ([#8440](https://github.com/Cap-go/capacitor-plus/issues/8440)) ([e5ccc45](https://github.com/Cap-go/capacitor-plus/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb)) +* **cli:** Don't overwrite config.server section with `--live-reload` ([#7528](https://github.com/Cap-go/capacitor-plus/issues/7528)) ([782b9d9](https://github.com/Cap-go/capacitor-plus/commit/782b9d9c26dcf1282b918996becb0224c0baca1d)) +* **cli:** generate binaryTarget entries for custom xcframeworks in Package.swift ([#8445](https://github.com/Cap-go/capacitor-plus/issues/8445)) ([1f7e33f](https://github.com/Cap-go/capacitor-plus/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d)) +* **cli:** handle Cordova plugins without iOS source files ([#8443](https://github.com/Cap-go/capacitor-plus/issues/8443)) ([0da130e](https://github.com/Cap-go/capacitor-plus/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3)) +* **cli:** inline CSS sourcemaps in addition to JS sourcemaps ([#8377](https://github.com/Cap-go/capacitor-plus/issues/8377)) ([69476ab](https://github.com/Cap-go/capacitor-plus/commit/69476ab9c0b47911a14d2482cab53a877a5ae784)) +* **cli:** Update tar package ([#8311](https://github.com/Cap-go/capacitor-plus/issues/8311)) ([0969c5c](https://github.com/Cap-go/capacitor-plus/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) +* **ios:** support Cordova plugins with Package.swift ([#8438](https://github.com/Cap-go/capacitor-plus/issues/8438)) ([139943b](https://github.com/Cap-go/capacitor-plus/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf)) +* resolve upstream sync conflicts ([75cbb30](https://github.com/Cap-go/capacitor-plus/commit/75cbb3097a7068bcb37313cbe6301628079101ca)) +* **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/Cap-go/capacitor-plus/issues/8384)) ([4e99598](https://github.com/Cap-go/capacitor-plus/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) + + +### Features + +* **cli:** Add --https option for --live-reload ([#8194](https://github.com/Cap-go/capacitor-plus/issues/8194)) ([5db81e6](https://github.com/Cap-go/capacitor-plus/commit/5db81e68c67652e9d2b29d7ad30629b423d2ad30)) +* **cli:** Add packageManager to iOS config ([#8321](https://github.com/Cap-go/capacitor-plus/issues/8321)) ([a125498](https://github.com/Cap-go/capacitor-plus/commit/a1254983bbb9dcb273d93f3c5f639b792e516406)) +* **cli:** Experimental config for swift-tools-version in SPM apps ([#8372](https://github.com/Cap-go/capacitor-plus/issues/8372)) ([d2ee84f](https://github.com/Cap-go/capacitor-plus/commit/d2ee84f8186909b142b418c02fc19f79d3c6a6ed)) +* **cli:** support SPM package traits in generated Package.swift ([#8351](https://github.com/Cap-go/capacitor-plus/issues/8351)) ([27e6aa8](https://github.com/Cap-go/capacitor-plus/commit/27e6aa89cf22e0b1a6d46710faed9aa8899600b0)) + + +### Reverts + +* revert version bump from [#8319](https://github.com/Cap-go/capacitor-plus/issues/8319) and [#8320](https://github.com/Cap-go/capacitor-plus/issues/8320) ([a48ebb6](https://github.com/Cap-go/capacitor-plus/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + + + + + +## [8.0.8](https://github.com/Cap-go/capacitor-plus/compare/8.0.7...8.0.8) (2026-04-08) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.0.7](https://github.com/Cap-go/capacitor-plus/compare/8.0.6...8.0.7) (2026-01-12) + +**Note:** Version bump only for package @capacitor-plus/cli + + + + + +## [8.0.6](https://github.com/Cap-go/capacitor-plus/compare/8.0.5...8.0.6) (2026-01-09) + + +### Bug Fixes + +* **cli:** Support wireless iOS devices in `cap run` ([#8301](https://github.com/Cap-go/capacitor-plus/issues/8301)) ([dcb368c](https://github.com/Cap-go/capacitor-plus/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) + + + + + +## [8.0.5](https://github.com/Cap-go/capacitor-plus/compare/8.0.4...8.0.5) (2026-01-08) + + +### Bug Fixes + +* **cli:** use latest native-run ([#8296](https://github.com/Cap-go/capacitor-plus/issues/8296)) ([121d830](https://github.com/Cap-go/capacitor-plus/commit/121d83013f39e25009121533a2c3ad86e428d6b2)) + + + + + +## [8.0.4](https://github.com/Cap-go/capacitor-plus/compare/8.0.3...8.0.4) (2025-12-16) + + +### Features + +* enhance package resolution by adding fallbacks for Capacitor packages ([7a03a14](https://github.com/Cap-go/capacitor-plus/commit/7a03a14fdf223088594b45f5ddeca29306eab3c6)) + + + + + +## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16) + + +### Bug Fixes + +* update homepage URL in package.json files for all platforms ([61ccdc4](https://github.com/Cap-go/capacitor-plus/commit/61ccdc4128a1ce2a7178eb0a195b188876ec0a9d)) + + + + + +## [8.0.2](https://github.com/Cap-go/capacitor-plus/compare/8.0.1...8.0.2) (2025-12-16) + + +### Features + +* add new workflows for testing and version bumping; update README files for all packages ([a01c2a8](https://github.com/Cap-go/capacitor-plus/commit/a01c2a842c363c2aa58e5681210fa62fac8e5de5)) + + + + + +## [8.0.1](https://github.com/Cap-go/capacitor-plus/compare/3.3.4...8.0.1) (2025-12-16) + +### Bug Fixes + +- add error code checking to `runPlatformHook` ([#7994](https://github.com/Cap-go/capacitor-plus/issues/7994)) ([8717680](https://github.com/Cap-go/capacitor-plus/commit/871768049187afe9f5d358d3fe08b6f18f70533e)) +- allow double quotes in Gemfile ([#6903](https://github.com/Cap-go/capacitor-plus/issues/6903)) ([3abdbed](https://github.com/Cap-go/capacitor-plus/commit/3abdbed38844d5d59d244f6f0dfc2647f29ce446)) +- **android:** add command not changing namespace ([#8224](https://github.com/Cap-go/capacitor-plus/issues/8224)) ([60cf666](https://github.com/Cap-go/capacitor-plus/commit/60cf66675159fb09cd41c94ce657202d01e05c74)) +- **android:** compatibility with cordova kotlin plugins ([#5438](https://github.com/Cap-go/capacitor-plus/issues/5438)) ([55bf004](https://github.com/Cap-go/capacitor-plus/commit/55bf004897b3feb280ab6b6575d2a2c1a0a183e2)) +- **android:** move initialFocus on webview into config ([#5579](https://github.com/Cap-go/capacitor-plus/issues/5579)) ([8b4e861](https://github.com/Cap-go/capacitor-plus/commit/8b4e861514b0fbe08e9296f49c280234f54742e1)) +- check for android and JDK ([#6554](https://github.com/Cap-go/capacitor-plus/issues/6554)) ([ddcc818](https://github.com/Cap-go/capacitor-plus/commit/ddcc818e828b290459d3ddffe9102fc312139823)) +- **cli/cordova:** Exclude private framework Headers ([#6229](https://github.com/Cap-go/capacitor-plus/issues/6229)) ([6c2726d](https://github.com/Cap-go/capacitor-plus/commit/6c2726dc0817c9e57c8b7909e4a69a9b376c425d)) +- **cli/ios:** Read handleApplicationNotifications configuration option ([#6030](https://github.com/Cap-go/capacitor-plus/issues/6030)) ([99ccf18](https://github.com/Cap-go/capacitor-plus/commit/99ccf181f6ee8a00ed97bdbf9076e2b2ea27cd57)) +- **cli:** add vite config to framework detection ([#6039](https://github.com/Cap-go/capacitor-plus/issues/6039)) ([3796d42](https://github.com/Cap-go/capacitor-plus/commit/3796d42665f3150f99c761aa561a9e34d03cae28)) +- **cli:** adjust SPM parameters for build and run commands ([#7342](https://github.com/Cap-go/capacitor-plus/issues/7342)) ([02f8983](https://github.com/Cap-go/capacitor-plus/commit/02f8983300c102125db6b41b0bb174fe41e1785b)) +- **cli:** also generate packageClassList on copy ([#7358](https://github.com/Cap-go/capacitor-plus/issues/7358)) ([865cceb](https://github.com/Cap-go/capacitor-plus/commit/865cceb1bf7e1b973e8f83f3c77040add71b403c)) +- **cli:** Also update preferences plugin if present ([#5831](https://github.com/Cap-go/capacitor-plus/issues/5831)) ([b9d5954](https://github.com/Cap-go/capacitor-plus/commit/b9d5954ca0b333f2caa20179b96b049379860ea5)) +- **cli:** Android apk name multi flavor dimensions parsing ([#7598](https://github.com/Cap-go/capacitor-plus/issues/7598)) ([2dc20ee](https://github.com/Cap-go/capacitor-plus/commit/2dc20ee894c2f5761431caa8269e9f418fc222b6)) +- **cli:** apkName for multi-dimensional flavors ([#6704](https://github.com/Cap-go/capacitor-plus/issues/6704)) ([d7b23f2](https://github.com/Cap-go/capacitor-plus/commit/d7b23f21c554c94029b24d6e0c9ad4635f055759)) +- **cli:** Attempt to verify non-cjs modules exist if cjs resolution fails ([#7310](https://github.com/Cap-go/capacitor-plus/issues/7310)) ([663e7b3](https://github.com/Cap-go/capacitor-plus/commit/663e7b383be0ceee1d23b929ceb6374d00faf011)) +- **cli:** Avoid duplicate entries in packageClassList ([#7470](https://github.com/Cap-go/capacitor-plus/issues/7470)) ([cca0b80](https://github.com/Cap-go/capacitor-plus/commit/cca0b805291bd002c515be0a1c15de84ee23c5d3)) +- **cli:** Avoid infinite loop in namespace migration ([#6551](https://github.com/Cap-go/capacitor-plus/issues/6551)) ([d3aacde](https://github.com/Cap-go/capacitor-plus/commit/d3aacdeb0c86d3941464954e7d1f582e405be489)) +- **cli:** avoid srcFiles is not iterable on kotlinNeededCheck ([#5481](https://github.com/Cap-go/capacitor-plus/issues/5481)) ([3c2b579](https://github.com/Cap-go/capacitor-plus/commit/3c2b579c6edb1fc69d85689b268eb92067b7821b)) +- **cli:** Better error on gradlew permission problems ([#5405](https://github.com/Cap-go/capacitor-plus/issues/5405)) ([9420f08](https://github.com/Cap-go/capacitor-plus/commit/9420f08dedad78cfaa5500cccf8bdbf1a9140684)) +- **cli:** calculate padding of super.onCreate(savedInstanceState); line ([#6016](https://github.com/Cap-go/capacitor-plus/issues/6016)) ([5729ac1](https://github.com/Cap-go/capacitor-plus/commit/5729ac19e7880713ec52bac431a2756da5aa3109)) +- **cli:** Change Capacitor plugin files check ([#7375](https://github.com/Cap-go/capacitor-plus/issues/7375)) ([fbfb778](https://github.com/Cap-go/capacitor-plus/commit/fbfb77825fdd3343e85868ea28b8e14a482dcf4a)) +- **cli:** change SPM incompatible plugin message ([#8129](https://github.com/Cap-go/capacitor-plus/issues/8129)) ([28c2a96](https://github.com/Cap-go/capacitor-plus/commit/28c2a96d898b07a05ae763f798e8903601cc3f67)) +- **cli:** config file android release type not overridden ([#6205](https://github.com/Cap-go/capacitor-plus/issues/6205)) ([1441c55](https://github.com/Cap-go/capacitor-plus/commit/1441c551737ce42dd2b82fc1a9da1e8311e27f1a)) +- **cli:** correct build path for non flavor builds ([#7281](https://github.com/Cap-go/capacitor-plus/issues/7281)) ([0f9651d](https://github.com/Cap-go/capacitor-plus/commit/0f9651d99cdd9cb463e494ed016838cd6d4a34c4)) +- **cli:** correct migration of package from AndroidManifest.xml to build.gradle ([#6607](https://github.com/Cap-go/capacitor-plus/issues/6607)) ([1c26a3e](https://github.com/Cap-go/capacitor-plus/commit/1c26a3e57f356a0972bd43854ca86770a49f2d63)) +- **cli:** correct rimraf import ([#7811](https://github.com/Cap-go/capacitor-plus/issues/7811)) ([0891624](https://github.com/Cap-go/capacitor-plus/commit/0891624c46b78a0fd39f617f834d5cdd1f54f5e6)) +- **cli:** Correct Splash theme update ([#5805](https://github.com/Cap-go/capacitor-plus/issues/5805)) ([25b82a8](https://github.com/Cap-go/capacitor-plus/commit/25b82a84425bf09b2be45b213788b0e13982b9b3)) +- **cli:** correctly build and sign Android apps using Flavors ([#7082](https://github.com/Cap-go/capacitor-plus/issues/7082)) ([7d3a99d](https://github.com/Cap-go/capacitor-plus/commit/7d3a99d15ba024b4bde9e698e57937002da38bd4)) +- **cli:** Don't add google-services plugin if missing ([#5825](https://github.com/Cap-go/capacitor-plus/issues/5825)) ([48ff9e6](https://github.com/Cap-go/capacitor-plus/commit/48ff9e6461e8037a5c6da87c90efc6bc872d7f08)) +- **cli:** Don't downgrade deployment target on migrate ([#7953](https://github.com/Cap-go/capacitor-plus/issues/7953)) ([46e8792](https://github.com/Cap-go/capacitor-plus/commit/46e87925b675933b413737854b1376eb1c71a23e)) +- **cli:** Don't downgrade gradle version on migrate ([#7385](https://github.com/Cap-go/capacitor-plus/issues/7385)) ([c79211e](https://github.com/Cap-go/capacitor-plus/commit/c79211ec9dde81a57aca5cee8ab09cdef0c9ad86)) +- **cli:** Don't exclude Cordova plugins from SPM management ([#8140](https://github.com/Cap-go/capacitor-plus/issues/8140)) ([69bbd3d](https://github.com/Cap-go/capacitor-plus/commit/69bbd3dc59cd6f56252c06f23b351952af8661be)) +- **cli:** Don't migrate Podfile on SPM projects ([#7939](https://github.com/Cap-go/capacitor-plus/issues/7939)) ([ab4e700](https://github.com/Cap-go/capacitor-plus/commit/ab4e700035289f445668dfd2f86278ffc71ab269)) +- **cli:** don't run bundle if not installed ([#7896](https://github.com/Cap-go/capacitor-plus/issues/7896)) ([ee55f6c](https://github.com/Cap-go/capacitor-plus/commit/ee55f6c54639c1a61fa4f9eed1f366ba2d968b86)) +- **cli:** Don't succeed migration if npm install failed ([#6595](https://github.com/Cap-go/capacitor-plus/issues/6595)) ([6843d96](https://github.com/Cap-go/capacitor-plus/commit/6843d9642fad9a322579cbe5f01563929a83dbf5)) +- **cli:** enable cleartext for live reload ([#7563](https://github.com/Cap-go/capacitor-plus/issues/7563)) ([e06648f](https://github.com/Cap-go/capacitor-plus/commit/e06648f4566c0b80ab420f977e02f1b4cd73fc1f)) +- **cli:** ensures the execution order of CLI hooks ([#7947](https://github.com/Cap-go/capacitor-plus/issues/7947)) ([c3ea809](https://github.com/Cap-go/capacitor-plus/commit/c3ea8094cdd385ac02a5aae89f8b44b6c53d493a)) +- **cli:** Find the Info.plist when using scheme ([#5914](https://github.com/Cap-go/capacitor-plus/issues/5914)) ([f7029ac](https://github.com/Cap-go/capacitor-plus/commit/f7029acb885ec60f85a434b6f71e4f2a633c7651)) +- **cli:** fix cap run command for yarn pnp mode ([#7754](https://github.com/Cap-go/capacitor-plus/issues/7754)) ([79ace5c](https://github.com/Cap-go/capacitor-plus/commit/79ace5c7054d86d5b33ce325751ff738c63d4b0c)) +- **cli:** Fix cordova plugin config checker over checking 5.x ([#6444](https://github.com/Cap-go/capacitor-plus/issues/6444)) ([9d21a0e](https://github.com/Cap-go/capacitor-plus/commit/9d21a0e363141fa0792c12d977b13692be67cf6d)) +- **cli:** flavor flag not using correct apk ([#6151](https://github.com/Cap-go/capacitor-plus/issues/6151)) ([f4e7f19](https://github.com/Cap-go/capacitor-plus/commit/f4e7f19f186e334404b2cd0decc3205e57bf4469)) +- **cli:** force latest native-run version for iOS 17 support ([#6926](https://github.com/Cap-go/capacitor-plus/issues/6926)) ([7e7c8b9](https://github.com/Cap-go/capacitor-plus/commit/7e7c8b9113f541d530c5883dea1f52b2957c0859)) +- **cli:** handle unrecognized java --version ([#6577](https://github.com/Cap-go/capacitor-plus/issues/6577)) ([56b0037](https://github.com/Cap-go/capacitor-plus/commit/56b0037a70d64019563b6e55e53de423f471fe2f)) +- **cli:** install minor Capacitor 5 version ([#6562](https://github.com/Cap-go/capacitor-plus/issues/6562)) ([f4af0a2](https://github.com/Cap-go/capacitor-plus/commit/f4af0a298fb5a5f8257f175327058341a230ae4f)) +- **cli:** make Cordova plugins use same default kotlin version as Capacitor ([#7752](https://github.com/Cap-go/capacitor-plus/issues/7752)) ([a4aeb55](https://github.com/Cap-go/capacitor-plus/commit/a4aeb55720ecc83b3870bf32bf9825d6aee4644f)) +- **cli:** make migrate not error if there are no dependencies ([#6707](https://github.com/Cap-go/capacitor-plus/issues/6707)) ([25ca83a](https://github.com/Cap-go/capacitor-plus/commit/25ca83a8a76fe0eaf73c0db24fd950b33fd16063)) +- **cli:** make migrate update to 8.0.0 ([#8250](https://github.com/Cap-go/capacitor-plus/issues/8250)) ([ee8ba7b](https://github.com/Cap-go/capacitor-plus/commit/ee8ba7bbeeeef6db0461f7a59c91095fd7cbd78b)) +- **cli:** make migrator also update plugin variables ([#5871](https://github.com/Cap-go/capacitor-plus/issues/5871)) ([478d48c](https://github.com/Cap-go/capacitor-plus/commit/478d48c3e322cffc6f0ff7ce590b635de4b41279)) +- **cli:** Make migrator update gradle wrapper files ([#5910](https://github.com/Cap-go/capacitor-plus/issues/5910)) ([b8b9b1f](https://github.com/Cap-go/capacitor-plus/commit/b8b9b1f96249908435017eea6c427221f1971836)) +- **cli:** Make update from windows use proper paths on Podfile ([#5906](https://github.com/Cap-go/capacitor-plus/issues/5906)) ([c41d28f](https://github.com/Cap-go/capacitor-plus/commit/c41d28f8cc829c6bf69d776280c9f1fdba9f866f)) +- **cli:** Migrate more plugin variables ([#6552](https://github.com/Cap-go/capacitor-plus/issues/6552)) ([b7da5b9](https://github.com/Cap-go/capacitor-plus/commit/b7da5b988ce7da5ea3991eaec46b9e52ff3635f1)) +- **cli:** Migrate variables to newer dependency versions ([#7235](https://github.com/Cap-go/capacitor-plus/issues/7235)) ([aaf01ab](https://github.com/Cap-go/capacitor-plus/commit/aaf01ab938e02220d7e6b5cd9329baa3edd02b68)) +- **cli:** Migrator put registerPlugin before super.onCreate ([#5828](https://github.com/Cap-go/capacitor-plus/issues/5828)) ([8cd3373](https://github.com/Cap-go/capacitor-plus/commit/8cd3373133903f97a836fd6ac6b7ce4e1ba9317e)) +- **cli:** Move package to build.gradle in Capacitor plugins ([#6569](https://github.com/Cap-go/capacitor-plus/issues/6569)) ([8cb26cd](https://github.com/Cap-go/capacitor-plus/commit/8cb26cd97a4f9cf59abb6b3828a07555a6af0b15)) +- **cli:** Pin @ionic/utils-subprocess version ([#7057](https://github.com/Cap-go/capacitor-plus/issues/7057)) ([0ac019a](https://github.com/Cap-go/capacitor-plus/commit/0ac019a36070b4cb9917a82e406453169c7d5559)) +- **cli:** point build to proper workspace name ([#6371](https://github.com/Cap-go/capacitor-plus/issues/6371)) ([78b7a59](https://github.com/Cap-go/capacitor-plus/commit/78b7a591429b5fc1dc7bf87e06e9a1afd3599408)) +- **cli:** prefer studio executable over studio.sh on linux if available ([#8110](https://github.com/Cap-go/capacitor-plus/issues/8110)) ([62bd16f](https://github.com/Cap-go/capacitor-plus/commit/62bd16f675cb492b52c0b73483fddfd63c608189)) +- **cli:** prevent error on manifest element without children ([#6278](https://github.com/Cap-go/capacitor-plus/issues/6278)) ([a7e374f](https://github.com/Cap-go/capacitor-plus/commit/a7e374fc4d834ded437edb4c8a0be98b6691be4c)) +- **cli:** prevent error on migrate when devDependencies is missing ([#5863](https://github.com/Cap-go/capacitor-plus/issues/5863)) ([474ad1f](https://github.com/Cap-go/capacitor-plus/commit/474ad1f4d4a9ea0636a457836c938dac9f6534e8)) +- **cli:** proper plugin module patch in monorepos ([#6589](https://github.com/Cap-go/capacitor-plus/issues/6589)) ([d49e632](https://github.com/Cap-go/capacitor-plus/commit/d49e6324ab5e0bea58ff6ca32feb7ea39d33a772)) +- **cli:** Remove buildOptions from platform capacitor.config.json ([#6292](https://github.com/Cap-go/capacitor-plus/issues/6292)) ([acddcd9](https://github.com/Cap-go/capacitor-plus/commit/acddcd95b40a7d4cc6c7682d2d1019f96dacf68d)) +- **cli:** remove certificate file extension check on copy ([#7240](https://github.com/Cap-go/capacitor-plus/issues/7240)) ([93a0044](https://github.com/Cap-go/capacitor-plus/commit/93a004473d7c4008bf02e8077460dfbdc3042312)) +- **cli:** remove double space in cap 2 variables file ([#5826](https://github.com/Cap-go/capacitor-plus/issues/5826)) ([7184097](https://github.com/Cap-go/capacitor-plus/commit/7184097da88ed34f3e754119f967d262aa5e2add)) +- **cli:** remove package related checks on doctor command ([#6773](https://github.com/Cap-go/capacitor-plus/issues/6773)) ([4499b6b](https://github.com/Cap-go/capacitor-plus/commit/4499b6bb6c52e9bc7fdfdb35ee2519881996eedf)) +- **cli:** Removing extra dash in android apk name flavor parsing ([#7382](https://github.com/Cap-go/capacitor-plus/issues/7382)) ([3c411fd](https://github.com/Cap-go/capacitor-plus/commit/3c411fd0a400b18c2d032e3b8be3fc4b5449bcbd)) +- **cli:** replace app-store deprecated method on build ([#7637](https://github.com/Cap-go/capacitor-plus/issues/7637)) ([942b108](https://github.com/Cap-go/capacitor-plus/commit/942b108c1d506539c0c53276ed4ec35eed36634e)) +- **cli:** Revert some splash migration errors ([#5806](https://github.com/Cap-go/capacitor-plus/issues/5806)) ([471feed](https://github.com/Cap-go/capacitor-plus/commit/471feedc07bef357ac798fcba664bd373e9f8ebf)) +- **cli:** Run sync before updating gradle ([#7497](https://github.com/Cap-go/capacitor-plus/issues/7497)) ([f27786e](https://github.com/Cap-go/capacitor-plus/commit/f27786ea1367bc0ec53697eeb6d654a7e12a1507)) +- **cli:** show error if npm install on migration failed ([#5904](https://github.com/Cap-go/capacitor-plus/issues/5904)) ([aa60a75](https://github.com/Cap-go/capacitor-plus/commit/aa60a75d9c2c784e127a4d89e4079b412fbe7262)) +- **cli:** signing type option issue ([#6716](https://github.com/Cap-go/capacitor-plus/issues/6716)) ([ee0f745](https://github.com/Cap-go/capacitor-plus/commit/ee0f7457e458ca4bb4eb74f67552ac2ace76016b)) +- **cli:** Specify keystore alias and alias password build options for apksigner ([#7073](https://github.com/Cap-go/capacitor-plus/issues/7073)) ([6612c49](https://github.com/Cap-go/capacitor-plus/commit/6612c49f5fde5ef2fee555206018391fc00e2be0)) +- **cli:** Support of BoM dependencies on cordova plugins ([#5827](https://github.com/Cap-go/capacitor-plus/issues/5827)) ([ea2d95b](https://github.com/Cap-go/capacitor-plus/commit/ea2d95ba43467cd2d4c4637aacab6bf655d9c596)) +- **cli:** support variables in config warn checks ([#6136](https://github.com/Cap-go/capacitor-plus/issues/6136)) ([b460add](https://github.com/Cap-go/capacitor-plus/commit/b460add5e22139f234ca8fae98f174bb7c447292)) +- **cli:** type only import in config ([#6765](https://github.com/Cap-go/capacitor-plus/issues/6765)) ([2b493ae](https://github.com/Cap-go/capacitor-plus/commit/2b493ae77b9ee6e5fbcb2fafb27bc04693d7e02b)) +- **cli:** unexpected error on target device list ([#8015](https://github.com/Cap-go/capacitor-plus/issues/8015)) ([f827c48](https://github.com/Cap-go/capacitor-plus/commit/f827c48f08b13a265e8671291c24f3506e14a094)) +- **cli:** Update gradle versions only if they are older ([#6015](https://github.com/Cap-go/capacitor-plus/issues/6015)) ([ae94101](https://github.com/Cap-go/capacitor-plus/commit/ae941017fff3bcfa75e0788535f356a56ce6fa05)) +- **cli:** update link to telemetry information ([e922e2b](https://github.com/Cap-go/capacitor-plus/commit/e922e2b718f5c6f2e4062cdccdeb92da3321e67d)) +- **cli:** Update migration link ([#6560](https://github.com/Cap-go/capacitor-plus/issues/6560)) ([e03062e](https://github.com/Cap-go/capacitor-plus/commit/e03062e6025fea0edfabbff2081b3f91017aece4)) +- **cli:** Update plugins with breaking changes ([#7148](https://github.com/Cap-go/capacitor-plus/issues/7148)) ([b8c2a92](https://github.com/Cap-go/capacitor-plus/commit/b8c2a92390f21fe653563d7bad73a3f2b5628acb)) +- **cli:** use correct pass signature for apksigner signing ([#7365](https://github.com/Cap-go/capacitor-plus/issues/7365)) ([e4f8610](https://github.com/Cap-go/capacitor-plus/commit/e4f86103c2806df4ca2729600361e6338c30f083)) +- **cli:** use helper in Podfile with correct path ([#6878](https://github.com/Cap-go/capacitor-plus/issues/6878)) ([8e95be9](https://github.com/Cap-go/capacitor-plus/commit/8e95be9f91169e258ab5cdd8fd673106392b8429)) +- **cli:** Use latest native-run ([#7023](https://github.com/Cap-go/capacitor-plus/issues/7023)) ([4125160](https://github.com/Cap-go/capacitor-plus/commit/412516069e15fbdbc17ad130c2f3a67891b6bc45)) +- **cli:** use proper build params ([#8016](https://github.com/Cap-go/capacitor-plus/issues/8016)) ([12ce2a4](https://github.com/Cap-go/capacitor-plus/commit/12ce2a486542011c8d6f4cd89a67464f3f27e28d)) +- **cli:** useLegacyBridge should be optional ([#6095](https://github.com/Cap-go/capacitor-plus/issues/6095)) ([20f68fe](https://github.com/Cap-go/capacitor-plus/commit/20f68feab2cb88cf8a79a987533839aa49255607)) +- **cli:** warns about config that is present ([#6060](https://github.com/Cap-go/capacitor-plus/issues/6060)) ([7ac43e7](https://github.com/Cap-go/capacitor-plus/commit/7ac43e722139a61129cfecf98da373659b1aeac8)) +- fallback to plain `pod` if `Gemfile` does not contain CocoaPods ([#6581](https://github.com/Cap-go/capacitor-plus/issues/6581)) ([3a41b4c](https://github.com/Cap-go/capacitor-plus/commit/3a41b4c1b70af7a45201fb11b04dc5558893aa7e)) +- generate correct SPM platforms iOS version ([ddde15c](https://github.com/Cap-go/capacitor-plus/commit/ddde15cd1387496389b2085f008dbe0223a9ae96)) +- improve readability of getMajorMinoriOSVersion function ([937ab97](https://github.com/Cap-go/capacitor-plus/commit/937ab977e4f5b24463ac7fc57d94c97b47eea94b)) +- inject cordova files if a cordova plugin is present ([#7363](https://github.com/Cap-go/capacitor-plus/issues/7363)) ([ce9d505](https://github.com/Cap-go/capacitor-plus/commit/ce9d50585b1cab183245197878bf625cf0289275)) +- iOS enum ([e78f602](https://github.com/Cap-go/capacitor-plus/commit/e78f602389ae23a2e68b205bfc216ef0eb7402a5)) +- **ios:** Make Bridge webView first responder ([#7753](https://github.com/Cap-go/capacitor-plus/issues/7753)) ([77e4668](https://github.com/Cap-go/capacitor-plus/commit/77e4668fa8dbb24b4561387e101547f74e37538e)) +- **ios:** Match CapApp-SPM iOS version with project version ([#7556](https://github.com/Cap-go/capacitor-plus/issues/7556)) ([df4dc9a](https://github.com/Cap-go/capacitor-plus/commit/df4dc9a17f1b999a68093091d201ba15d234c5f8)) +- make migrate use 7.0.0 ([#7837](https://github.com/Cap-go/capacitor-plus/issues/7837)) ([5dc309e](https://github.com/Cap-go/capacitor-plus/commit/5dc309ea8dd7905e9e6236744f29162df80b5ed8)) +- **migrate:** update install command suggestion to 'yarn add' ([d3c8f54](https://github.com/Cap-go/capacitor-plus/commit/d3c8f54e10236503ee59f17488d056af3392341d)) +- **spm:** add product lines to Package.swift ([#7278](https://github.com/Cap-go/capacitor-plus/issues/7278)) ([e45d60d](https://github.com/Cap-go/capacitor-plus/commit/e45d60d15445fa55320eb6274de67d4b4191f30a)) +- stop crashing from `objc_getClassList` ([#7187](https://github.com/Cap-go/capacitor-plus/issues/7187)) ([e148db7](https://github.com/Cap-go/capacitor-plus/commit/e148db7758e4186ad45fd74185a10fb757ff9b29)) +- support dependencies with ".swift" at the end of name ([#7583](https://github.com/Cap-go/capacitor-plus/issues/7583)) ([ceee68a](https://github.com/Cap-go/capacitor-plus/commit/ceee68a2db363e9d9a638aa4ed8569fd82d1013a)) +- Update migrate to Capacitor 6 ([#6872](https://github.com/Cap-go/capacitor-plus/issues/6872)) ([98eec8f](https://github.com/Cap-go/capacitor-plus/commit/98eec8fe9fd332d6669965fa5a21412233b3e06e)) +- update package references to use [@capacitor-plus](https://github.com/capacitor-plus) namespace ([6dd88e6](https://github.com/Cap-go/capacitor-plus/commit/6dd88e6c3101b3ab051dfc216a397bc1d1aca0f0)) +- use Capacitor 7 for SPM dependency ([#7835](https://github.com/Cap-go/capacitor-plus/issues/7835)) ([640c3cb](https://github.com/Cap-go/capacitor-plus/commit/640c3cb22a62e4b8fb13cd36031d39307622c60a)) + +### Features + +- Add global initialFocus configuration ([#7775](https://github.com/Cap-go/capacitor-plus/issues/7775)) ([61d0165](https://github.com/Cap-go/capacitor-plus/commit/61d01653685d8e3594d2d8a6bd870fa9643ba95c)) +- add livereload to run command ([#6831](https://github.com/Cap-go/capacitor-plus/issues/6831)) ([4099969](https://github.com/Cap-go/capacitor-plus/commit/4099969f70e9b995182bacecc16e160d89bbc746)) +- Add option for custom error page ([#5723](https://github.com/Cap-go/capacitor-plus/issues/5723)) ([e8bdef3](https://github.com/Cap-go/capacitor-plus/commit/e8bdef3b4634e4ad45fa8fc34c7c0ab8dfa383f3)) +- **android/cli:** Allow to use the old addJavascriptInterface bridge ([#6043](https://github.com/Cap-go/capacitor-plus/issues/6043)) ([a6e7c54](https://github.com/Cap-go/capacitor-plus/commit/a6e7c5422687b703492a5fcc49369eacc376143d)) +- **android:** add adjustMarginsForEdgeToEdge configuration option ([#7885](https://github.com/Cap-go/capacitor-plus/issues/7885)) ([1ea86d1](https://github.com/Cap-go/capacitor-plus/commit/1ea86d166afd315e72847c5e734a8c175fb90e04)) +- **android:** Add android.minWebviewVersion configuration option ([#5768](https://github.com/Cap-go/capacitor-plus/issues/5768)) ([ad83827](https://github.com/Cap-go/capacitor-plus/commit/ad838279e9cd190ce6f1a020a0ac9e3916786324)) +- **android:** Fix for [#6258](https://github.com/Cap-go/capacitor-plus/issues/6258), Add support for modern Huawei devices ([#6402](https://github.com/Cap-go/capacitor-plus/issues/6402)) ([17f2f4a](https://github.com/Cap-go/capacitor-plus/commit/17f2f4ac744a038c1dae3cbd74a670d5ede92ef3)) +- **android:** Improving SystemBars inset handling ([#8268](https://github.com/Cap-go/capacitor-plus/issues/8268)) ([81ae30a](https://github.com/Cap-go/capacitor-plus/commit/81ae30a503797e417dd125b06262dabc4696c88a)) +- **android:** update support for Portals for Capacitor to include Live Updates ([#5660](https://github.com/Cap-go/capacitor-plus/issues/5660)) ([62f0a5e](https://github.com/Cap-go/capacitor-plus/commit/62f0a5eaa40776aad79dbf8f8c0900037d3cc97e)) +- **android:** Use java 11 ([#5552](https://github.com/Cap-go/capacitor-plus/issues/5552)) ([e47959f](https://github.com/Cap-go/capacitor-plus/commit/e47959fcbd6a89b97b1275a5814fdb4e7ce30672)) +- better support monorepos ([#6811](https://github.com/Cap-go/capacitor-plus/issues/6811)) ([ae35e29](https://github.com/Cap-go/capacitor-plus/commit/ae35e29fb8c886dea867683a23a558d2d344073b)) +- Capacitor Cookies & Capacitor Http core plugins ([d4047cf](https://github.com/Cap-go/capacitor-plus/commit/d4047cfa947676777f400389a8d65defae140b45)) +- **cli:** Add --forwardPorts option to Capacitor CLI ([#5645](https://github.com/Cap-go/capacitor-plus/issues/5645)) ([2f04d29](https://github.com/Cap-go/capacitor-plus/commit/2f04d29a17eb46f9bd140b93e821e11380699367)) +- **cli:** add apksigner as a build option ([#6442](https://github.com/Cap-go/capacitor-plus/issues/6442)) ([9818a76](https://github.com/Cap-go/capacitor-plus/commit/9818a76ab4ea6660b444354f239344d37c77d3b3)) +- **cli:** add build command for android ([#5891](https://github.com/Cap-go/capacitor-plus/issues/5891)) ([6d4e620](https://github.com/Cap-go/capacitor-plus/commit/6d4e620308b6dd97376e3af7de1dd1a530083f1c)) +- **cli:** add build command for ios ([#5925](https://github.com/Cap-go/capacitor-plus/issues/5925)) ([8e8414f](https://github.com/Cap-go/capacitor-plus/commit/8e8414fa6f4ccb245576cc113eb969937613bbf7)) +- **cli:** add inline option to copy command ([#5901](https://github.com/Cap-go/capacitor-plus/issues/5901)) ([17fbabb](https://github.com/Cap-go/capacitor-plus/commit/17fbabb2a77d1b356d24048efc5883bd4d049104)) +- **cli:** add migrator for cap3 to cap4 ([#5762](https://github.com/Cap-go/capacitor-plus/issues/5762)) ([7cb660a](https://github.com/Cap-go/capacitor-plus/commit/7cb660a34d9a87274761d4492d0d77c9ef44ace8)) +- **cli:** Add missing Cap 4 to Cap 5 migration tasks ([#6453](https://github.com/Cap-go/capacitor-plus/issues/6453)) ([7dff363](https://github.com/Cap-go/capacitor-plus/commit/7dff36376d6efa6ea8793b81550979ee9254991b)) +- **cli:** add more configurations to build command ([#7769](https://github.com/Cap-go/capacitor-plus/issues/7769)) ([90f95d1](https://github.com/Cap-go/capacitor-plus/commit/90f95d1a829f3d87cb46af827b5bfaac319a9694)) +- **cli:** add npm update step to migrate ([#6462](https://github.com/Cap-go/capacitor-plus/issues/6462)) ([65520c3](https://github.com/Cap-go/capacitor-plus/commit/65520c36cdb4ac6f8811eb72624c447f2a0d884a)) +- **cli:** add scheme and flavor options to run command ([#5873](https://github.com/Cap-go/capacitor-plus/issues/5873)) ([e4c143d](https://github.com/Cap-go/capacitor-plus/commit/e4c143d4da653533570215964808c2f32f5469d3)) +- **cli:** add spm-migration-assistant command ([#7963](https://github.com/Cap-go/capacitor-plus/issues/7963)) ([ef42722](https://github.com/Cap-go/capacitor-plus/commit/ef427225f63056b1731b3cd8941aea2311d3bc4d)) +- **cli:** add ssl pinning copy logic ([#6312](https://github.com/Cap-go/capacitor-plus/issues/6312)) ([cce66c1](https://github.com/Cap-go/capacitor-plus/commit/cce66c1d59370ba35db879f4d7a3620d22175ab0)) +- **cli:** Add support for Android build `--flavor` ([#6437](https://github.com/Cap-go/capacitor-plus/issues/6437)) ([e91a8e7](https://github.com/Cap-go/capacitor-plus/commit/e91a8e795604042684ec9e20b620eee36e0dfda2)) +- **cli:** allow async in capacitor config file ([#4299](https://github.com/Cap-go/capacitor-plus/issues/4299)) ([5cecc3e](https://github.com/Cap-go/capacitor-plus/commit/5cecc3ee22868f9397792ec80a4b753a07b68f30)) +- **cli:** android manifest to build.gradle migration ([#6533](https://github.com/Cap-go/capacitor-plus/issues/6533)) ([245b6ab](https://github.com/Cap-go/capacitor-plus/commit/245b6ab85b0f481f08c21e25f2b2a7eb6da9996c)) +- **cli:** copy signature when using secure live updates ([#5896](https://github.com/Cap-go/capacitor-plus/issues/5896)) ([0f17177](https://github.com/Cap-go/capacitor-plus/commit/0f17177b1c64c0f69f86e990e4e150b820da497b)) +- **cli:** fail cap update on uninstalled cordova dependencies ([#8032](https://github.com/Cap-go/capacitor-plus/issues/8032)) ([b393de8](https://github.com/Cap-go/capacitor-plus/commit/b393de8bc9e68aff2cb70428a7c86c98367feade)) +- **cli:** Initial Cordova plugin SPM support ([#7999](https://github.com/Cap-go/capacitor-plus/issues/7999)) ([c030354](https://github.com/Cap-go/capacitor-plus/commit/c03035426343ddc4e303ca3420e476bb7f1e2201)) +- **cli:** Migrate update to gradle 8 ([#6530](https://github.com/Cap-go/capacitor-plus/issues/6530)) ([da3ac0e](https://github.com/Cap-go/capacitor-plus/commit/da3ac0e72c0559223e9b91f31830810d39638734)) +- **cli:** non interactive migrate ([#6461](https://github.com/Cap-go/capacitor-plus/issues/6461)) ([53dfeaf](https://github.com/Cap-go/capacitor-plus/commit/53dfeaf77ace5b165260b68351eae8e5bf72ea0a)) +- **cli:** Option to inline JS source maps during sync ([#5843](https://github.com/Cap-go/capacitor-plus/issues/5843)) ([7ce6dd4](https://github.com/Cap-go/capacitor-plus/commit/7ce6dd4b6fb5cdc395add6f656fbedc785178ae3)) +- **cli:** run plugin hooks ([#7499](https://github.com/Cap-go/capacitor-plus/issues/7499)) ([3b847ea](https://github.com/Cap-go/capacitor-plus/commit/3b847eac42673c812a4538c319b81c8f8afc9955)) +- **cli:** Select a cap run target by target name ([#8199](https://github.com/Cap-go/capacitor-plus/issues/8199)) ([b30c472](https://github.com/Cap-go/capacitor-plus/commit/b30c472490117a5dbb14a9556ef1b6ca6e39b45b)) +- **cli:** Support bun when running cap migrate ([#7386](https://github.com/Cap-go/capacitor-plus/issues/7386)) ([3f96ff9](https://github.com/Cap-go/capacitor-plus/commit/3f96ff911588c517dc2d924f55ef28a25c30bd33)) +- **cli:** support capacitor portals plugin changes needed ([#5558](https://github.com/Cap-go/capacitor-plus/issues/5558)) ([6810a19](https://github.com/Cap-go/capacitor-plus/commit/6810a19ae2bbda1f4b2afad61d37ca822ca157f5)) +- **cli:** supports secure live updates in Portals for Capacitor config ([#5955](https://github.com/Cap-go/capacitor-plus/issues/5955)) ([a309b45](https://github.com/Cap-go/capacitor-plus/commit/a309b455fdd190613353bdf0eb04469cf4aa6ccd)) +- **cli:** update init to set androidScheme to https ([#6342](https://github.com/Cap-go/capacitor-plus/issues/6342)) ([158b27e](https://github.com/Cap-go/capacitor-plus/commit/158b27e53fd803c87de32e8da9f0c5117f81a3a5)) +- **cli:** update migrate command for cap4 -> cap5 ([#6447](https://github.com/Cap-go/capacitor-plus/issues/6447)) ([b1f0a37](https://github.com/Cap-go/capacitor-plus/commit/b1f0a3744d3158dab083ea31ea3e747b937729d2)) +- expose `appStartPath` on cap config server configuration ([#8019](https://github.com/Cap-go/capacitor-plus/issues/8019)) ([a274fef](https://github.com/Cap-go/capacitor-plus/commit/a274fef069176a8e528a22f4734d1e29a539709c)) +- Implement automated upstream sync and review process for Capacitor+ ([54a5dfb](https://github.com/Cap-go/capacitor-plus/commit/54a5dfbd1f81ca4144e13b3051bf592d3aaf1f4a)) +- **ios:** Add Bundler support ([#5205](https://github.com/Cap-go/capacitor-plus/issues/5205)) ([f21c6d0](https://github.com/Cap-go/capacitor-plus/commit/f21c6d01fc30e46c151afc93da9727dbf6c9ddcf)) +- **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/Cap-go/capacitor-plus/issues/5583)) ([5b6dfa3](https://github.com/Cap-go/capacitor-plus/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475)) +- **ios:** add webContentsDebuggingEnabled configuration ([#6495](https://github.com/Cap-go/capacitor-plus/issues/6495)) ([c691e4a](https://github.com/Cap-go/capacitor-plus/commit/c691e4aecbfb7a45ce0465d1fe9020ab715815d3)) +- **iOS:** Allow plugins to hook into handling WebView URL authentication challenges ([#8216](https://github.com/Cap-go/capacitor-plus/issues/8216)) ([e8507cf](https://github.com/Cap-go/capacitor-plus/commit/e8507cfe4d93337ddee8ab6597aab5209ebb4858)) +- modify package.swift on update and sync ([#7042](https://github.com/Cap-go/capacitor-plus/issues/7042)) ([24573fb](https://github.com/Cap-go/capacitor-plus/commit/24573fb864c43551e2ce42721b45ff901155627d)) +- System Bars Plugin ([#8180](https://github.com/Cap-go/capacitor-plus/issues/8180)) ([a32216a](https://github.com/Cap-go/capacitor-plus/commit/a32216ac0607172a3a9c7ae5cdbfc598769294a6)) +- Upgrade to Typescript 5.x ([#6433](https://github.com/Cap-go/capacitor-plus/issues/6433)) ([88d0ded](https://github.com/Cap-go/capacitor-plus/commit/88d0ded9e7356531ffc4563b9b81a0f3f069484b)) + +## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) + +### Bug Fixes + +- **cli:** check CAPACITOR_COCOAPODS_PATH in determinePackageManager ([#8407](https://github.com/ionic-team/capacitor/issues/8407)) ([acb64ab](https://github.com/ionic-team/capacitor/commit/acb64ab92a37ff53701cde453558e272e2e11eb6)) + ## [8.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) ### Bug Fixes @@ -112,23 +470,23 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) -### Bug Fixes +## Bug Fixes - **cli:** Android apk name multi flavor dimensions parsing ([#7598](https://github.com/ionic-team/capacitor/issues/7598)) ([2dc20ee](https://github.com/ionic-team/capacitor/commit/2dc20ee894c2f5761431caa8269e9f418fc222b6)) - **cli:** make migrate update to 8.0.0 ([#8250](https://github.com/ionic-team/capacitor/issues/8250)) ([ee8ba7b](https://github.com/ionic-team/capacitor/commit/ee8ba7bbeeeef6db0461f7a59c91095fd7cbd78b)) -### Features +## Features - **android:** Improving SystemBars inset handling ([#8268](https://github.com/ionic-team/capacitor/issues/8268)) ([81ae30a](https://github.com/ionic-team/capacitor/commit/81ae30a503797e417dd125b06262dabc4696c88a)) # [8.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/8.0.0-alpha.3...8.0.0-beta.0) (2025-11-14) -### Bug Fixes +## Bug Fixes - **android:** add command not changing namespace ([#8224](https://github.com/ionic-team/capacitor/issues/8224)) ([60cf666](https://github.com/ionic-team/capacitor/commit/60cf66675159fb09cd41c94ce657202d01e05c74)) - **cli:** fix cap run command for yarn pnp mode ([#7754](https://github.com/ionic-team/capacitor/issues/7754)) ([79ace5c](https://github.com/ionic-team/capacitor/commit/79ace5c7054d86d5b33ce325751ff738c63d4b0c)) -### Features +## Features - **cli:** Select a cap run target by target name ([#8199](https://github.com/ionic-team/capacitor/issues/8199)) ([b30c472](https://github.com/ionic-team/capacitor/commit/b30c472490117a5dbb14a9556ef1b6ca6e39b45b)) - **iOS:** Allow plugins to hook into handling WebView URL authentication challenges ([#8216](https://github.com/ionic-team/capacitor/issues/8216)) ([e8507cf](https://github.com/ionic-team/capacitor/commit/e8507cfe4d93337ddee8ab6597aab5209ebb4858)) @@ -136,7 +494,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0-alpha.3](https://github.com/ionic-team/capacitor/compare/8.0.0-alpha.2...8.0.0-alpha.3) (2025-10-22) -### Bug Fixes +## Bug Fixes - **cli:** change SPM incompatible plugin message ([#8129](https://github.com/ionic-team/capacitor/issues/8129)) ([28c2a96](https://github.com/ionic-team/capacitor/commit/28c2a96d898b07a05ae763f798e8903601cc3f67)) - **cli:** Don't exclude Cordova plugins from SPM management ([#8140](https://github.com/ionic-team/capacitor/issues/8140)) ([69bbd3d](https://github.com/ionic-team/capacitor/commit/69bbd3dc59cd6f56252c06f23b351952af8661be)) @@ -160,14 +518,14 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.4.0](https://github.com/ionic-team/capacitor/compare/7.3.0...7.4.0) (2025-06-18) -### Features +## Features - **cli:** add spm-migration-assistant command ([#7963](https://github.com/ionic-team/capacitor/issues/7963)) ([ef42722](https://github.com/ionic-team/capacitor/commit/ef427225f63056b1731b3cd8941aea2311d3bc4d)) - **cli:** fail cap update on uninstalled cordova dependencies ([#8032](https://github.com/ionic-team/capacitor/issues/8032)) ([b393de8](https://github.com/ionic-team/capacitor/commit/b393de8bc9e68aff2cb70428a7c86c98367feade)) # [7.3.0](https://github.com/ionic-team/capacitor/compare/7.2.0...7.3.0) (2025-06-05) -### Bug Fixes +## Bug Fixes - add error code checking to `runPlatformHook` ([#7994](https://github.com/ionic-team/capacitor/issues/7994)) ([8717680](https://github.com/ionic-team/capacitor/commit/871768049187afe9f5d358d3fe08b6f18f70533e)) - **cli:** Don't downgrade deployment target on migrate ([#7953](https://github.com/ionic-team/capacitor/issues/7953)) ([46e8792](https://github.com/ionic-team/capacitor/commit/46e87925b675933b413737854b1376eb1c71a23e)) @@ -175,24 +533,24 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** unexpected error on target device list ([#8015](https://github.com/ionic-team/capacitor/issues/8015)) ([f827c48](https://github.com/ionic-team/capacitor/commit/f827c48f08b13a265e8671291c24f3506e14a094)) - **cli:** use proper build params ([#8016](https://github.com/ionic-team/capacitor/issues/8016)) ([12ce2a4](https://github.com/ionic-team/capacitor/commit/12ce2a486542011c8d6f4cd89a67464f3f27e28d)) -### Features +## Features - **cli:** Initial Cordova plugin SPM support ([#7999](https://github.com/ionic-team/capacitor/issues/7999)) ([c030354](https://github.com/ionic-team/capacitor/commit/c03035426343ddc4e303ca3420e476bb7f1e2201)) - expose `appStartPath` on cap config server configuration ([#8019](https://github.com/ionic-team/capacitor/issues/8019)) ([a274fef](https://github.com/ionic-team/capacitor/commit/a274fef069176a8e528a22f4734d1e29a539709c)) # [7.2.0](https://github.com/ionic-team/capacitor/compare/7.1.0...7.2.0) (2025-03-31) -### Bug Fixes +## Bug Fixes - **cli:** Don't migrate Podfile on SPM projects ([#7939](https://github.com/ionic-team/capacitor/issues/7939)) ([ab4e700](https://github.com/ionic-team/capacitor/commit/ab4e700035289f445668dfd2f86278ffc71ab269)) # [7.1.0](https://github.com/ionic-team/capacitor/compare/7.0.1...7.1.0) (2025-03-12) -### Bug Fixes +## Bug Fixes - **cli:** don't run bundle if not installed ([#7896](https://github.com/ionic-team/capacitor/issues/7896)) ([ee55f6c](https://github.com/ionic-team/capacitor/commit/ee55f6c54639c1a61fa4f9eed1f366ba2d968b86)) -### Features +## Features - **android:** add adjustMarginsForEdgeToEdge configuration option ([#7885](https://github.com/ionic-team/capacitor/issues/7885)) ([1ea86d1](https://github.com/ionic-team/capacitor/commit/1ea86d166afd315e72847c5e734a8c175fb90e04)) - **cli:** add more configurations to build command ([#7769](https://github.com/ionic-team/capacitor/issues/7769)) ([90f95d1](https://github.com/ionic-team/capacitor/commit/90f95d1a829f3d87cb46af827b5bfaac319a9694)) @@ -218,25 +576,25 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/7.0.0-alpha.2...7.0.0-beta.0) (2024-12-20) -### Bug Fixes +## Bug Fixes - **cli:** correct rimraf import ([#7811](https://github.com/ionic-team/capacitor/issues/7811)) ([0891624](https://github.com/ionic-team/capacitor/commit/0891624c46b78a0fd39f617f834d5cdd1f54f5e6)) - **cli:** update link to telemetry information ([e922e2b](https://github.com/ionic-team/capacitor/commit/e922e2b718f5c6f2e4062cdccdeb92da3321e67d)) - **ios:** Make Bridge webView first responder ([#7753](https://github.com/ionic-team/capacitor/issues/7753)) ([77e4668](https://github.com/ionic-team/capacitor/commit/77e4668fa8dbb24b4561387e101547f74e37538e)) -### Features +## Features - Add global initialFocus configuration ([#7775](https://github.com/ionic-team/capacitor/issues/7775)) ([61d0165](https://github.com/ionic-team/capacitor/commit/61d01653685d8e3594d2d8a6bd870fa9643ba95c)) # [7.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/7.0.0-alpha.1...7.0.0-alpha.2) (2024-11-19) -### Bug Fixes +## Bug Fixes - **cli:** make Cordova plugins use same default kotlin version as Capacitor ([#7752](https://github.com/ionic-team/capacitor/issues/7752)) ([a4aeb55](https://github.com/ionic-team/capacitor/commit/a4aeb55720ecc83b3870bf32bf9825d6aee4644f)) # [7.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/6.1.2...7.0.0-alpha.1) (2024-10-14) -### Bug Fixes +## Bug Fixes - **cli:** replace app-store deprecated method on build ([#7637](https://github.com/ionic-team/capacitor/issues/7637)) ([942b108](https://github.com/ionic-team/capacitor/commit/942b108c1d506539c0c53276ed4ec35eed36634e)) @@ -255,30 +613,30 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.1.0](https://github.com/ionic-team/capacitor/compare/6.0.0...6.1.0) (2024-06-11) -### Bug Fixes +## Bug Fixes - **cli:** Avoid duplicate entries in packageClassList ([#7470](https://github.com/ionic-team/capacitor/issues/7470)) ([cca0b80](https://github.com/ionic-team/capacitor/commit/cca0b805291bd002c515be0a1c15de84ee23c5d3)) - **cli:** Run sync before updating gradle ([#7497](https://github.com/ionic-team/capacitor/issues/7497)) ([f27786e](https://github.com/ionic-team/capacitor/commit/f27786ea1367bc0ec53697eeb6d654a7e12a1507)) -### Features +## Features - **cli:** run plugin hooks ([#7499](https://github.com/ionic-team/capacitor/issues/7499)) ([3b847ea](https://github.com/ionic-team/capacitor/commit/3b847eac42673c812a4538c319b81c8f8afc9955)) # [6.0.0](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.2...6.0.0) (2024-04-15) -### Bug Fixes +## Bug Fixes - **cli:** Change Capacitor plugin files check ([#7375](https://github.com/ionic-team/capacitor/issues/7375)) ([fbfb778](https://github.com/ionic-team/capacitor/commit/fbfb77825fdd3343e85868ea28b8e14a482dcf4a)) - **cli:** Don't downgrade gradle version on migrate ([#7385](https://github.com/ionic-team/capacitor/issues/7385)) ([c79211e](https://github.com/ionic-team/capacitor/commit/c79211ec9dde81a57aca5cee8ab09cdef0c9ad86)) - **cli:** Removing extra dash in android apk name flavor parsing ([#7382](https://github.com/ionic-team/capacitor/issues/7382)) ([3c411fd](https://github.com/ionic-team/capacitor/commit/3c411fd0a400b18c2d032e3b8be3fc4b5449bcbd)) -### Features +## Features - **cli:** Support bun when running cap migrate ([#7386](https://github.com/ionic-team/capacitor/issues/7386)) ([3f96ff9](https://github.com/ionic-team/capacitor/commit/3f96ff911588c517dc2d924f55ef28a25c30bd33)) # [6.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.1...6.0.0-rc.2) (2024-03-25) -### Bug Fixes +## Bug Fixes - **cli:** also generate packageClassList on copy ([#7358](https://github.com/ionic-team/capacitor/issues/7358)) ([865cceb](https://github.com/ionic-team/capacitor/commit/865cceb1bf7e1b973e8f83f3c77040add71b403c)) - **cli:** use correct pass signature for apksigner signing ([#7365](https://github.com/ionic-team/capacitor/issues/7365)) ([e4f8610](https://github.com/ionic-team/capacitor/commit/e4f86103c2806df4ca2729600361e6338c30f083)) @@ -286,7 +644,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.0...6.0.0-rc.1) (2024-03-15) -### Bug Fixes +## Bug Fixes - **cli:** adjust SPM parameters for build and run commands ([#7342](https://github.com/ionic-team/capacitor/issues/7342)) ([02f8983](https://github.com/ionic-team/capacitor/commit/02f8983300c102125db6b41b0bb174fe41e1785b)) - **cli:** apkName for multi-dimensional flavors ([#6704](https://github.com/ionic-team/capacitor/issues/6704)) ([d7b23f2](https://github.com/ionic-team/capacitor/commit/d7b23f21c554c94029b24d6e0c9ad4635f055759)) @@ -298,7 +656,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-rc.0](https://github.com/ionic-team/capacitor/compare/6.0.0-beta.2...6.0.0-rc.0) (2024-01-23) -### Bug Fixes +## Bug Fixes - **cli:** correctly build and sign Android apps using Flavors ([#7082](https://github.com/ionic-team/capacitor/issues/7082)) ([7d3a99d](https://github.com/ionic-team/capacitor/commit/7d3a99d15ba024b4bde9e698e57937002da38bd4)) - **cli:** Specify keystore alias and alias password build options for apksigner ([#7073](https://github.com/ionic-team/capacitor/issues/7073)) ([6612c49](https://github.com/ionic-team/capacitor/commit/6612c49f5fde5ef2fee555206018391fc00e2be0)) @@ -306,7 +664,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** Update plugins with breaking changes ([#7148](https://github.com/ionic-team/capacitor/issues/7148)) ([b8c2a92](https://github.com/ionic-team/capacitor/commit/b8c2a92390f21fe653563d7bad73a3f2b5628acb)) - stop crashing from `objc_getClassList` ([#7187](https://github.com/ionic-team/capacitor/issues/7187)) ([e148db7](https://github.com/ionic-team/capacitor/commit/e148db7758e4186ad45fd74185a10fb757ff9b29)) -### Features +## Features - **cli:** allow async in capacitor config file ([#4299](https://github.com/ionic-team/capacitor/issues/4299)) ([5cecc3e](https://github.com/ionic-team/capacitor/commit/5cecc3ee22868f9397792ec80a4b753a07b68f30)) @@ -328,7 +686,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/5.2.3...6.0.0-alpha.1) (2023-11-08) -### Bug Fixes +## Bug Fixes - allow double quotes in Gemfile ([#6903](https://github.com/ionic-team/capacitor/issues/6903)) ([3abdbed](https://github.com/ionic-team/capacitor/commit/3abdbed38844d5d59d244f6f0dfc2647f29ce446)) - **cli:** force latest native-run version for iOS 17 support ([#6926](https://github.com/ionic-team/capacitor/issues/6926)) ([7e7c8b9](https://github.com/ionic-team/capacitor/commit/7e7c8b9113f541d530c5883dea1f52b2957c0859)) @@ -337,7 +695,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** Use latest native-run ([#7023](https://github.com/ionic-team/capacitor/issues/7023)) ([4125160](https://github.com/ionic-team/capacitor/commit/412516069e15fbdbc17ad130c2f3a67891b6bc45)) - Update migrate to Capacitor 6 ([#6872](https://github.com/ionic-team/capacitor/issues/6872)) ([98eec8f](https://github.com/ionic-team/capacitor/commit/98eec8fe9fd332d6669965fa5a21412233b3e06e)) -### Features +## Features - add livereload to run command ([#6831](https://github.com/ionic-team/capacitor/issues/6831)) ([4099969](https://github.com/ionic-team/capacitor/commit/4099969f70e9b995182bacecc16e160d89bbc746)) - better support monorepos ([#6811](https://github.com/ionic-team/capacitor/issues/6811)) ([ae35e29](https://github.com/ionic-team/capacitor/commit/ae35e29fb8c886dea867683a23a558d2d344073b)) @@ -345,7 +703,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.6.0](https://github.com/ionic-team/capacitor/compare/5.5.1...5.6.0) (2023-12-14) -### Bug Fixes +## Bug Fixes - **cli:** Use latest native-run ([#7030](https://github.com/ionic-team/capacitor/issues/7030)) ([1d948d4](https://github.com/ionic-team/capacitor/commit/1d948d4df6b6b6f8cfdc02e72d84ae8be963f4a0)) @@ -370,17 +728,17 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.4.0](https://github.com/ionic-team/capacitor/compare/5.3.0...5.4.0) (2023-09-14) -### Bug Fixes +## Bug Fixes - **cli:** use helper in Podfile with correct path ([#6888](https://github.com/ionic-team/capacitor/issues/6888)) ([9048432](https://github.com/ionic-team/capacitor/commit/9048432755095ce3dcca9d3bab39894f2b6c3967)) -### Features +## Features - add livereload to run command ([#6831](https://github.com/ionic-team/capacitor/issues/6831)) ([54a63ae](https://github.com/ionic-team/capacitor/commit/54a63ae0a5f0845d5ef2c0d10bd0c27682866940)) # [5.3.0](https://github.com/ionic-team/capacitor/compare/5.2.3...5.3.0) (2023-08-23) -### Features +## Features - better support monorepos ([#6811](https://github.com/ionic-team/capacitor/issues/6811)) ([ae35e29](https://github.com/ionic-team/capacitor/commit/ae35e29fb8c886dea867683a23a558d2d344073b)) @@ -401,7 +759,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.2.0](https://github.com/ionic-team/capacitor/compare/5.1.1...5.2.0) (2023-07-12) -### Bug Fixes +## Bug Fixes - **cli:** make migrate not error if there are no dependencies ([#6707](https://github.com/ionic-team/capacitor/issues/6707)) ([25ca83a](https://github.com/ionic-team/capacitor/commit/25ca83a8a76fe0eaf73c0db24fd950b33fd16063)) @@ -411,7 +769,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.1.0](https://github.com/ionic-team/capacitor/compare/5.0.5...5.1.0) (2023-06-29) -### Features +## Features - **cli:** add apksigner as a build option ([#6442](https://github.com/ionic-team/capacitor/issues/6442)) ([9818a76](https://github.com/ionic-team/capacitor/commit/9818a76ab4ea6660b444354f239344d37c77d3b3)) @@ -456,13 +814,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/5.0.0-rc.1...5.0.0-rc.2) (2023-05-03) -### Bug Fixes +## Bug Fixes - check for android and JDK ([#6554](https://github.com/ionic-team/capacitor/issues/6554)) ([ddcc818](https://github.com/ionic-team/capacitor/commit/ddcc818e828b290459d3ddffe9102fc312139823)) # [5.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/5.0.0-rc.0...5.0.0-rc.1) (2023-05-02) -### Bug Fixes +## Bug Fixes - **cli:** Avoid infinite loop in namespace migration ([#6551](https://github.com/ionic-team/capacitor/issues/6551)) ([d3aacde](https://github.com/ionic-team/capacitor/commit/d3aacdeb0c86d3941464954e7d1f582e405be489)) - **cli:** Migrate more plugin variables ([#6552](https://github.com/ionic-team/capacitor/issues/6552)) ([b7da5b9](https://github.com/ionic-team/capacitor/commit/b7da5b988ce7da5ea3991eaec46b9e52ff3635f1)) @@ -473,32 +831,32 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-beta.3](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.2...5.0.0-beta.3) (2023-04-21) -### Features +## Features - **cli:** android manifest to build.gradle migration ([#6533](https://github.com/ionic-team/capacitor/issues/6533)) ([245b6ab](https://github.com/ionic-team/capacitor/commit/245b6ab85b0f481f08c21e25f2b2a7eb6da9996c)) - **cli:** Migrate update to gradle 8 ([#6530](https://github.com/ionic-team/capacitor/issues/6530)) ([da3ac0e](https://github.com/ionic-team/capacitor/commit/da3ac0e72c0559223e9b91f31830810d39638734)) # [5.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.1...5.0.0-beta.2) (2023-04-13) -### Features +## Features - **ios:** Add Bundler support ([#5205](https://github.com/ionic-team/capacitor/issues/5205)) ([f21c6d0](https://github.com/ionic-team/capacitor/commit/f21c6d01fc30e46c151afc93da9727dbf6c9ddcf)) - **ios:** add webContentsDebuggingEnabled configuration ([#6495](https://github.com/ionic-team/capacitor/issues/6495)) ([c691e4a](https://github.com/ionic-team/capacitor/commit/c691e4aecbfb7a45ce0465d1fe9020ab715815d3)) # [5.0.0-beta.1](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.0...5.0.0-beta.1) (2023-04-03) -### Features +## Features - **cli:** add npm update step to migrate ([#6462](https://github.com/ionic-team/capacitor/issues/6462)) ([65520c3](https://github.com/ionic-team/capacitor/commit/65520c36cdb4ac6f8811eb72624c447f2a0d884a)) - **cli:** non interactive migrate ([#6461](https://github.com/ionic-team/capacitor/issues/6461)) ([53dfeaf](https://github.com/ionic-team/capacitor/commit/53dfeaf77ace5b165260b68351eae8e5bf72ea0a)) # [5.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/5.0.0-alpha.1...5.0.0-beta.0) (2023-03-31) -### Bug Fixes +## Bug Fixes - **cli:** Fix cordova plugin config checker over checking 5.x ([#6444](https://github.com/ionic-team/capacitor/issues/6444)) ([9d21a0e](https://github.com/ionic-team/capacitor/commit/9d21a0e363141fa0792c12d977b13692be67cf6d)) -### Features +## Features - **android:** Fix for [#6258](https://github.com/ionic-team/capacitor/issues/6258), Add support for modern Huawei devices ([#6402](https://github.com/ionic-team/capacitor/issues/6402)) ([17f2f4a](https://github.com/ionic-team/capacitor/commit/17f2f4ac744a038c1dae3cbd74a670d5ede92ef3)) - **cli:** Add missing Cap 4 to Cap 5 migration tasks ([#6453](https://github.com/ionic-team/capacitor/issues/6453)) ([7dff363](https://github.com/ionic-team/capacitor/commit/7dff36376d6efa6ea8793b81550979ee9254991b)) @@ -508,23 +866,23 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/4.7.0...5.0.0-alpha.1) (2023-03-16) -### Bug Fixes +## Bug Fixes - **cli:** point build to proper workspace name ([#6371](https://github.com/ionic-team/capacitor/issues/6371)) ([78b7a59](https://github.com/ionic-team/capacitor/commit/78b7a591429b5fc1dc7bf87e06e9a1afd3599408)) -### Features +## Features - **cli:** Add --forwardPorts option to Capacitor CLI ([#5645](https://github.com/ionic-team/capacitor/issues/5645)) ([2f04d29](https://github.com/ionic-team/capacitor/commit/2f04d29a17eb46f9bd140b93e821e11380699367)) - **cli:** update init to set androidScheme to https ([#6342](https://github.com/ionic-team/capacitor/issues/6342)) ([158b27e](https://github.com/ionic-team/capacitor/commit/158b27e53fd803c87de32e8da9f0c5117f81a3a5)) # [4.7.0](https://github.com/ionic-team/capacitor/compare/4.6.3...4.7.0) (2023-02-22) -### Bug Fixes +## Bug Fixes - **cli:** prevent error on manifest element without children ([#6278](https://github.com/ionic-team/capacitor/issues/6278)) ([a7e374f](https://github.com/ionic-team/capacitor/commit/a7e374fc4d834ded437edb4c8a0be98b6691be4c)) - **cli:** Remove buildOptions from platform capacitor.config.json ([#6292](https://github.com/ionic-team/capacitor/issues/6292)) ([acddcd9](https://github.com/ionic-team/capacitor/commit/acddcd95b40a7d4cc6c7682d2d1019f96dacf68d)) -### Features +## Features - **cli:** add ssl pinning copy logic ([#6312](https://github.com/ionic-team/capacitor/issues/6312)) ([cce66c1](https://github.com/ionic-team/capacitor/commit/cce66c1d59370ba35db879f4d7a3620d22175ab0)) @@ -549,27 +907,27 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.6.0](https://github.com/ionic-team/capacitor/compare/4.5.0...4.6.0) (2022-12-01) -### Bug Fixes +## Bug Fixes - **cli:** useLegacyBridge should be optional ([#6095](https://github.com/ionic-team/capacitor/issues/6095)) ([20f68fe](https://github.com/ionic-team/capacitor/commit/20f68feab2cb88cf8a79a987533839aa49255607)) - **cli:** warns about config that is present ([#6060](https://github.com/ionic-team/capacitor/issues/6060)) ([7ac43e7](https://github.com/ionic-team/capacitor/commit/7ac43e722139a61129cfecf98da373659b1aeac8)) # [4.5.0](https://github.com/ionic-team/capacitor/compare/4.4.0...4.5.0) (2022-11-16) -### Bug Fixes +## Bug Fixes - **cli:** add vite config to framework detection ([#6039](https://github.com/ionic-team/capacitor/issues/6039)) ([3796d42](https://github.com/ionic-team/capacitor/commit/3796d42665f3150f99c761aa561a9e34d03cae28)) - **cli:** calculate padding of super.onCreate(savedInstanceState); line ([#6016](https://github.com/ionic-team/capacitor/issues/6016)) ([5729ac1](https://github.com/ionic-team/capacitor/commit/5729ac19e7880713ec52bac431a2756da5aa3109)) - **cli:** Update gradle versions only if they are older ([#6015](https://github.com/ionic-team/capacitor/issues/6015)) ([ae94101](https://github.com/ionic-team/capacitor/commit/ae941017fff3bcfa75e0788535f356a56ce6fa05)) - **cli/ios:** Read handleApplicationNotifications configuration option ([#6030](https://github.com/ionic-team/capacitor/issues/6030)) ([99ccf18](https://github.com/ionic-team/capacitor/commit/99ccf181f6ee8a00ed97bdbf9076e2b2ea27cd57)) -### Features +## Features - **android/cli:** Allow to use the old addJavascriptInterface bridge ([#6043](https://github.com/ionic-team/capacitor/issues/6043)) ([a6e7c54](https://github.com/ionic-team/capacitor/commit/a6e7c5422687b703492a5fcc49369eacc376143d)) # [4.4.0](https://github.com/ionic-team/capacitor/compare/4.3.0...4.4.0) (2022-10-21) -### Features +## Features - **cli:** add build command for android ([#5891](https://github.com/ionic-team/capacitor/issues/5891)) ([6d4e620](https://github.com/ionic-team/capacitor/commit/6d4e620308b6dd97376e3af7de1dd1a530083f1c)) - **cli:** add build command for ios ([#5925](https://github.com/ionic-team/capacitor/issues/5925)) ([8e8414f](https://github.com/ionic-team/capacitor/commit/8e8414fa6f4ccb245576cc113eb969937613bbf7)) @@ -577,20 +935,20 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.3.0](https://github.com/ionic-team/capacitor/compare/4.2.0...4.3.0) (2022-09-21) -### Bug Fixes +## Bug Fixes - **cli:** Find the Info.plist when using scheme ([#5914](https://github.com/ionic-team/capacitor/issues/5914)) ([f7029ac](https://github.com/ionic-team/capacitor/commit/f7029acb885ec60f85a434b6f71e4f2a633c7651)) - **cli:** Make migrator update gradle wrapper files ([#5910](https://github.com/ionic-team/capacitor/issues/5910)) ([b8b9b1f](https://github.com/ionic-team/capacitor/commit/b8b9b1f96249908435017eea6c427221f1971836)) - **cli:** Make update from windows use proper paths on Podfile ([#5906](https://github.com/ionic-team/capacitor/issues/5906)) ([c41d28f](https://github.com/ionic-team/capacitor/commit/c41d28f8cc829c6bf69d776280c9f1fdba9f866f)) - **cli:** show error if npm install on migration failed ([#5904](https://github.com/ionic-team/capacitor/issues/5904)) ([aa60a75](https://github.com/ionic-team/capacitor/commit/aa60a75d9c2c784e127a4d89e4079b412fbe7262)) -### Features +## Features - Capacitor Cookies & Capacitor Http core plugins ([d4047cf](https://github.com/ionic-team/capacitor/commit/d4047cfa947676777f400389a8d65defae140b45)) # [4.2.0](https://github.com/ionic-team/capacitor/compare/4.1.0...4.2.0) (2022-09-08) -### Features +## Features - **cli:** add inline option to copy command ([#5901](https://github.com/ionic-team/capacitor/issues/5901)) ([17fbabb](https://github.com/ionic-team/capacitor/commit/17fbabb2a77d1b356d24048efc5883bd4d049104)) - **cli:** add scheme and flavor options to run command ([#5873](https://github.com/ionic-team/capacitor/issues/5873)) ([e4c143d](https://github.com/ionic-team/capacitor/commit/e4c143d4da653533570215964808c2f32f5469d3)) @@ -598,7 +956,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.1.0](https://github.com/ionic-team/capacitor/compare/4.0.1...4.1.0) (2022-08-18) -### Bug Fixes +## Bug Fixes - **cli:** Also update preferences plugin if present ([#5831](https://github.com/ionic-team/capacitor/issues/5831)) ([b9d5954](https://github.com/ionic-team/capacitor/commit/b9d5954ca0b333f2caa20179b96b049379860ea5)) - **cli:** Don't add google-services plugin if missing ([#5825](https://github.com/ionic-team/capacitor/issues/5825)) ([48ff9e6](https://github.com/ionic-team/capacitor/commit/48ff9e6461e8037a5c6da87c90efc6bc872d7f08)) @@ -608,7 +966,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **cli:** remove double space in cap 2 variables file ([#5826](https://github.com/ionic-team/capacitor/issues/5826)) ([7184097](https://github.com/ionic-team/capacitor/commit/7184097da88ed34f3e754119f967d262aa5e2add)) - **cli:** Support of BoM dependencies on cordova plugins ([#5827](https://github.com/ionic-team/capacitor/issues/5827)) ([ea2d95b](https://github.com/ionic-team/capacitor/commit/ea2d95ba43467cd2d4c4637aacab6bf655d9c596)) -### Features +## Features - **cli:** Option to inline JS source maps during sync ([#5843](https://github.com/ionic-team/capacitor/issues/5843)) ([7ce6dd4](https://github.com/ionic-team/capacitor/commit/7ce6dd4b6fb5cdc395add6f656fbedc785178ae3)) @@ -621,7 +979,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.2...4.0.0) (2022-07-27) -### Features +## Features - **android:** Add android.minWebviewVersion configuration option ([#5768](https://github.com/ionic-team/capacitor/issues/5768)) ([ad83827](https://github.com/ionic-team/capacitor/commit/ad838279e9cd190ce6f1a020a0ac9e3916786324)) - **cli:** add migrator for cap3 to cap4 ([#5762](https://github.com/ionic-team/capacitor/issues/5762)) ([7cb660a](https://github.com/ionic-team/capacitor/commit/7cb660a34d9a87274761d4492d0d77c9ef44ace8)) @@ -637,20 +995,20 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/3.6.0...4.0.0-beta.0) (2022-06-17) -### Features +## Features - **android:** Use java 11 ([#5552](https://github.com/ionic-team/capacitor/issues/5552)) ([e47959f](https://github.com/ionic-team/capacitor/commit/e47959fcbd6a89b97b1275a5814fdb4e7ce30672)) - **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/ionic-team/capacitor/issues/5583)) ([5b6dfa3](https://github.com/ionic-team/capacitor/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475)) # [3.6.0](https://github.com/ionic-team/capacitor/compare/3.5.1...3.6.0) (2022-06-17) -### Features +## Features - **android:** update support for Portals for Capacitor to include Live Updates ([#5660](https://github.com/ionic-team/capacitor/issues/5660)) ([62f0a5e](https://github.com/ionic-team/capacitor/commit/62f0a5eaa40776aad79dbf8f8c0900037d3cc97e)) # [4.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.2) (2022-05-12) -### Features +## Features - **android:** Use java 11 ([#5552](https://github.com/ionic-team/capacitor/issues/5552)) ([e47959f](https://github.com/ionic-team/capacitor/commit/e47959fcbd6a89b97b1275a5814fdb4e7ce30672)) - **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/ionic-team/capacitor/issues/5583)) ([5b6dfa3](https://github.com/ionic-team/capacitor/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475)) @@ -663,7 +1021,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.5.0](https://github.com/ionic-team/capacitor/compare/3.4.3...3.5.0) (2022-04-22) -### Features +## Features - **cli:** support capacitor portals plugin changes needed ([#5558](https://github.com/ionic-team/capacitor/issues/5558)) ([6810a19](https://github.com/ionic-team/capacitor/commit/6810a19ae2bbda1f4b2afad61d37ca822ca157f5)) @@ -723,13 +1081,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.3.0](https://github.com/ionic-team/capacitor/compare/3.2.5...3.3.0) (2021-11-03) -### Bug Fixes +## Bug Fixes - **cli:** Add Batch plugin to static list ([#5138](https://github.com/ionic-team/capacitor/issues/5138)) ([9470633](https://github.com/ionic-team/capacitor/commit/94706338c096b30390fa288c9b107e253923a644)) - **cli:** Add onesignal-cordova-plugin to static pod list ([#5143](https://github.com/ionic-team/capacitor/issues/5143)) ([937e240](https://github.com/ionic-team/capacitor/commit/937e2408f9bb60691e653b70d8b7cb02f540b251)) - **cli:** detect and register multiple plugins from same package ([#5098](https://github.com/ionic-team/capacitor/issues/5098)) ([25e770c](https://github.com/ionic-team/capacitor/commit/25e770c3f598bf3a1e05e21d607ab3ad70268674)) -### Features +## Features - **cli:** add support for 'pod install' in VM based environments ([#5144](https://github.com/ionic-team/capacitor/issues/5144)) ([32ecf22](https://github.com/ionic-team/capacitor/commit/32ecf22de0a550756dbfa68b3b17c2333c89a430)) - **cli:** Allow to configure access origin tags on cordova config.xml ([#5134](https://github.com/ionic-team/capacitor/issues/5134)) ([0841a09](https://github.com/ionic-team/capacitor/commit/0841a093bf73ed4acac9a90be44a8e8a3aedbcdb)) @@ -764,7 +1122,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.2.0](https://github.com/ionic-team/capacitor/compare/3.1.2...3.2.0) (2021-08-18) -### Bug Fixes +## Bug Fixes - **cli:** Put cordova git pod dependencies in Podfile ([#4940](https://github.com/ionic-team/capacitor/issues/4940)) ([642dbf4](https://github.com/ionic-team/capacitor/commit/642dbf433e22bb695e5f782bd685de42eb2afada)) - **cli:** Separate Swift plugins from ObjC plugins ([#4925](https://github.com/ionic-team/capacitor/issues/4925)) ([43ce803](https://github.com/ionic-team/capacitor/commit/43ce803975ccd66823aab1e8c0d44d0ca81c6b2f)) @@ -781,11 +1139,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.1.0](https://github.com/ionic-team/capacitor/compare/3.0.2...3.1.0) (2021-07-07) -### Bug Fixes +## Bug Fixes - **cli:** Don't error if there are no scripts ([#4763](https://github.com/ionic-team/capacitor/issues/4763)) ([dec3fb2](https://github.com/ionic-team/capacitor/commit/dec3fb285239912980f2abea1cf48c583da6a163)) -### Features +## Features - **cli:** Add hooks to call into npm scripts when capacitor commands run ([#4739](https://github.com/ionic-team/capacitor/issues/4739)) ([515230c](https://github.com/ionic-team/capacitor/commit/515230ccefec76d4b7ed03ef1122709d1b63b58a)) - **cli:** allow run command to use flavors ([#4782](https://github.com/ionic-team/capacitor/issues/4782)) ([05cb853](https://github.com/ionic-team/capacitor/commit/05cb8533d4479efd3dc823b18f48699302f462ba)) @@ -810,13 +1168,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.4...3.0.0) (2021-05-18) -### Bug Fixes +## Bug Fixes - **cli:** create-react-app framework detection should not look for react-dev-utils ([#4585](https://github.com/ionic-team/capacitor/issues/4585)) ([9f7910e](https://github.com/ionic-team/capacitor/commit/9f7910ee39ea7721d01428ec65b3d101b8ba963e)) # [3.0.0-rc.4](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.3...3.0.0-rc.4) (2021-05-18) -### Features +## Features - **cli:** auto detect framework's webDir ([#4550](https://github.com/ionic-team/capacitor/issues/4550)) ([329448a](https://github.com/ionic-team/capacitor/commit/329448a26846b5167b16f9169d62a9ff61eef87d)) @@ -830,19 +1188,19 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.0...3.0.0-rc.1) (2021-04-29) -### Bug Fixes +## Bug Fixes - **cli:** Allow prereleases on node version check ([#4469](https://github.com/ionic-team/capacitor/issues/4469)) ([dd26a98](https://github.com/ionic-team/capacitor/commit/dd26a98bde9c4487178bc4ee45587f86ec53df2a)) - **cli:** filter targets without id from run device list ([#4397](https://github.com/ionic-team/capacitor/issues/4397)) ([9ec444f](https://github.com/ionic-team/capacitor/commit/9ec444f034d435c7c945e9a20e3ca99a3b1f54d6)) -### Features +## Features - Unify logging behavior across environments ([#4416](https://github.com/ionic-team/capacitor/issues/4416)) ([bae0f3d](https://github.com/ionic-team/capacitor/commit/bae0f3d2cee84978636d0f589bc7e2f745671baf)) - **cli:** Add signup prompt on first init ([#4440](https://github.com/ionic-team/capacitor/issues/4440)) ([b3faa97](https://github.com/ionic-team/capacitor/commit/b3faa97d9b0ee542a8d90f433545f7e83402c485)) # [3.0.0-rc.0](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.6...3.0.0-rc.0) (2021-03-10) -### Bug Fixes +## Bug Fixes - **cli:** Make tests work on npm 7 ([#4297](https://github.com/ionic-team/capacitor/issues/4297)) ([676c907](https://github.com/ionic-team/capacitor/commit/676c907c7ce84fdc57d00152024144a74d24b137)) @@ -856,23 +1214,23 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-beta.4](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.3...3.0.0-beta.4) (2021-02-26) -### Bug Fixes +## Bug Fixes - **cli:** init failure if config.xml is present ([#4227](https://github.com/ionic-team/capacitor/issues/4227)) ([f1703dc](https://github.com/ionic-team/capacitor/commit/f1703dcb3ebaa83df9f2b72ca00eb6721e96dfd9)) # [3.0.0-beta.3](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.2...3.0.0-beta.3) (2021-02-18) -### Bug Fixes +## Bug Fixes - **cli:** do not error if webDir is missing when adding platforms ([#4215](https://github.com/ionic-team/capacitor/issues/4215)) ([4583add](https://github.com/ionic-team/capacitor/commit/4583add61f5f7ac60de8722664811d96d4095459)) -### Features +## Features - **cli:** do not require webDir when server.url is set ([#4200](https://github.com/ionic-team/capacitor/issues/4200)) ([91ddfbd](https://github.com/ionic-team/capacitor/commit/91ddfbd3cd1f598906b2ddc5cab8904420f231f6)) # [3.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.1...3.0.0-beta.2) (2021-02-08) -### Features +## Features - **cli:** configurable iOS build scheme ([#4073](https://github.com/ionic-team/capacitor/issues/4073)) ([e6374dc](https://github.com/ionic-team/capacitor/commit/e6374dc88c388a30186e8bfea22ce129ca1a9e02)) - **cli:** send config, rootDir, and webDir to custom platform hooks ([#4084](https://github.com/ionic-team/capacitor/issues/4084)) ([13e9860](https://github.com/ionic-team/capacitor/commit/13e9860468126ba3c37b25d9093ab5f6cce2df2c)) @@ -887,29 +1245,29 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.14](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.13...3.0.0-alpha.14) (2021-01-13) -### Bug Fixes +## Bug Fixes - **cli:** bump minimum node version to 12.4.0 ([#4059](https://github.com/ionic-team/capacitor/issues/4059)) ([61e3be0](https://github.com/ionic-team/capacitor/commit/61e3be0c865a3591a0d6bcfc27d0bbb72ee98395)) - **cli:** default to new directory instead of crashing ([70fdf0b](https://github.com/ionic-team/capacitor/commit/70fdf0be0e0f06b4f20e20a3ae4bfef4de2374e9)) # [3.0.0-alpha.13](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.12...3.0.0-alpha.13) (2021-01-13) -### Bug Fixes +## Bug Fixes - **cli:** use stderr for logs when using --json option ([#4044](https://github.com/ionic-team/capacitor/issues/4044)) ([452a101](https://github.com/ionic-team/capacitor/commit/452a101648fe6da4232d18985c5d814920505920)) -### Features +## Features - **cli:** create TS configuration files in `init` ([#3999](https://github.com/ionic-team/capacitor/issues/3999)) ([fa7003e](https://github.com/ionic-team/capacitor/commit/fa7003e4ef1d988633abb85b1b109c51b94fda42)) # [3.0.0-alpha.12](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.11...3.0.0-alpha.12) (2021-01-08) -### Bug Fixes +## Bug Fixes - move `public` into iOS target directory ([#4002](https://github.com/ionic-team/capacitor/issues/4002)) ([4f41296](https://github.com/ionic-team/capacitor/commit/4f41296a109cf73fdf8e695849e95f292a543f85)) - **cli:** run an actual debug build for iOS ([#4014](https://github.com/ionic-team/capacitor/issues/4014)) ([dc6399c](https://github.com/ionic-team/capacitor/commit/dc6399cf0b5eb6afb50274a84dc71486cd3e4173)) -### Features +## Features - **cli:** allow 'export default' style TS config files ([#4031](https://github.com/ionic-team/capacitor/issues/4031)) ([9393667](https://github.com/ionic-team/capacitor/commit/9393667bbe629d6c18a22b16fe3f3c6fe83e11f6)) - **cli:** opt-in anonymous usage data ([#4022](https://github.com/ionic-team/capacitor/issues/4022)) ([3facfb7](https://github.com/ionic-team/capacitor/commit/3facfb790bff79b00ba1ab6dd8cb331989937da7)) @@ -928,13 +1286,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.7](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.6...3.0.0-alpha.7) (2020-12-02) -### Bug Fixes +## Bug Fixes - **cli:** Properly detect cocoapods on multiple platforms ([#3810](https://github.com/ionic-team/capacitor/issues/3810)) ([8753694](https://github.com/ionic-team/capacitor/commit/8753694b12033feb01c82bd5985dce2584bae80c)) - **cli:** run sync instead of copy during run ([#3816](https://github.com/ionic-team/capacitor/issues/3816)) ([ff45340](https://github.com/ionic-team/capacitor/commit/ff4534064c7f47331721d086889a42a97cf30945)) - **cli:** use correct path for native-run ([02cf1ba](https://github.com/ionic-team/capacitor/commit/02cf1ba4b7d1c419551b6494f08cb90553fd93be)) -### Features +## Features - automatically import Android plugins ([#3788](https://github.com/ionic-team/capacitor/issues/3788)) ([aa1e1c6](https://github.com/ionic-team/capacitor/commit/aa1e1c604e260cc8babb0e7f5230f692bdcf6f09)) - **cli:** add --no-sync option to run ([#3819](https://github.com/ionic-team/capacitor/issues/3819)) ([8def829](https://github.com/ionic-team/capacitor/commit/8def8290bb182436204380fc711d84fa36c17004)) @@ -947,7 +1305,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.6](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.5...3.0.0-alpha.6) (2020-10-30) -### Features +## Features - **cli:** add `capacitor run` command ([#3599](https://github.com/ionic-team/capacitor/issues/3599)) ([8576b0f](https://github.com/ionic-team/capacitor/commit/8576b0ff6a048981a07cab91135a0071b724e043)) @@ -957,7 +1315,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.4](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.3...3.0.0-alpha.4) (2020-09-23) -### Features +## Features - **cli:** ability to specify custom platform directories ([#3565](https://github.com/ionic-team/capacitor/issues/3565)) ([c6eda55](https://github.com/ionic-team/capacitor/commit/c6eda55482ef56abdfe9a33444e828b771af9386)) @@ -971,12 +1329,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/2.4.0...3.0.0-alpha.1) (2020-08-21) -### Features +## Features - **cli:** add fmt script to plugin template ([#3354](https://github.com/ionic-team/capacitor/issues/3354)) ([9ca1e72](https://github.com/ionic-team/capacitor/commit/9ca1e723334f5d21706a8586c11d73162b47a13a)) # [3.0.0-alpha.0](https://github.com/ionic-team/capacitor/compare/2.3.0...3.0.0-alpha.0) (2020-07-23) -### Features +## Features - **core:** add `registerPlugin` for importing from plugin packages ([#3305](https://github.com/ionic-team/capacitor/issues/3305)) ([95475cc](https://github.com/ionic-team/capacitor/commit/95475cceb4cbd5be2cc7e18f2cf3045eb6c6f7fd)) + diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 5cd08736f..6f3f54026 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -59,34 +59,42 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: await generateCordovaPackageFiles(cordovaPlugins, config); const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); - const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); - await Promise.all( - validSPMPackages.map(async (plugin) => { - const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); - let content = await readFile(packageSwiftPath, { encoding: 'utf-8' }); - const regex = new RegExp( - 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*(?:from|exact):\\s*"([^"]+)"', - ); - const version = content.match(regex)?.[1]; - if (!version || !valid(version)) { - logger.warn(`${plugin.id}: skipping Package.swift version check for invalid version "${version ?? ''}"`); - return; - } - const majorCapVersion = major(iosPlatformVersion); - if (major(version) != majorCapVersion) { - const preCapVersion = prerelease(iosPlatformVersion); - const forceVersion = preCapVersion ? iosPlatformVersion : `${majorCapVersion}.0.0`; - content = setAllStringIn( - content, - `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, - `)`, - ` from: "${forceVersion}"`, + let iosPlatformVersion: string | null = null; + try { + iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); + } catch { + iosPlatformVersion = null; + } + if (iosPlatformVersion) { + const platformVersion = iosPlatformVersion; + await Promise.all( + validSPMPackages.map(async (plugin) => { + const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); + let content = await readFile(packageSwiftPath, { encoding: 'utf-8' }); + const regex = new RegExp( + 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*(?:from|exact):\\s*"([^"]+)"', ); - await writeFile(packageSwiftPath, content); - logger.warn(`${plugin.id} is built for Capacitor ${major(version)}, it might cause issues`); - } - }), - ); + const version = content.match(regex)?.[1]; + if (!version || !valid(version)) { + logger.warn(`${plugin.id}: skipping Package.swift version check for invalid version "${version ?? ''}"`); + return; + } + const majorCapVersion = major(platformVersion); + if (major(version) != majorCapVersion) { + const preCapVersion = prerelease(platformVersion); + const forceVersion = preCapVersion ? platformVersion : `${majorCapVersion}.0.0`; + content = setAllStringIn( + content, + `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, + `)`, + ` from: "${forceVersion}"`, + ); + await writeFile(packageSwiftPath, content); + logger.warn(`${plugin.id} is built for Capacitor ${major(version)}, it might cause issues`); + } + }), + ); + } await generatePackageFile(config, validSPMPackages.concat(cordovaPlugins)); } else { diff --git a/cli/src/tasks/migrate-uiscene.ts b/cli/src/tasks/migrate-uiscene.ts index 241c3fea6..92058e86a 100644 --- a/cli/src/tasks/migrate-uiscene.ts +++ b/cli/src/tasks/migrate-uiscene.ts @@ -138,7 +138,7 @@ function findMatchingBrace(source: string, openIdx: number): number | null { let depth = 1; let i = openIdx + 1; let inLineComment = false; - let inBlockComment = false; + let blockCommentDepth = 0; let inString: '"' | '"""' | null = null; while (i < source.length && depth > 0) { @@ -152,9 +152,14 @@ function findMatchingBrace(source: string, openIdx: number): number | null { continue; } - if (inBlockComment) { + if (blockCommentDepth > 0) { if (ch === '*' && next === '/') { - inBlockComment = false; + blockCommentDepth--; + i += 2; + continue; + } + if (ch === '/' && next === '*') { + blockCommentDepth++; i += 2; continue; } @@ -168,7 +173,15 @@ function findMatchingBrace(source: string, openIdx: number): number | null { continue; } if (ch === '"') { - inString = null; + let hashes = 0; + while (source[i + 1 + hashes] === '#') { + hashes++; + } + if (source[i + 1 + hashes] === '"') { + i += 2 + hashes; + inString = null; + continue; + } } i++; continue; @@ -176,9 +189,15 @@ function findMatchingBrace(source: string, openIdx: number): number | null { if (inString === '"""') { if (ch === '"' && next === '"' && next2 === '"') { - inString = null; - i += 3; - continue; + let hashes = 0; + while (source[i + 3 + hashes] === '#') { + hashes++; + } + if (source[i + 3 + hashes] === '"') { + i += 4 + hashes; + inString = null; + continue; + } } i++; continue; @@ -191,21 +210,26 @@ function findMatchingBrace(source: string, openIdx: number): number | null { } if (ch === '/' && next === '*') { - inBlockComment = true; + blockCommentDepth++; i += 2; continue; } - if (ch === '"' && next === '"' && next2 === '"') { - inString = '"""'; - i += 3; - continue; - } - if (ch === '"') { - inString = '"'; - i++; - continue; + let hashes = 0; + while (source[i + 1 + hashes] === '#') { + hashes++; + } + if (source[i + 1 + hashes] === '"' && source[i + 2 + hashes] === '"' && source[i + 3 + hashes] === '"') { + inString = '"""'; + i += 4 + hashes; + continue; + } + if (source[i + 1 + hashes] === '"') { + inString = '"'; + i += 2 + hashes; + continue; + } } if (ch === '{') depth++; diff --git a/cli/src/tasks/run.ts b/cli/src/tasks/run.ts index ad31f7b8e..780c8130e 100644 --- a/cli/src/tasks/run.ts +++ b/cli/src/tasks/run.ts @@ -89,15 +89,18 @@ export async function runCommand( return; } - const cordovaPlugins = await getCordovaPlugins(config, platformName); + let cordovaPlugins: Awaited> | undefined; + let liveReloadManifestUpdated = false; try { + cordovaPlugins = await getCordovaPlugins(config, platformName); if (options.sync) { await sync(config, platformName, false, true); } if (options.liveReload) { await CapLiveReloadHelper.editCapConfigForLiveReload(config, platformName, options); if (platformName === config.android.name) { - await await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true); + await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, true); + liveReloadManifestUpdated = true; } } await run(config, platformName, options); @@ -105,7 +108,7 @@ export async function runCommand( new Promise((resolve) => process.on('SIGINT', resolve)) .then(async () => { await CapLiveReloadHelper.revertCapConfigForLiveReload(); - if (platformName === config.android.name) { + if (liveReloadManifestUpdated && platformName === config.android.name && cordovaPlugins) { await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, false); } }) @@ -118,7 +121,7 @@ export async function runCommand( } catch (e: any) { if (options.liveReload) { await CapLiveReloadHelper.revertCapConfigForLiveReload(); - if (platformName === config.android.name) { + if (liveReloadManifestUpdated && platformName === config.android.name && cordovaPlugins) { await writeCordovaAndroidManifest(cordovaPlugins, config, platformName, false); } } diff --git a/cli/src/util/node.ts b/cli/src/util/node.ts index 6f511da25..abf639d73 100644 --- a/cli/src/util/node.ts +++ b/cli/src/util/node.ts @@ -1,6 +1,6 @@ import { existsSync } from 'fs'; import { readFileSync } from 'fs-extra'; -import { resolve } from 'path'; +import { dirname, resolve } from 'path'; import type typescript from 'typescript'; import { pathToFileURL } from 'url'; @@ -30,27 +30,7 @@ const dynamicImport: (specifier: string) => Promise = new Function('specifi /** * @see https://github.com/ionic-team/stencil/blob/HEAD/src/compiler/sys/node-require.ts */ -export const requireTS = async (ts: typeof typescript, p: string): Promise => { - const id = resolve(p); - - if (!hasClassicCompilerAPI(ts)) { - // Node has its own built-in TypeScript syntax stripping (stable since Node 23.6, and - // available behind --experimental-strip-types since Node 22.6), so we can load the file - // directly via the native ESM loader instead of transpiling it ourselves. - try { - return await dynamicImport(pathToFileURL(id).href); - } catch (e: any) { - if (e?.code === 'ERR_UNKNOWN_FILE_EXTENSION') { - throw new Error( - `Your installed version of TypeScript (${ts.version}) no longer provides the compiler API Capacitor previously used to load .ts config files, ` + - `and your Node.js runtime (${process.version}) doesn't support loading them natively either.\n` + - 'Upgrade to Node.js 22.6+ (running with --experimental-strip-types), or Node.js 23.6+, to continue using capacitor.config.ts.', - ); - } - throw e; - } - } - +function loadWithClassicCompiler(ts: typeof typescript, id: string): unknown { delete require.cache[id]; require.extensions['.ts'] = (module: NodeModuleWithCompile, fileName: string) => { @@ -83,6 +63,56 @@ export const requireTS = async (ts: typeof typescript, p: string): Promise => { + const id = resolve(p); + + if (!hasClassicCompilerAPI(ts)) { + // Node has its own built-in TypeScript syntax stripping (stable since Node 23.6, and + // available behind --experimental-strip-types since Node 22.6), so we can load the file + // directly via the native ESM loader instead of transpiling it ourselves. + try { + return await dynamicImport(pathToFileURL(id).href); + } catch (e: any) { + if (e?.code === 'ERR_UNKNOWN_FILE_EXTENSION') { + throw new Error( + `Your installed version of TypeScript (${ts.version}) no longer provides the compiler API Capacitor previously used to load .ts config files, ` + + `and your Node.js runtime (${process.version}) doesn't support loading them natively either.\n` + + 'Upgrade to Node.js 22.6+ (running with --experimental-strip-types), or Node.js 23.6+, to continue using capacitor.config.ts.', + ); + } + if (e?.code === 'ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX') { + const compiled = loadWithCliBundledCompiler(id); + if (compiled !== null) { + return compiled; + } + throw new Error( + `Your capacitor.config.ts uses TypeScript syntax that cannot be loaded with Node's native type stripping (${e.message}).\n` + + 'Use erasable TypeScript syntax in capacitor.config.ts, or install a TypeScript version that still exposes the compiler API.', + ); + } + throw e; + } + } + + return loadWithClassicCompiler(ts, id); }; export function resolveNode(root: string, ...pathSegments: string[]): string | null { diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 8742821ed..8c0ee028c 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -275,7 +275,6 @@ export async function addSceneManifestIfNeeded(config: Config): Promise { { UISceneConfigurationName: 'Default Configuration', UISceneDelegateClassName: '$(PRODUCT_MODULE_NAME).SceneDelegate', - UISceneStoryboardFile: entries['UIMainStoryboardFile'] ?? 'Main', }, ], }, diff --git a/cli/test/xcode.spec.ts b/cli/test/xcode.spec.ts index ea2ed6371..6071945ab 100644 --- a/cli/test/xcode.spec.ts +++ b/cli/test/xcode.spec.ts @@ -23,10 +23,10 @@ describe('findGroupUuidByComment', () => { const uuid = findGroupUuidByComment(project, 'App'); - expect(uuid).toMatch(/^[A-F0-9]{24}$/); if (!uuid) { throw new Error('Expected App group UUID'); } + expect(uuid).toMatch(/^[A-F0-9]{24}$/); const group = project.getPBXGroupByKey(uuid); expect(group).toBeDefined(); expect(group?.path).toBe('App'); diff --git a/ios-pods-template/App/App/Info.plist b/ios-pods-template/App/App/Info.plist index f8c8a5765..485f40e31 100644 --- a/ios-pods-template/App/App/Info.plist +++ b/ios-pods-template/App/App/Info.plist @@ -25,21 +25,19 @@ UIApplicationSceneManifest UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main - - - + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + UILaunchStoryboardName LaunchScreen diff --git a/ios-spm-template/App/App/Info.plist b/ios-spm-template/App/App/Info.plist index fc41ce69b..bdf2461d5 100644 --- a/ios-spm-template/App/App/Info.plist +++ b/ios-spm-template/App/App/Info.plist @@ -27,21 +27,19 @@ UIApplicationSceneManifest UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main - - - + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + UILaunchStoryboardName LaunchScreen diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index 1e23bbf9f..14401d34d 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -5,7 +5,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.5.0](https://github.com/ionic-team/capacitor/compare/8.4.2...8.5.0) (2026-07-31) -### Features +## Features - **ios:** UIScene Support ([#8536](https://github.com/ionic-team/capacitor/issues/8536)) ([3fa04a3](https://github.com/ionic-team/capacitor/commit/3fa04a357c92af34cd6fccb8124791963804a9dc)) @@ -19,7 +19,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.4.0](https://github.com/ionic-team/capacitor/compare/8.3.4...8.4.0) (2026-06-02) -### Features +## Features - add method getDouble to plugin config ([#7638](https://github.com/ionic-team/capacitor/issues/7638)) ([93c72de](https://github.com/ionic-team/capacitor/commit/93c72de40a2ec4c78b33659250cb08340083088e)) @@ -41,6 +41,306 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - boundary value extraction for form-data requests ([#7518](https://github.com/ionic-team/capacitor/issues/7518)) ([64ab854](https://github.com/ionic-team/capacitor/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d)) + +## [8.3.12](https://github.com/Cap-go/capacitor-plus/compare/8.3.11...8.3.12) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.11](https://github.com/Cap-go/capacitor-plus/compare/8.3.9...8.3.11) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.10](https://github.com/Cap-go/capacitor-plus/compare/8.3.9...8.3.10) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.9](https://github.com/Cap-go/capacitor-plus/compare/8.3.8...8.3.9) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.8](https://github.com/Cap-go/capacitor-plus/compare/8.3.7...8.3.8) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.7](https://github.com/Cap-go/capacitor-plus/compare/8.3.6...8.3.7) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.6](https://github.com/Cap-go/capacitor-plus/compare/8.3.5...8.3.6) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.5](https://github.com/Cap-go/capacitor-plus/compare/8.3.4...8.3.5) (2026-08-13) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.4](https://github.com/Cap-go/capacitor-plus/compare/8.3.3...8.3.4) (2026-05-07) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.3](https://github.com/Cap-go/capacitor-plus/compare/8.3.2...8.3.3) (2026-05-06) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.3.2](https://github.com/Cap-go/capacitor-plus/compare/8.0.8...8.3.2) (2026-05-05) + + +### Bug Fixes + +* address follow-up review comments ([8bee786](https://github.com/Cap-go/capacitor-plus/commit/8bee786e2c68ca6c351e88f104b518291c1f81e3)) +* boundary value extraction for form-data requests ([#7518](https://github.com/Cap-go/capacitor-plus/issues/7518)) ([64ab854](https://github.com/Cap-go/capacitor-plus/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d)) +* **http:** handle URL objects on fetch ([#8386](https://github.com/Cap-go/capacitor-plus/issues/8386)) ([003099a](https://github.com/Cap-go/capacitor-plus/commit/003099aef246adfd76d890074d46b1484951824b)) +* **ios:** make getArray accesible on Objective-C plugins ([#8392](https://github.com/Cap-go/capacitor-plus/issues/8392)) ([afb80f2](https://github.com/Cap-go/capacitor-plus/commit/afb80f2fecb4bf85dbebe25e815de2a5564264d6)) +* **ios:** remove tmpWindow usages on presentVC/dismissVC ([#8338](https://github.com/Cap-go/capacitor-plus/issues/8338)) ([fc9647f](https://github.com/Cap-go/capacitor-plus/commit/fc9647f26f08ff64f53b32c79fb19f153e3b0a24)) +* resolve upstream sync conflicts ([75cbb30](https://github.com/Cap-go/capacitor-plus/commit/75cbb3097a7068bcb37313cbe6301628079101ca)) + + +### Reverts + +* revert version bump from [#8319](https://github.com/Cap-go/capacitor-plus/issues/8319) and [#8320](https://github.com/Cap-go/capacitor-plus/issues/8320) ([a48ebb6](https://github.com/Cap-go/capacitor-plus/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + + + + + +## [8.0.8](https://github.com/Cap-go/capacitor-plus/compare/8.0.7...8.0.8) (2026-04-08) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.0.7](https://github.com/Cap-go/capacitor-plus/compare/8.0.6...8.0.7) (2026-01-12) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.0.6](https://github.com/Cap-go/capacitor-plus/compare/8.0.5...8.0.6) (2026-01-09) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.0.5](https://github.com/Cap-go/capacitor-plus/compare/8.0.4...8.0.5) (2026-01-08) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.0.4](https://github.com/Cap-go/capacitor-plus/compare/8.0.3...8.0.4) (2025-12-16) + +**Note:** Version bump only for package @capacitor-plus/ios + + + + + +## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16) + + +### Bug Fixes + +* update homepage URL in package.json files for all platforms ([61ccdc4](https://github.com/Cap-go/capacitor-plus/commit/61ccdc4128a1ce2a7178eb0a195b188876ec0a9d)) + + + + + +## [8.0.2](https://github.com/Cap-go/capacitor-plus/compare/8.0.1...8.0.2) (2025-12-16) + + +### Features + +* add new workflows for testing and version bumping; update README files for all packages ([a01c2a8](https://github.com/Cap-go/capacitor-plus/commit/a01c2a842c363c2aa58e5681210fa62fac8e5de5)) + + + + + +## [8.0.1](https://github.com/Cap-go/capacitor-plus/compare/3.3.4...8.0.1) (2025-12-16) + +### Bug Fixes + +- 204 http response ([#6266](https://github.com/Cap-go/capacitor-plus/issues/6266)) ([771f6ce](https://github.com/Cap-go/capacitor-plus/commit/771f6ce1f35159848db218a42dc4f56b5106f750)) +- add http method to prototype.open ([#6740](https://github.com/Cap-go/capacitor-plus/issues/6740)) ([1fd2d87](https://github.com/Cap-go/capacitor-plus/commit/1fd2d8762ff2341a8fe20eec9e774c6a29576e88)) +- allow single parameter on setRequestBody ([#6728](https://github.com/Cap-go/capacitor-plus/issues/6728)) ([5343bdb](https://github.com/Cap-go/capacitor-plus/commit/5343bdb60d26849cd8f9c8ff28ba7d9ddbd05b26)) +- **android:** make local urls use unpatched fetch ([#6953](https://github.com/Cap-go/capacitor-plus/issues/6953)) ([e50e56c](https://github.com/Cap-go/capacitor-plus/commit/e50e56c5231f230497d1bd420e02e2e065c38f86)) +- **cli/ios:** Read handleApplicationNotifications configuration option ([#6030](https://github.com/Cap-go/capacitor-plus/issues/6030)) ([99ccf18](https://github.com/Cap-go/capacitor-plus/commit/99ccf181f6ee8a00ed97bdbf9076e2b2ea27cd57)) +- **cli:** signing type option issue ([#6716](https://github.com/Cap-go/capacitor-plus/issues/6716)) ([ee0f745](https://github.com/Cap-go/capacitor-plus/commit/ee0f7457e458ca4bb4eb74f67552ac2ace76016b)) +- **cookies:** hide httpOnly cookies from client ([0cc927e](https://github.com/Cap-go/capacitor-plus/commit/0cc927ef5f0f7076a6d486d666d78483f1d71c54)) +- **cookies:** make document.cookie setter synchronous ([2272abf](https://github.com/Cap-go/capacitor-plus/commit/2272abf3d3d9dc82d9ca0d03b17e2b78f11f61fc)) +- **cookies:** sanitize url before retrieving/setting cookies ([ca40634](https://github.com/Cap-go/capacitor-plus/commit/ca4063471f215d3f7525e51592d9c72138a52855)) +- **cookies:** Use Set-Cookie headers to persist cookies ([57f8b39](https://github.com/Cap-go/capacitor-plus/commit/57f8b39d7f4c5ee0e5e5cb316913e9450a81d22b)) +- **core:** Exception object was not set on Cap ([#5917](https://github.com/Cap-go/capacitor-plus/issues/5917)) ([9ca27a4](https://github.com/Cap-go/capacitor-plus/commit/9ca27a4f8441b368f8bf9d97dda57b1a55ac0e4e)) +- **core:** make 'content-type' header count for XMLHttpRequest patch ([#7161](https://github.com/Cap-go/capacitor-plus/issues/7161)) ([26d7f68](https://github.com/Cap-go/capacitor-plus/commit/26d7f688284914c6ef795564ba424119efc32a1c)) +- handle fetch headers that are Headers objects ([#6320](https://github.com/Cap-go/capacitor-plus/issues/6320)) ([cb00e49](https://github.com/Cap-go/capacitor-plus/commit/cb00e4952acca8e877555f30b2190f6685d25934)) +- http content headers not sent when using axios ([#8039](https://github.com/Cap-go/capacitor-plus/issues/8039)) ([67cac40](https://github.com/Cap-go/capacitor-plus/commit/67cac40660b3e8cc78d1d228b7c6915450948ef1)) +- **http:** add support for Request objects in fetch ([24b3cc1](https://github.com/Cap-go/capacitor-plus/commit/24b3cc113e3d8aae5d85dbf2d25bec0c35136477)) +- **http:** Add URLSearchParams support ([#7374](https://github.com/Cap-go/capacitor-plus/issues/7374)) ([9367ecc](https://github.com/Cap-go/capacitor-plus/commit/9367ecc56a0c78249dccdf95dca5006422144289)) +- **http:** boundary not added for Request objects ([#7897](https://github.com/Cap-go/capacitor-plus/issues/7897)) ([bdaa6f3](https://github.com/Cap-go/capacitor-plus/commit/bdaa6f3c38c33f3a021ac61f2de89101a5b66cff)) +- **http:** change proxy url generation ([#7354](https://github.com/Cap-go/capacitor-plus/issues/7354)) ([318c316](https://github.com/Cap-go/capacitor-plus/commit/318c316847c5b059fb88b46d4acd31e1ced477e5)) +- **http:** don't override readyState for non POST requests ([#7488](https://github.com/Cap-go/capacitor-plus/issues/7488)) ([30c13a8](https://github.com/Cap-go/capacitor-plus/commit/30c13a865e7710e6dc5f0ee014e951d52d030795)) +- **http:** don't throw errors when content-type is null on response ([#6627](https://github.com/Cap-go/capacitor-plus/issues/6627)) ([538821f](https://github.com/Cap-go/capacitor-plus/commit/538821f267aa3b79548fed6aaea8880ff949ffdd)) +- **http:** fire events in correct order when using xhr ([5ed3617](https://github.com/Cap-go/capacitor-plus/commit/5ed361787596bb5949f6ae5e366495f296352bf3)) +- **http:** fix local http requests on native platforms ([c4e040a](https://github.com/Cap-go/capacitor-plus/commit/c4e040a6f8c6b54bac6ae320e5f0f008604fe50f)) +- **http:** handle proxy urls with port ([#7273](https://github.com/Cap-go/capacitor-plus/issues/7273)) ([514409a](https://github.com/Cap-go/capacitor-plus/commit/514409aeb93ad65be105bbe2da8d2cd86ff159b0)) +- **http:** handle UInt8Array on body ([#7546](https://github.com/Cap-go/capacitor-plus/issues/7546)) ([cfb9ce1](https://github.com/Cap-go/capacitor-plus/commit/cfb9ce175615f69fe86b61af6d51ec2044d147cd)) +- **http:** inherit object properties on window.XMLHttpRequest ([91c11d0](https://github.com/Cap-go/capacitor-plus/commit/91c11d06f773c45a10f6f2d52f672ae6f189b162)) +- **http:** keep original URL properties on proxy ([#7329](https://github.com/Cap-go/capacitor-plus/issues/7329)) ([cbb6407](https://github.com/Cap-go/capacitor-plus/commit/cbb6407225b42a0d9db4f335a9766f119501021d)) +- **http:** Make proxy work with Request objects ([#7348](https://github.com/Cap-go/capacitor-plus/issues/7348)) ([7e68725](https://github.com/Cap-go/capacitor-plus/commit/7e6872573df03ab5cdc10a1a27db3e9fe81a141d)) +- **http:** parse readablestream data on fetch request objects ([#6919](https://github.com/Cap-go/capacitor-plus/issues/6919)) ([80ec3b7](https://github.com/Cap-go/capacitor-plus/commit/80ec3b73db18b7b6841bf90ed50a67389946ab87)) +- **http:** pass original url as query param on the proxy url ([#7527](https://github.com/Cap-go/capacitor-plus/issues/7527)) ([1da06e6](https://github.com/Cap-go/capacitor-plus/commit/1da06e66cb9cfbf5a5cc48ba6c23cdbe18bc8fc0)) +- **http:** prevent POST request from being proxied ([#7395](https://github.com/Cap-go/capacitor-plus/issues/7395)) ([7b8c352](https://github.com/Cap-go/capacitor-plus/commit/7b8c3523decd5610dcf09e926640bf35b382d61d)) +- **http:** Properly URL-encode key and values during `x-www-form-urlencoded` POSTs ([#8037](https://github.com/Cap-go/capacitor-plus/issues/8037)) ([87b4641](https://github.com/Cap-go/capacitor-plus/commit/87b4641d1fa32b78e6fc2e87ee7b2c49b625b213)) +- **http:** return valid response for relative url xhr requests ([bde6569](https://github.com/Cap-go/capacitor-plus/commit/bde65696218f97a8328041f137457f46e5eb766a)) +- **http:** route get requests through custom handler ([#6818](https://github.com/Cap-go/capacitor-plus/issues/6818)) ([b853d06](https://github.com/Cap-go/capacitor-plus/commit/b853d065055b5a819949551be58b62d40b52e37c)) +- **http:** set port for proxy url ([#7341](https://github.com/Cap-go/capacitor-plus/issues/7341)) ([a3059dc](https://github.com/Cap-go/capacitor-plus/commit/a3059dca4a7746d9fb7102a7d41f4da80e2f48b4)) +- inject cordova files if a cordova plugin is present ([#7363](https://github.com/Cap-go/capacitor-plus/issues/7363)) ([ce9d505](https://github.com/Cap-go/capacitor-plus/commit/ce9d50585b1cab183245197878bf625cf0289275)) +- **ios/android:** better http error handling ([#6208](https://github.com/Cap-go/capacitor-plus/issues/6208)) ([7d4d70a](https://github.com/Cap-go/capacitor-plus/commit/7d4d70a0500b7996c710c0762907f44bdf27c92b)) +- **ios/android:** copy url from nativeResponse to response ([#6482](https://github.com/Cap-go/capacitor-plus/issues/6482)) ([828fb71](https://github.com/Cap-go/capacitor-plus/commit/828fb71ebb52c0655d5879ad0edaac7368ab2b96)) +- **ios:** Add check for both serverURL and localURL in navigation ([#5736](https://github.com/Cap-go/capacitor-plus/issues/5736)) ([8e824f3](https://github.com/Cap-go/capacitor-plus/commit/8e824f33ad4df898fb8c0936a8f5e9041832a5c5)) +- **ios:** Add Codable folder to podspec source_files ([#7131](https://github.com/Cap-go/capacitor-plus/issues/7131)) ([04d1d55](https://github.com/Cap-go/capacitor-plus/commit/04d1d557b51fcac31281a3f547300f06c6dacfb2)) +- **ios:** add some new cordova-ios classes used by Cordova plugins ([#7096](https://github.com/Cap-go/capacitor-plus/issues/7096)) ([3db9051](https://github.com/Cap-go/capacitor-plus/commit/3db9051eb015cf5f402f81b4cbaa7b27a5c9477a)) +- **ios:** also call bridge.reset() on webViewWebContentProcessDidTerminate ([#8143](https://github.com/Cap-go/capacitor-plus/issues/8143)) ([1de1f15](https://github.com/Cap-go/capacitor-plus/commit/1de1f157169bc0e23060ffabf044c6d391b98efe)) +- **ios:** Avoid double encoding on http urls ([#6288](https://github.com/Cap-go/capacitor-plus/issues/6288)) ([4768085](https://github.com/Cap-go/capacitor-plus/commit/4768085414768bb2c013afcc6c645664893cd297)) +- **ios:** CapacitorHttp cannot use delete method ([#6220](https://github.com/Cap-go/capacitor-plus/issues/6220)) ([4d238a9](https://github.com/Cap-go/capacitor-plus/commit/4d238a9e0dcf1e3e8c105c3aa4c7361abf16398e)) +- **ios:** check if urlSchemeTask is stopped before calling its methods ([#7482](https://github.com/Cap-go/capacitor-plus/issues/7482)) ([b32b5b1](https://github.com/Cap-go/capacitor-plus/commit/b32b5b17ed14bd43c846b3fcb930bfd88e245e40)) +- **ios:** Correctly Attach Headers to Request ([#6303](https://github.com/Cap-go/capacitor-plus/issues/6303)) ([a3f875c](https://github.com/Cap-go/capacitor-plus/commit/a3f875cf42e111fde07d6e87643264b19ed77573)) +- **ios:** crash when http headers contain numbers ([#6251](https://github.com/Cap-go/capacitor-plus/issues/6251)) ([028c556](https://github.com/Cap-go/capacitor-plus/commit/028c556a50b41ee99fe8f4f1aa2f42d3fd57f92d)) +- **ios:** don't check isMediaExtension on range requests ([#7868](https://github.com/Cap-go/capacitor-plus/issues/7868)) ([028caa5](https://github.com/Cap-go/capacitor-plus/commit/028caa5378d359fb1004098aa93a24ad0f49a4ae)) +- **ios:** encode whitespace in http plugin urls ([#6169](https://github.com/Cap-go/capacitor-plus/issues/6169)) ([dccb0a9](https://github.com/Cap-go/capacitor-plus/commit/dccb0a99850c7c878906156a509ecd675836ef1a)) +- **ios:** error data is optional ([#5782](https://github.com/Cap-go/capacitor-plus/issues/5782)) ([da48d79](https://github.com/Cap-go/capacitor-plus/commit/da48d798c3463de9de188ae6a6475fd6afba6091)) +- **ios:** Event listeners were unexpectedly nil ([#6445](https://github.com/Cap-go/capacitor-plus/issues/6445)) ([209d4ed](https://github.com/Cap-go/capacitor-plus/commit/209d4edace610b00e689440a5c08e72f5da60cc2)) +- **ios:** fix retain cycle caused by CDVPluginManager ([#7692](https://github.com/Cap-go/capacitor-plus/issues/7692)) ([02bdb3d](https://github.com/Cap-go/capacitor-plus/commit/02bdb3d1d15907dcc577f16b7f2e22050e54ffef)) +- **ios:** listen for CapacitorViewDidAppear ([#7850](https://github.com/Cap-go/capacitor-plus/issues/7850)) ([e24ffb7](https://github.com/Cap-go/capacitor-plus/commit/e24ffb7d4de0bf3d53e92537f21c864f121c1fad)) +- **ios:** Make Bridge webView first responder ([#7753](https://github.com/Cap-go/capacitor-plus/issues/7753)) ([77e4668](https://github.com/Cap-go/capacitor-plus/commit/77e4668fa8dbb24b4561387e101547f74e37538e)) +- **ios:** make removeAllListeners accessible from javascript ([#7566](https://github.com/Cap-go/capacitor-plus/issues/7566)) ([388a822](https://github.com/Cap-go/capacitor-plus/commit/388a8223c60e8eac8437ca4cb26a93ab359f53ad)) +- **ios:** make removeAllListeners return a promise ([#5526](https://github.com/Cap-go/capacitor-plus/issues/5526)) ([815f71b](https://github.com/Cap-go/capacitor-plus/commit/815f71b6b62f6c4d5f66e6a36c190bb00a96fdcc)) +- **ios:** move PrivacyInfo.xcprivacy to resource_bundles to fix build… ([#8264](https://github.com/Cap-go/capacitor-plus/issues/8264)) ([e6f50b8](https://github.com/Cap-go/capacitor-plus/commit/e6f50b8c0c41acaaa21af373e195751508c37e9d)) +- **ios:** Moves `updateBinaryVersion` call to the end of `loadView`. ([#7226](https://github.com/Cap-go/capacitor-plus/issues/7226)) ([7724760](https://github.com/Cap-go/capacitor-plus/commit/77247602ac150797d2375118f702cf9ba39ea957)) +- **ios:** overwrite CORS headers on livereload ([#7339](https://github.com/Cap-go/capacitor-plus/issues/7339)) ([0c8d69b](https://github.com/Cap-go/capacitor-plus/commit/0c8d69b7f9c163730e7d74bb0147b61742c61676)) +- **ios:** Prevent Xcode 14 warning on CAPWebView ([#5821](https://github.com/Cap-go/capacitor-plus/issues/5821)) ([66954ef](https://github.com/Cap-go/capacitor-plus/commit/66954ef6bc93f2038d85a386ef2f8b582af11bc3)) +- **ios:** properly deliver retained events after listener re-add [#5732](https://github.com/Cap-go/capacitor-plus/issues/5732) ([c5d6328](https://github.com/Cap-go/capacitor-plus/commit/c5d632831924a1bcc868bc46b42f7ff619408752)) +- **ios:** publish Podfile script ([#5799](https://github.com/Cap-go/capacitor-plus/issues/5799)) ([604f03a](https://github.com/Cap-go/capacitor-plus/commit/604f03a29bc500d2841987d0a0f1b20d34fba7d6)) +- **ios:** Reload webView on webViewWebContentProcessDidTerminate ([#5391](https://github.com/Cap-go/capacitor-plus/issues/5391)) ([beebff4](https://github.com/Cap-go/capacitor-plus/commit/beebff4550575c28c233937a11a8eacf5a76411c)) +- **ios:** Remove CocoaPods Xcode 15 workaround that causes issues ([#7059](https://github.com/Cap-go/capacitor-plus/issues/7059)) ([043a8db](https://github.com/Cap-go/capacitor-plus/commit/043a8dba4059e33c7445696c186110bef1130e16)) +- **ios:** Remove Cordova as an embedded framework ([#5709](https://github.com/Cap-go/capacitor-plus/issues/5709)) ([bbf6d24](https://github.com/Cap-go/capacitor-plus/commit/bbf6d248bf9217a5c5c6c15c7bcfeda209aba5b1)) +- **ios:** Remove Cordova UIView extension ([#8189](https://github.com/Cap-go/capacitor-plus/issues/8189)) ([0c7bcd3](https://github.com/Cap-go/capacitor-plus/commit/0c7bcd3d10f3e3d5a1259f5096879771f8e26436)) +- **ios:** replace deprecation warnings ([#8156](https://github.com/Cap-go/capacitor-plus/issues/8156)) ([e76b29b](https://github.com/Cap-go/capacitor-plus/commit/e76b29b77a7d71ef2341dd3aa530c5d9f291a941)) +- **ios:** Reset plugin listeners when WebView process is terminated ([#7905](https://github.com/Cap-go/capacitor-plus/issues/7905)) ([d039157](https://github.com/Cap-go/capacitor-plus/commit/d0391576726955b2c1b484f1ca9a03465b9ef67e)) +- **ios:** respect shouldEncodeUrlParams value ([#7931](https://github.com/Cap-go/capacitor-plus/issues/7931)) ([4fb12a0](https://github.com/Cap-go/capacitor-plus/commit/4fb12a03a92c0f38b0d48b114252342f4bdc17bf)) +- **ios:** Return proper MIME Type for local WASM files ([#6675](https://github.com/Cap-go/capacitor-plus/issues/6675)) ([d7856de](https://github.com/Cap-go/capacitor-plus/commit/d7856de62a4c058ac474ae91a5fd221dabf99c0a)) +- **ios:** return proper mimeType on M1 x86_64 simulators ([#5853](https://github.com/Cap-go/capacitor-plus/issues/5853)) ([325b6fe](https://github.com/Cap-go/capacitor-plus/commit/325b6fe83939efaaef44c7e8624e33de742a57e2)), closes [#5793](https://github.com/Cap-go/capacitor-plus/issues/5793) +- **ios:** Revert server url addition for CAPWebView. ([#6705](https://github.com/Cap-go/capacitor-plus/issues/6705)) ([1b8352d](https://github.com/Cap-go/capacitor-plus/commit/1b8352dc5124dc3f57d7881d619537cbf8c3674b)) +- **iOS:** Separate cookies by `; ` rather than `;` when accessing through `document.cookie` ([#6313](https://github.com/Cap-go/capacitor-plus/issues/6313)) ([beade60](https://github.com/Cap-go/capacitor-plus/commit/beade6020e25dc405e796e1b06bf6dd90b217693)) +- **ios:** set cors headers in asset handler for live reload ([e5a1c81](https://github.com/Cap-go/capacitor-plus/commit/e5a1c81fe81904dfd7e3f5100a04088173effc1c)) +- **ios:** Silence WKProcessPool warning ([#8184](https://github.com/Cap-go/capacitor-plus/issues/8184)) ([b6abcb7](https://github.com/Cap-go/capacitor-plus/commit/b6abcb7d656ee24e48a5d0dc7b68888b0318fe5d)) +- **ios:** Use `URL(fileURLWithPath:)` instead of `URL(string:)` ([#5603](https://github.com/Cap-go/capacitor-plus/issues/5603)) ([5fac1b2](https://github.com/Cap-go/capacitor-plus/commit/5fac1b2da5aa5882087716cb2aa862d89173f4a1)) +- **ios:** use ReturnPromise for SystemBars returnType ([#8239](https://github.com/Cap-go/capacitor-plus/issues/8239)) ([eb51288](https://github.com/Cap-go/capacitor-plus/commit/eb5128866953281dc7bed88bd734fc3804b3a702)) +- make Plugin.resolve act consistently ([#8225](https://github.com/Cap-go/capacitor-plus/issues/8225)) ([06aeb9e](https://github.com/Cap-go/capacitor-plus/commit/06aeb9e85d162d6be9d96820edcb2008cd74da84)) +- Remove all plugin listeners in bridge reset ([#7962](https://github.com/Cap-go/capacitor-plus/issues/7962)) ([06aeea9](https://github.com/Cap-go/capacitor-plus/commit/06aeea973aa56ac2fb791f893ebd899253ee65f9)) +- remove duplicates from auto registration array using set ([#7192](https://github.com/Cap-go/capacitor-plus/issues/7192)) ([c4984ae](https://github.com/Cap-go/capacitor-plus/commit/c4984ae4433602dbe028f72736cb6e56e8f92bf9)) +- stop crashing from `objc_getClassList` ([#7187](https://github.com/Cap-go/capacitor-plus/issues/7187)) ([e148db7](https://github.com/Cap-go/capacitor-plus/commit/e148db7758e4186ad45fd74185a10fb757ff9b29)) +- vue 3 log warning causes error on iOS ([#6993](https://github.com/Cap-go/capacitor-plus/issues/6993)) ([87271e2](https://github.com/Cap-go/capacitor-plus/commit/87271e2671013ad35d13b22f2e96d4fe8f4eeaf0)) + +### Features + +- Add CapWebView ([#5715](https://github.com/Cap-go/capacitor-plus/issues/5715)) ([143d266](https://github.com/Cap-go/capacitor-plus/commit/143d266ef0a818bac59dbbdaeda3b5c382ebfa1d)) +- Add function to inject external JS into WebView before document load ([#7864](https://github.com/Cap-go/capacitor-plus/issues/7864)) ([ec0954c](https://github.com/Cap-go/capacitor-plus/commit/ec0954c197543e913939f3ab9c4bcb172bfa3530)) +- Add global initialFocus configuration ([#7775](https://github.com/Cap-go/capacitor-plus/issues/7775)) ([61d0165](https://github.com/Cap-go/capacitor-plus/commit/61d01653685d8e3594d2d8a6bd870fa9643ba95c)) +- Add option for custom error page ([#5723](https://github.com/Cap-go/capacitor-plus/issues/5723)) ([e8bdef3](https://github.com/Cap-go/capacitor-plus/commit/e8bdef3b4634e4ad45fa8fc34c7c0ab8dfa383f3)) +- Add XCFrameworks ([#7020](https://github.com/Cap-go/capacitor-plus/issues/7020)) ([5306095](https://github.com/Cap-go/capacitor-plus/commit/53060955dc83cdbfda66bed60c2efcba395a9ca8)) +- **android:** Add Optional Data Param for Error Object ([#5719](https://github.com/Cap-go/capacitor-plus/issues/5719)) ([174172b](https://github.com/Cap-go/capacitor-plus/commit/174172b6c64dc9117c48ed0e20c25e0b6c2fb625)) +- **android:** Improving SystemBars inset handling ([#8268](https://github.com/Cap-go/capacitor-plus/issues/8268)) ([81ae30a](https://github.com/Cap-go/capacitor-plus/commit/81ae30a503797e417dd125b06262dabc4696c88a)) +- **android:** Use addWebMessageListener where available ([#5427](https://github.com/Cap-go/capacitor-plus/issues/5427)) ([c2dfe80](https://github.com/Cap-go/capacitor-plus/commit/c2dfe808446717412b35e82713d123b7a052f264)) +- Capacitor Cookies & Capacitor Http core plugins ([d4047cf](https://github.com/Cap-go/capacitor-plus/commit/d4047cfa947676777f400389a8d65defae140b45)) +- **cookies:** add get cookies plugin method ([ba1e770](https://github.com/Cap-go/capacitor-plus/commit/ba1e7702a3338714aee24388c0afea39706c9341)) +- **core:** expose `methodName` via `CAPPluginCall` ([#7641](https://github.com/Cap-go/capacitor-plus/issues/7641)) ([df109aa](https://github.com/Cap-go/capacitor-plus/commit/df109aa1cfa1ea824e22feecbd2b7183a57fc693)) +- expose `appStartPath` on cap config server configuration ([#8019](https://github.com/Cap-go/capacitor-plus/issues/8019)) ([a274fef](https://github.com/Cap-go/capacitor-plus/commit/a274fef069176a8e528a22f4734d1e29a539709c)) +- **http:** Apply overrideUserAgent to requests ([#7906](https://github.com/Cap-go/capacitor-plus/issues/7906)) ([52482c9](https://github.com/Cap-go/capacitor-plus/commit/52482c9d3c575b737054b41f9d1730c70cc5f471)) +- **http:** support for FormData requests ([#6708](https://github.com/Cap-go/capacitor-plus/issues/6708)) ([849c564](https://github.com/Cap-go/capacitor-plus/commit/849c56458205bea3b078b1ee19807d7fd84c47b1)) +- Implement automated upstream sync and review process for Capacitor+ ([54a5dfb](https://github.com/Cap-go/capacitor-plus/commit/54a5dfbd1f81ca4144e13b3051bf592d3aaf1f4a)) +- **iOS, Android:** add AppUUID Lib for plugins ([#5690](https://github.com/Cap-go/capacitor-plus/issues/5690)) ([05e76cf](https://github.com/Cap-go/capacitor-plus/commit/05e76cf526a44e07fa75f9482fa2223a13918638)) +- **ios:** Add `setServerBasePath(_:)` to CAPBridgeProtocol ([#5860](https://github.com/Cap-go/capacitor-plus/issues/5860)) ([76f28e7](https://github.com/Cap-go/capacitor-plus/commit/76f28e70a5c0a03e4c6b9a93a0c068666a2c38ff)) +- **ios:** Add `setServerBasePath(path:)` to CAPWebView ([#5742](https://github.com/Cap-go/capacitor-plus/issues/5742)) ([1afbf8a](https://github.com/Cap-go/capacitor-plus/commit/1afbf8a9dd0b8f7b1ac439d24e5d8ba26f786318)) +- **ios:** Add Codable support for CAPPluginCall and JSValueContainer ([#7119](https://github.com/Cap-go/capacitor-plus/issues/7119)) ([af417e0](https://github.com/Cap-go/capacitor-plus/commit/af417e0cbbb1a3a7b3b62756eebb8d1dc0952cc4)) +- **ios:** add getConfig to CAPPlugin ([#5495](https://github.com/Cap-go/capacitor-plus/issues/5495)) ([224a9d0](https://github.com/Cap-go/capacitor-plus/commit/224a9d075629d9c9da9ddc658eb282617fc46d09)) +- **ios:** Add new iOS 15 Motion permission delegate ([#5317](https://github.com/Cap-go/capacitor-plus/issues/5317)) ([c05a3cb](https://github.com/Cap-go/capacitor-plus/commit/c05a3cbbf02217e3972d5e067970cae18bff3faa)) +- **ios:** Add new iOS15 media capture permission delegate ([#5196](https://github.com/Cap-go/capacitor-plus/issues/5196)) ([d8b54ac](https://github.com/Cap-go/capacitor-plus/commit/d8b54ac23414bfe56e50e1254066630a6f87eb0e)) +- **ios:** Add overrideable router var for CAPWebView. ([#5743](https://github.com/Cap-go/capacitor-plus/issues/5743)) ([c1de1c0](https://github.com/Cap-go/capacitor-plus/commit/c1de1c0138aad188a760118e35983d10d257f8e7)) +- **ios:** Add overrideable routing for CAPBridgeViewController subclasses ([#5546](https://github.com/Cap-go/capacitor-plus/issues/5546)) ([8875d5e](https://github.com/Cap-go/capacitor-plus/commit/8875d5e2721e8a8ee763ce70cb672db383f36efa)) +- **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/Cap-go/capacitor-plus/issues/5583)) ([5b6dfa3](https://github.com/Cap-go/capacitor-plus/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475)) +- **ios:** add webContentsDebuggingEnabled configuration ([#6495](https://github.com/Cap-go/capacitor-plus/issues/6495)) ([c691e4a](https://github.com/Cap-go/capacitor-plus/commit/c691e4aecbfb7a45ce0465d1fe9020ab715815d3)) +- **iOS:** Allow plugins to hook into handling WebView URL authentication challenges ([#8216](https://github.com/Cap-go/capacitor-plus/issues/8216)) ([e8507cf](https://github.com/Cap-go/capacitor-plus/commit/e8507cfe4d93337ddee8ab6597aab5209ebb4858)) +- **ios:** Allow to configure popover size ([#5717](https://github.com/Cap-go/capacitor-plus/issues/5717)) ([ca1a125](https://github.com/Cap-go/capacitor-plus/commit/ca1a125e5ab05d6066dd303bc75e99dfe21f210a)) +- **ios:** Alternative debug config for SPM ([#7982](https://github.com/Cap-go/capacitor-plus/issues/7982)) ([a054aa5](https://github.com/Cap-go/capacitor-plus/commit/a054aa5bb4d5eabe5da5d42a380bd51b8785958c)) +- **ios:** CAPPluginMethod selector-based initializer ([#7412](https://github.com/Cap-go/capacitor-plus/issues/7412)) ([44c5b55](https://github.com/Cap-go/capacitor-plus/commit/44c5b55e36b85471a85ee5a1af47bdb1a5d83a8b)) +- **ios:** Enable Fullscreen API on WebView ([#7909](https://github.com/Cap-go/capacitor-plus/issues/7909)) ([172638e](https://github.com/Cap-go/capacitor-plus/commit/172638ec7b6eb67bf25f8dac2818122ba31c2c91)) +- **ios:** JSValueEncoder/Decoder feature parity with JSONEncoder/Decoder ([#7647](https://github.com/Cap-go/capacitor-plus/issues/7647)) ([410249b](https://github.com/Cap-go/capacitor-plus/commit/410249b6c626e67235f25b466ed4969d52148bd1)), closes [#7576](https://github.com/Cap-go/capacitor-plus/issues/7576) +- **ios:** Makes CapacitorBridge, WebViewAssetHandler, and WebViewDelegationHandler open classes, along with several of their methods ([#7009](https://github.com/Cap-go/capacitor-plus/issues/7009)) ([40d62cb](https://github.com/Cap-go/capacitor-plus/commit/40d62cbce950c2f3972764fe134cc37f2343f33d)) +- **ios:** Plugin Registration and Plugin Instance Support ([#6072](https://github.com/Cap-go/capacitor-plus/issues/6072)) ([9f1d863](https://github.com/Cap-go/capacitor-plus/commit/9f1d863c1222096334a0dd05f39ce7f984a2763a)) +- **iOS:** post install script for deployment target ([#5783](https://github.com/Cap-go/capacitor-plus/issues/5783)) ([f5afa94](https://github.com/Cap-go/capacitor-plus/commit/f5afa94b3b9c246d87b2af03359840f503bace90)) +- **ios:** Replace usage of UserDefaults with KeyValueStore. ([#7191](https://github.com/Cap-go/capacitor-plus/issues/7191)) ([cd58ba2](https://github.com/Cap-go/capacitor-plus/commit/cd58ba2a654f40bf72616f430d7b9604b283e23d)) +- **ios:** Support of range requests on WebViewAssetHandler ([#5659](https://github.com/Cap-go/capacitor-plus/issues/5659)) ([348c08d](https://github.com/Cap-go/capacitor-plus/commit/348c08d511e9d57a1b2ecedc3290c65fa9ba3924)) +- modify package.swift on update and sync ([#7042](https://github.com/Cap-go/capacitor-plus/issues/7042)) ([24573fb](https://github.com/Cap-go/capacitor-plus/commit/24573fb864c43551e2ce42721b45ff901155627d)) +- retain multiple calls per event until consumed ([#6419](https://github.com/Cap-go/capacitor-plus/issues/6419)) ([5aba2cb](https://github.com/Cap-go/capacitor-plus/commit/5aba2cbe29bdbab2a7af861c65d8323acf9c54a6)) +- System Bars Plugin ([#8180](https://github.com/Cap-go/capacitor-plus/issues/8180)) ([a32216a](https://github.com/Cap-go/capacitor-plus/commit/a32216ac0607172a3a9c7ae5cdbfc598769294a6)) +- **webview:** add setServerAssetPath method ([881235b](https://github.com/Cap-go/capacitor-plus/commit/881235b14de23ef988746bfb89a5a0fc3c8d8466)) + +## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) + +### Bug Fixes + +- boundary value extraction for form-data requests ([#7518](https://github.com/ionic-team/capacitor/issues/7518)) ([64ab854](https://github.com/ionic-team/capacitor/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d)) + ## [8.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) ### Bug Fixes @@ -70,29 +370,29 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) -### Bug Fixes +## Bug Fixes - **ios:** move PrivacyInfo.xcprivacy to resource_bundles to fix build… ([#8264](https://github.com/ionic-team/capacitor/issues/8264)) ([e6f50b8](https://github.com/ionic-team/capacitor/commit/e6f50b8c0c41acaaa21af373e195751508c37e9d)) -### Features +## Features - **android:** Improving SystemBars inset handling ([#8268](https://github.com/ionic-team/capacitor/issues/8268)) ([81ae30a](https://github.com/ionic-team/capacitor/commit/81ae30a503797e417dd125b06262dabc4696c88a)) # [8.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/8.0.0-alpha.3...8.0.0-beta.0) (2025-11-14) -### Bug Fixes +## Bug Fixes - **ios:** use ReturnPromise for SystemBars returnType ([#8239](https://github.com/ionic-team/capacitor/issues/8239)) ([eb51288](https://github.com/ionic-team/capacitor/commit/eb5128866953281dc7bed88bd734fc3804b3a702)) - make Plugin.resolve act consistently ([#8225](https://github.com/ionic-team/capacitor/issues/8225)) ([06aeb9e](https://github.com/ionic-team/capacitor/commit/06aeb9e85d162d6be9d96820edcb2008cd74da84)) -### Features +## Features - **iOS:** Allow plugins to hook into handling WebView URL authentication challenges ([#8216](https://github.com/ionic-team/capacitor/issues/8216)) ([e8507cf](https://github.com/ionic-team/capacitor/commit/e8507cfe4d93337ddee8ab6597aab5209ebb4858)) - System Bars Plugin ([#8180](https://github.com/ionic-team/capacitor/issues/8180)) ([a32216a](https://github.com/ionic-team/capacitor/commit/a32216ac0607172a3a9c7ae5cdbfc598769294a6)) # [8.0.0-alpha.3](https://github.com/ionic-team/capacitor/compare/8.0.0-alpha.2...8.0.0-alpha.3) (2025-10-22) -### Bug Fixes +## Bug Fixes - **ios:** also call bridge.reset() on webViewWebContentProcessDidTerminate ([#8143](https://github.com/ionic-team/capacitor/issues/8143)) ([1de1f15](https://github.com/ionic-team/capacitor/commit/1de1f157169bc0e23060ffabf044c6d391b98efe)) - **ios:** Remove Cordova UIView extension ([#8189](https://github.com/ionic-team/capacitor/issues/8189)) ([0c7bcd3](https://github.com/ionic-team/capacitor/commit/0c7bcd3d10f3e3d5a1259f5096879771f8e26436)) @@ -105,7 +405,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [8.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/7.4.2...8.0.0-alpha.1) (2025-08-20) -### Bug Fixes +## Bug Fixes - http content headers not sent when using axios ([#8039](https://github.com/ionic-team/capacitor/issues/8039)) ([67cac40](https://github.com/ionic-team/capacitor/commit/67cac40660b3e8cc78d1d228b7c6915450948ef1)) @@ -125,36 +425,36 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.3.0](https://github.com/ionic-team/capacitor/compare/7.2.0...7.3.0) (2025-06-05) -### Bug Fixes +## Bug Fixes - Remove all plugin listeners in bridge reset ([#7962](https://github.com/ionic-team/capacitor/issues/7962)) ([06aeea9](https://github.com/ionic-team/capacitor/commit/06aeea973aa56ac2fb791f893ebd899253ee65f9)) -### Features +## Features - expose `appStartPath` on cap config server configuration ([#8019](https://github.com/ionic-team/capacitor/issues/8019)) ([a274fef](https://github.com/ionic-team/capacitor/commit/a274fef069176a8e528a22f4734d1e29a539709c)) - **ios:** Alternative debug config for SPM ([#7982](https://github.com/ionic-team/capacitor/issues/7982)) ([a054aa5](https://github.com/ionic-team/capacitor/commit/a054aa5bb4d5eabe5da5d42a380bd51b8785958c)) # [7.2.0](https://github.com/ionic-team/capacitor/compare/7.1.0...7.2.0) (2025-03-31) -### Bug Fixes +## Bug Fixes - **ios:** respect shouldEncodeUrlParams value ([#7931](https://github.com/ionic-team/capacitor/issues/7931)) ([4fb12a0](https://github.com/ionic-team/capacitor/commit/4fb12a03a92c0f38b0d48b114252342f4bdc17bf)) -### Features +## Features - **http:** Apply overrideUserAgent to requests ([#7906](https://github.com/ionic-team/capacitor/issues/7906)) ([52482c9](https://github.com/ionic-team/capacitor/commit/52482c9d3c575b737054b41f9d1730c70cc5f471)) - **ios:** Enable Fullscreen API on WebView ([#7909](https://github.com/ionic-team/capacitor/issues/7909)) ([172638e](https://github.com/ionic-team/capacitor/commit/172638ec7b6eb67bf25f8dac2818122ba31c2c91)) # [7.1.0](https://github.com/ionic-team/capacitor/compare/7.0.1...7.1.0) (2025-03-12) -### Bug Fixes +## Bug Fixes - **http:** boundary not added for Request objects ([#7897](https://github.com/ionic-team/capacitor/issues/7897)) ([bdaa6f3](https://github.com/ionic-team/capacitor/commit/bdaa6f3c38c33f3a021ac61f2de89101a5b66cff)) - **ios:** don't check isMediaExtension on range requests ([#7868](https://github.com/ionic-team/capacitor/issues/7868)) ([028caa5](https://github.com/ionic-team/capacitor/commit/028caa5378d359fb1004098aa93a24ad0f49a4ae)) - **ios:** listen for CapacitorViewDidAppear ([#7850](https://github.com/ionic-team/capacitor/issues/7850)) ([e24ffb7](https://github.com/ionic-team/capacitor/commit/e24ffb7d4de0bf3d53e92537f21c864f121c1fad)) - **ios:** Reset plugin listeners when WebView process is terminated ([#7905](https://github.com/ionic-team/capacitor/issues/7905)) ([d039157](https://github.com/ionic-team/capacitor/commit/d0391576726955b2c1b484f1ca9a03465b9ef67e)) -### Features +## Features - Add function to inject external JS into WebView before document load ([#7864](https://github.com/ionic-team/capacitor/issues/7864)) ([ec0954c](https://github.com/ionic-team/capacitor/commit/ec0954c197543e913939f3ab9c4bcb172bfa3530)) @@ -176,11 +476,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/7.0.0-alpha.2...7.0.0-beta.0) (2024-12-20) -### Bug Fixes +## Bug Fixes - **ios:** Make Bridge webView first responder ([#7753](https://github.com/ionic-team/capacitor/issues/7753)) ([77e4668](https://github.com/ionic-team/capacitor/commit/77e4668fa8dbb24b4561387e101547f74e37538e)) -### Features +## Features - Add global initialFocus configuration ([#7775](https://github.com/ionic-team/capacitor/issues/7775)) ([61d0165](https://github.com/ionic-team/capacitor/commit/61d01653685d8e3594d2d8a6bd870fa9643ba95c)) @@ -190,11 +490,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [7.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/6.1.2...7.0.0-alpha.1) (2024-10-14) -### Bug Fixes +## Bug Fixes - **ios:** fix retain cycle caused by CDVPluginManager ([#7692](https://github.com/ionic-team/capacitor/issues/7692)) ([02bdb3d](https://github.com/ionic-team/capacitor/commit/02bdb3d1d15907dcc577f16b7f2e22050e54ffef)) -### Features +## Features - **core:** expose `methodName` via `CAPPluginCall` ([#7641](https://github.com/ionic-team/capacitor/issues/7641)) ([df109aa](https://github.com/ionic-team/capacitor/commit/df109aa1cfa1ea824e22feecbd2b7183a57fc693)) - **ios:** JSValueEncoder/Decoder feature parity with JSONEncoder/Decoder ([#7647](https://github.com/ionic-team/capacitor/issues/7647)) ([410249b](https://github.com/ionic-team/capacitor/commit/410249b6c626e67235f25b466ed4969d52148bd1)), closes [#7576](https://github.com/ionic-team/capacitor/issues/7576) @@ -214,25 +514,25 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.1.0](https://github.com/ionic-team/capacitor/compare/6.0.0...6.1.0) (2024-06-11) -### Bug Fixes +## Bug Fixes - **http:** don't override readyState for non POST requests ([#7488](https://github.com/ionic-team/capacitor/issues/7488)) ([30c13a8](https://github.com/ionic-team/capacitor/commit/30c13a865e7710e6dc5f0ee014e951d52d030795)) - **ios:** check if urlSchemeTask is stopped before calling its methods ([#7482](https://github.com/ionic-team/capacitor/issues/7482)) ([b32b5b1](https://github.com/ionic-team/capacitor/commit/b32b5b17ed14bd43c846b3fcb930bfd88e245e40)) -### Features +## Features - **ios:** CAPPluginMethod selector-based initializer ([#7412](https://github.com/ionic-team/capacitor/issues/7412)) ([44c5b55](https://github.com/ionic-team/capacitor/commit/44c5b55e36b85471a85ee5a1af47bdb1a5d83a8b)) # [6.0.0](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.2...6.0.0) (2024-04-15) -### Bug Fixes +## Bug Fixes - **http:** Add URLSearchParams support ([#7374](https://github.com/ionic-team/capacitor/issues/7374)) ([9367ecc](https://github.com/ionic-team/capacitor/commit/9367ecc56a0c78249dccdf95dca5006422144289)) - **http:** prevent POST request from being proxied ([#7395](https://github.com/ionic-team/capacitor/issues/7395)) ([7b8c352](https://github.com/ionic-team/capacitor/commit/7b8c3523decd5610dcf09e926640bf35b382d61d)) # [6.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.1...6.0.0-rc.2) (2024-03-25) -### Bug Fixes +## Bug Fixes - **http:** change proxy url generation ([#7354](https://github.com/ionic-team/capacitor/issues/7354)) ([318c316](https://github.com/ionic-team/capacitor/commit/318c316847c5b059fb88b46d4acd31e1ced477e5)) - inject cordova files if a cordova plugin is present ([#7363](https://github.com/ionic-team/capacitor/issues/7363)) ([ce9d505](https://github.com/ionic-team/capacitor/commit/ce9d50585b1cab183245197878bf625cf0289275)) @@ -240,7 +540,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/6.0.0-rc.0...6.0.0-rc.1) (2024-03-15) -### Bug Fixes +## Bug Fixes - **core:** make 'content-type' header count for XMLHttpRequest patch ([#7161](https://github.com/ionic-team/capacitor/issues/7161)) ([26d7f68](https://github.com/ionic-team/capacitor/commit/26d7f688284914c6ef795564ba424119efc32a1c)) - **http:** handle proxy urls with port ([#7273](https://github.com/ionic-team/capacitor/issues/7273)) ([514409a](https://github.com/ionic-team/capacitor/commit/514409aeb93ad65be105bbe2da8d2cd86ff159b0)) @@ -251,18 +551,18 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - **ios:** Moves `updateBinaryVersion` call to the end of `loadView`. ([#7226](https://github.com/ionic-team/capacitor/issues/7226)) ([7724760](https://github.com/ionic-team/capacitor/commit/77247602ac150797d2375118f702cf9ba39ea957)) - **ios:** overwrite CORS headers on livereload ([#7339](https://github.com/ionic-team/capacitor/issues/7339)) ([0c8d69b](https://github.com/ionic-team/capacitor/commit/0c8d69b7f9c163730e7d74bb0147b61742c61676)) -### Features +## Features - **webview:** add setServerAssetPath method ([881235b](https://github.com/ionic-team/capacitor/commit/881235b14de23ef988746bfb89a5a0fc3c8d8466)) # [6.0.0-rc.0](https://github.com/ionic-team/capacitor/compare/6.0.0-beta.2...6.0.0-rc.0) (2024-01-23) -### Bug Fixes +## Bug Fixes - remove duplicates from auto registration array using set ([#7192](https://github.com/ionic-team/capacitor/issues/7192)) ([c4984ae](https://github.com/ionic-team/capacitor/commit/c4984ae4433602dbe028f72736cb6e56e8f92bf9)) - stop crashing from `objc_getClassList` ([#7187](https://github.com/ionic-team/capacitor/issues/7187)) ([e148db7](https://github.com/ionic-team/capacitor/commit/e148db7758e4186ad45fd74185a10fb757ff9b29)) -### Features +## Features - **ios:** Replace usage of UserDefaults with KeyValueStore. ([#7191](https://github.com/ionic-team/capacitor/issues/7191)) ([cd58ba2](https://github.com/ionic-team/capacitor/commit/cd58ba2a654f40bf72616f430d7b9604b283e23d)) @@ -272,36 +572,36 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [6.0.0-beta.1](https://github.com/ionic-team/capacitor/compare/6.0.0-beta.0...6.0.0-beta.1) (2023-12-14) -### Bug Fixes +## Bug Fixes - **ios:** Add Codable folder to podspec source_files ([#7131](https://github.com/ionic-team/capacitor/issues/7131)) ([04d1d55](https://github.com/ionic-team/capacitor/commit/04d1d557b51fcac31281a3f547300f06c6dacfb2)) # [6.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/6.0.0-alpha.2...6.0.0-beta.0) (2023-12-13) -### Bug Fixes +## Bug Fixes - **http:** parse readablestream data on fetch request objects ([#6919](https://github.com/ionic-team/capacitor/issues/6919)) ([80ec3b7](https://github.com/ionic-team/capacitor/commit/80ec3b73db18b7b6841bf90ed50a67389946ab87)) - **ios:** add some new cordova-ios classes used by Cordova plugins ([#7096](https://github.com/ionic-team/capacitor/issues/7096)) ([3db9051](https://github.com/ionic-team/capacitor/commit/3db9051eb015cf5f402f81b4cbaa7b27a5c9477a)) -### Features +## Features - **ios:** Add Codable support for CAPPluginCall and JSValueContainer ([#7119](https://github.com/ionic-team/capacitor/issues/7119)) ([af417e0](https://github.com/ionic-team/capacitor/commit/af417e0cbbb1a3a7b3b62756eebb8d1dc0952cc4)) # [6.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/6.0.0-alpha.1...6.0.0-alpha.2) (2023-11-15) -### Bug Fixes +## Bug Fixes - **ios:** Remove CocoaPods Xcode 15 workaround that causes issues ([#7059](https://github.com/ionic-team/capacitor/issues/7059)) ([043a8db](https://github.com/ionic-team/capacitor/commit/043a8dba4059e33c7445696c186110bef1130e16)) # [6.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/5.2.3...6.0.0-alpha.1) (2023-11-08) -### Bug Fixes +## Bug Fixes - **android:** make local urls use unpatched fetch ([#6953](https://github.com/ionic-team/capacitor/issues/6953)) ([e50e56c](https://github.com/ionic-team/capacitor/commit/e50e56c5231f230497d1bd420e02e2e065c38f86)) - **http:** add support for Request objects in fetch ([24b3cc1](https://github.com/ionic-team/capacitor/commit/24b3cc113e3d8aae5d85dbf2d25bec0c35136477)) - **http:** inherit object properties on window.XMLHttpRequest ([91c11d0](https://github.com/ionic-team/capacitor/commit/91c11d06f773c45a10f6f2d52f672ae6f189b162)) -### Features +## Features - Add XCFrameworks ([#7020](https://github.com/ionic-team/capacitor/issues/7020)) ([5306095](https://github.com/ionic-team/capacitor/commit/53060955dc83cdbfda66bed60c2efcba395a9ca8)) - **ios:** Makes CapacitorBridge, WebViewAssetHandler, and WebViewDelegationHandler open classes, along with several of their methods ([#7009](https://github.com/ionic-team/capacitor/issues/7009)) ([40d62cb](https://github.com/ionic-team/capacitor/commit/40d62cbce950c2f3972764fe134cc37f2343f33d)) @@ -309,7 +609,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.6.0](https://github.com/ionic-team/capacitor/compare/5.5.1...5.6.0) (2023-12-14) -### Bug Fixes +## Bug Fixes - **ios:** add some new cordova-ios classes used by Cordova plugins ([#7115](https://github.com/ionic-team/capacitor/issues/7115)) ([5fb902b](https://github.com/ionic-team/capacitor/commit/5fb902b232d9afded2edc865c8d3c0c0e7efe5e7)) @@ -339,7 +639,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.4.0](https://github.com/ionic-team/capacitor/compare/5.3.0...5.4.0) (2023-09-14) -### Bug Fixes +## Bug Fixes - **http:** add support for defining xhr and angular http response types ([09bd040](https://github.com/ionic-team/capacitor/commit/09bd040dfe4b8808d7499b6ee592005420406cac)) - **http:** add support for Request objects in fetch ([2fe4535](https://github.com/ionic-team/capacitor/commit/2fe4535e781b1a5cfa0f3359c1afa5c360073b6a)) @@ -371,12 +671,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.2.0](https://github.com/ionic-team/capacitor/compare/5.1.1...5.2.0) (2023-07-12) -### Bug Fixes +## Bug Fixes - **cookies:** sanitize url before retrieving/setting cookies ([ca40634](https://github.com/ionic-team/capacitor/commit/ca4063471f215d3f7525e51592d9c72138a52855)) - **http:** fire events in correct order when using xhr ([5ed3617](https://github.com/ionic-team/capacitor/commit/5ed361787596bb5949f6ae5e366495f296352bf3)) -### Features +## Features - **http:** support for FormData requests ([#6708](https://github.com/ionic-team/capacitor/issues/6708)) ([849c564](https://github.com/ionic-team/capacitor/commit/849c56458205bea3b078b1ee19807d7fd84c47b1)) @@ -388,7 +688,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.1.0](https://github.com/ionic-team/capacitor/compare/5.0.5...5.1.0) (2023-06-29) -### Bug Fixes +## Bug Fixes - **ios:** Return proper MIME Type for local WASM files ([#6675](https://github.com/ionic-team/capacitor/issues/6675)) ([d7856de](https://github.com/ionic-team/capacitor/commit/d7856de62a4c058ac474ae91a5fd221dabf99c0a)) - **ios:** set cors headers in asset handler for live reload ([e5a1c81](https://github.com/ionic-team/capacitor/commit/e5a1c81fe81904dfd7e3f5100a04088173effc1c)) @@ -441,11 +741,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/5.0.0-beta.1...5.0.0-beta.2) (2023-04-13) -### Bug Fixes +## Bug Fixes - **ios/android:** copy url from nativeResponse to response ([#6482](https://github.com/ionic-team/capacitor/issues/6482)) ([828fb71](https://github.com/ionic-team/capacitor/commit/828fb71ebb52c0655d5879ad0edaac7368ab2b96)) -### Features +## Features - **ios:** add webContentsDebuggingEnabled configuration ([#6495](https://github.com/ionic-team/capacitor/issues/6495)) ([c691e4a](https://github.com/ionic-team/capacitor/commit/c691e4aecbfb7a45ce0465d1fe9020ab715815d3)) @@ -455,24 +755,24 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [5.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/5.0.0-alpha.1...5.0.0-beta.0) (2023-03-31) -### Bug Fixes +## Bug Fixes - 204 http response ([#6266](https://github.com/ionic-team/capacitor/issues/6266)) ([771f6ce](https://github.com/ionic-team/capacitor/commit/771f6ce1f35159848db218a42dc4f56b5106f750)) - **ios:** Event listeners were unexpectedly nil ([#6445](https://github.com/ionic-team/capacitor/issues/6445)) ([209d4ed](https://github.com/ionic-team/capacitor/commit/209d4edace610b00e689440a5c08e72f5da60cc2)) -### Features +## Features - retain multiple calls per event until consumed ([#6419](https://github.com/ionic-team/capacitor/issues/6419)) ([5aba2cb](https://github.com/ionic-team/capacitor/commit/5aba2cbe29bdbab2a7af861c65d8323acf9c54a6)) # [5.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/4.7.0...5.0.0-alpha.1) (2023-03-16) -### Bug Fixes +## Bug Fixes - **iOS:** Separate cookies by `; ` rather than `;` when accessing through `document.cookie` ([#6313](https://github.com/ionic-team/capacitor/issues/6313)) ([beade60](https://github.com/ionic-team/capacitor/commit/beade6020e25dc405e796e1b06bf6dd90b217693)) # [4.7.0](https://github.com/ionic-team/capacitor/compare/4.6.3...4.7.0) (2023-02-22) -### Bug Fixes +## Bug Fixes - handle fetch headers that are Headers objects ([#6320](https://github.com/ionic-team/capacitor/issues/6320)) ([cb00e49](https://github.com/ionic-team/capacitor/commit/cb00e4952acca8e877555f30b2190f6685d25934)) - **ios:** Avoid double encoding on http urls ([#6288](https://github.com/ionic-team/capacitor/issues/6288)) ([4768085](https://github.com/ionic-team/capacitor/commit/4768085414768bb2c013afcc6c645664893cd297)) @@ -498,38 +798,38 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.6.0](https://github.com/ionic-team/capacitor/compare/4.5.0...4.6.0) (2022-12-01) -### Bug Fixes +## Bug Fixes - **cookies:** Use Set-Cookie headers to persist cookies ([57f8b39](https://github.com/ionic-team/capacitor/commit/57f8b39d7f4c5ee0e5e5cb316913e9450a81d22b)) -### Features +## Features - **ios:** Plugin Registration and Plugin Instance Support ([#6072](https://github.com/ionic-team/capacitor/issues/6072)) ([9f1d863](https://github.com/ionic-team/capacitor/commit/9f1d863c1222096334a0dd05f39ce7f984a2763a)) # [4.5.0](https://github.com/ionic-team/capacitor/compare/4.4.0...4.5.0) (2022-11-16) -### Bug Fixes +## Bug Fixes - **cli/ios:** Read handleApplicationNotifications configuration option ([#6030](https://github.com/ionic-team/capacitor/issues/6030)) ([99ccf18](https://github.com/ionic-team/capacitor/commit/99ccf181f6ee8a00ed97bdbf9076e2b2ea27cd57)) -### Features +## Features - **cookies:** add get cookies plugin method ([ba1e770](https://github.com/ionic-team/capacitor/commit/ba1e7702a3338714aee24388c0afea39706c9341)) # [4.4.0](https://github.com/ionic-team/capacitor/compare/4.3.0...4.4.0) (2022-10-21) -### Bug Fixes +## Bug Fixes - **cookies:** make document.cookie setter synchronous ([2272abf](https://github.com/ionic-team/capacitor/commit/2272abf3d3d9dc82d9ca0d03b17e2b78f11f61fc)) - **http:** fix local http requests on native platforms ([c4e040a](https://github.com/ionic-team/capacitor/commit/c4e040a6f8c6b54bac6ae320e5f0f008604fe50f)) # [4.3.0](https://github.com/ionic-team/capacitor/compare/4.2.0...4.3.0) (2022-09-21) -### Bug Fixes +## Bug Fixes - **core:** Exception object was not set on Cap ([#5917](https://github.com/ionic-team/capacitor/issues/5917)) ([9ca27a4](https://github.com/ionic-team/capacitor/commit/9ca27a4f8441b368f8bf9d97dda57b1a55ac0e4e)) -### Features +## Features - Capacitor Cookies & Capacitor Http core plugins ([d4047cf](https://github.com/ionic-team/capacitor/commit/d4047cfa947676777f400389a8d65defae140b45)) @@ -539,12 +839,12 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.1.0](https://github.com/ionic-team/capacitor/compare/4.0.1...4.1.0) (2022-08-18) -### Bug Fixes +## Bug Fixes - **ios:** Prevent Xcode 14 warning on CAPWebView ([#5821](https://github.com/ionic-team/capacitor/issues/5821)) ([66954ef](https://github.com/ionic-team/capacitor/commit/66954ef6bc93f2038d85a386ef2f8b582af11bc3)) - **ios:** return proper mimeType on M1 x86_64 simulators ([#5853](https://github.com/ionic-team/capacitor/issues/5853)) ([325b6fe](https://github.com/ionic-team/capacitor/commit/325b6fe83939efaaef44c7e8624e33de742a57e2)), closes [#5793](https://github.com/ionic-team/capacitor/issues/5793) -### Features +## Features - **ios:** Add `setServerBasePath(_:)` to CAPBridgeProtocol ([#5860](https://github.com/ionic-team/capacitor/issues/5860)) ([76f28e7](https://github.com/ionic-team/capacitor/commit/76f28e70a5c0a03e4c6b9a93a0c068666a2c38ff)) @@ -556,11 +856,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.2...4.0.0) (2022-07-27) -### Bug Fixes +## Bug Fixes - **ios:** error data is optional ([#5782](https://github.com/ionic-team/capacitor/issues/5782)) ([da48d79](https://github.com/ionic-team/capacitor/commit/da48d798c3463de9de188ae6a6475fd6afba6091)) -### Features +## Features - **android:** Add Optional Data Param for Error Object ([#5719](https://github.com/ionic-team/capacitor/issues/5719)) ([174172b](https://github.com/ionic-team/capacitor/commit/174172b6c64dc9117c48ed0e20c25e0b6c2fb625)) - **android:** Use addWebMessageListener where available ([#5427](https://github.com/ionic-team/capacitor/issues/5427)) ([c2dfe80](https://github.com/ionic-team/capacitor/commit/c2dfe808446717412b35e82713d123b7a052f264)) @@ -570,33 +870,33 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [4.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.1...4.0.0-beta.2) (2022-07-08) -### Bug Fixes +## Bug Fixes - **ios:** Add check for both serverURL and localURL in navigation ([#5736](https://github.com/ionic-team/capacitor/issues/5736)) ([8e824f3](https://github.com/ionic-team/capacitor/commit/8e824f33ad4df898fb8c0936a8f5e9041832a5c5)) - **ios:** properly deliver retained events after listener re-add [#5732](https://github.com/ionic-team/capacitor/issues/5732) ([c5d6328](https://github.com/ionic-team/capacitor/commit/c5d632831924a1bcc868bc46b42f7ff619408752)) -### Features +## Features - **ios:** Add `setServerBasePath(path:)` to CAPWebView ([#5742](https://github.com/ionic-team/capacitor/issues/5742)) ([1afbf8a](https://github.com/ionic-team/capacitor/commit/1afbf8a9dd0b8f7b1ac439d24e5d8ba26f786318)) - Add CapWebView ([#5715](https://github.com/ionic-team/capacitor/issues/5715)) ([143d266](https://github.com/ionic-team/capacitor/commit/143d266ef0a818bac59dbbdaeda3b5c382ebfa1d)) # [4.0.0-beta.1](https://github.com/ionic-team/capacitor/compare/4.0.0-beta.0...4.0.0-beta.1) (2022-06-27) -### Bug Fixes +## Bug Fixes - **ios:** Remove Cordova as an embedded framework ([#5709](https://github.com/ionic-team/capacitor/issues/5709)) ([bbf6d24](https://github.com/ionic-team/capacitor/commit/bbf6d248bf9217a5c5c6c15c7bcfeda209aba5b1)) -### Features +## Features - **ios:** Allow to configure popover size ([#5717](https://github.com/ionic-team/capacitor/issues/5717)) ([ca1a125](https://github.com/ionic-team/capacitor/commit/ca1a125e5ab05d6066dd303bc75e99dfe21f210a)) # [4.0.0-beta.0](https://github.com/ionic-team/capacitor/compare/3.6.0...4.0.0-beta.0) (2022-06-17) -### Bug Fixes +## Bug Fixes - **ios:** make removeAllListeners return a promise ([#5526](https://github.com/ionic-team/capacitor/issues/5526)) ([815f71b](https://github.com/ionic-team/capacitor/commit/815f71b6b62f6c4d5f66e6a36c190bb00a96fdcc)) -### Features +## Features - **ios:** add getConfig to CAPPlugin ([#5495](https://github.com/ionic-team/capacitor/issues/5495)) ([224a9d0](https://github.com/ionic-team/capacitor/commit/224a9d075629d9c9da9ddc658eb282617fc46d09)) - **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/ionic-team/capacitor/issues/5583)) ([5b6dfa3](https://github.com/ionic-team/capacitor/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475)) @@ -604,21 +904,21 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.6.0](https://github.com/ionic-team/capacitor/compare/3.5.1...3.6.0) (2022-06-17) -### Bug Fixes +## Bug Fixes - **ios:** Use `URL(fileURLWithPath:)` instead of `URL(string:)` ([#5603](https://github.com/ionic-team/capacitor/issues/5603)) ([5fac1b2](https://github.com/ionic-team/capacitor/commit/5fac1b2da5aa5882087716cb2aa862d89173f4a1)) -### Features +## Features - **iOS, Android:** add AppUUID Lib for plugins ([#5690](https://github.com/ionic-team/capacitor/issues/5690)) ([05e76cf](https://github.com/ionic-team/capacitor/commit/05e76cf526a44e07fa75f9482fa2223a13918638)) # [4.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.2) (2022-05-12) -### Bug Fixes +## Bug Fixes - **ios:** make removeAllListeners return a promise ([#5526](https://github.com/ionic-team/capacitor/issues/5526)) ([815f71b](https://github.com/ionic-team/capacitor/commit/815f71b6b62f6c4d5f66e6a36c190bb00a96fdcc)) -### Features +## Features - **ios:** add getConfig to CAPPlugin ([#5495](https://github.com/ionic-team/capacitor/issues/5495)) ([224a9d0](https://github.com/ionic-team/capacitor/commit/224a9d075629d9c9da9ddc658eb282617fc46d09)) - **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/ionic-team/capacitor/issues/5583)) ([5b6dfa3](https://github.com/ionic-team/capacitor/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475)) @@ -629,13 +929,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.5.0](https://github.com/ionic-team/capacitor/compare/3.4.3...3.5.0) (2022-04-22) -### Features +## Features - **ios:** Add overrideable routing for CAPBridgeViewController subclasses ([#5546](https://github.com/ionic-team/capacitor/issues/5546)) ([8875d5e](https://github.com/ionic-team/capacitor/commit/8875d5e2721e8a8ee763ce70cb672db383f36efa)) # [4.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.1) (2022-03-25) -### Features +## Features - **ios:** add getConfig to CAPPlugin ([#5495](https://github.com/ionic-team/capacitor/issues/5495)) ([224a9d0](https://github.com/ionic-team/capacitor/commit/224a9d075629d9c9da9ddc658eb282617fc46d09)) @@ -655,7 +955,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.4.0](https://github.com/ionic-team/capacitor/compare/3.3.4...3.4.0) (2022-01-19) -### Features +## Features - **ios:** Add new iOS 15 Motion permission delegate ([#5317](https://github.com/ionic-team/capacitor/issues/5317)) ([c05a3cb](https://github.com/ionic-team/capacitor/commit/c05a3cbbf02217e3972d5e067970cae18bff3faa)) - **ios:** Add new iOS15 media capture permission delegate ([#5196](https://github.com/ionic-team/capacitor/issues/5196)) ([d8b54ac](https://github.com/ionic-team/capacitor/commit/d8b54ac23414bfe56e50e1254066630a6f87eb0e)) @@ -680,7 +980,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.3.0](https://github.com/ionic-team/capacitor/compare/3.2.5...3.3.0) (2021-11-03) -### Bug Fixes +## Bug Fixes - **core:** avoid crash on logging circular objects ([#5186](https://github.com/ionic-team/capacitor/issues/5186)) ([1451ec8](https://github.com/ionic-team/capacitor/commit/1451ec850a9ef73267a032638e73f1fc440647b9)) - **ios:** Avoid CDVScreenOrientationDelegate umbrella header warning ([#5156](https://github.com/ionic-team/capacitor/issues/5156)) ([31ec30d](https://github.com/ionic-team/capacitor/commit/31ec30de193aa3117dbb7eda928ef3a365d5667c)) @@ -728,11 +1028,11 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.1.0](https://github.com/ionic-team/capacitor/compare/3.0.2...3.1.0) (2021-07-07) -### Bug Fixes +## Bug Fixes - **ios:** isNewBinary is true if defaults have no stored versions ([#4779](https://github.com/ionic-team/capacitor/issues/4779)) ([bd86dbe](https://github.com/ionic-team/capacitor/commit/bd86dbeb74771ed201d0100773babf49e6764818)) -### Features +## Features - **ios:** Add limitsNavigationsToAppBoundDomains configuration option ([#4789](https://github.com/ionic-team/capacitor/issues/4789)) ([2b7016f](https://github.com/ionic-team/capacitor/commit/2b7016f3b4d62fd8c9d03fde2745b3d515bf08b2)) @@ -763,27 +1063,27 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-rc.2](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.1...3.0.0-rc.2) (2021-05-07) -### Bug Fixes +## Bug Fixes - **ios:** Don't auto release saved calls ([#4535](https://github.com/ionic-team/capacitor/issues/4535)) ([4f76933](https://github.com/ionic-team/capacitor/commit/4f76933b98d0461564d3dca9b36d4ea1eba8ed49)) # [3.0.0-rc.1](https://github.com/ionic-team/capacitor/compare/3.0.0-rc.0...3.0.0-rc.1) (2021-04-29) -### Bug Fixes +## Bug Fixes - generate Capacitor.Plugins object ([#4496](https://github.com/ionic-team/capacitor/issues/4496)) ([1c71b7a](https://github.com/ionic-team/capacitor/commit/1c71b7adb2c325e34d980dbf578dc22afb2c332b)) - **ios:** cordova-plugin-screen-orientation compatibility ([#4367](https://github.com/ionic-team/capacitor/issues/4367)) ([b893a57](https://github.com/ionic-team/capacitor/commit/b893a57aaaf3a16e13db9c33037a12f1a5ac92e0)) - **ios:** fire resume/pause events if no cordova plugins installed ([#4467](https://github.com/ionic-team/capacitor/issues/4467)) ([0105f7a](https://github.com/ionic-team/capacitor/commit/0105f7a2c68f2e7bec16ca23384b6acbb2f3057b)) - **ios:** put cancel button of confirm/prompt on the left ([#4464](https://github.com/ionic-team/capacitor/issues/4464)) ([e5b53aa](https://github.com/ionic-team/capacitor/commit/e5b53aa687a70938994802c7b1367cfcbb1e3811)) -### Features +## Features - Unify logging behavior across environments ([#4416](https://github.com/ionic-team/capacitor/issues/4416)) ([bae0f3d](https://github.com/ionic-team/capacitor/commit/bae0f3d2cee84978636d0f589bc7e2f745671baf)) - **iOS:** Include native-bridge.js as a resource in both Cocoapods and direct build ([#4505](https://github.com/ionic-team/capacitor/issues/4505)) ([c16ccc0](https://github.com/ionic-team/capacitor/commit/c16ccc0118aec57dc23649894bc3bcd83827f89f)) # [3.0.0-rc.0](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.6...3.0.0-rc.0) (2021-03-10) -### Features +## Features - **iOS:** Obj-C convenience accessors on CAPPluginCall ([#4309](https://github.com/ionic-team/capacitor/issues/4309)) ([e3657d7](https://github.com/ionic-team/capacitor/commit/e3657d77647187946ffcd4c4791f4a47c768db7f)) - **iOS:** Unifying saving plugin calls ([#4253](https://github.com/ionic-team/capacitor/issues/4253)) ([de71da5](https://github.com/ionic-team/capacitor/commit/de71da52b80ff52d0234a5301fc6cae675640a33)) @@ -802,13 +1102,13 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-beta.3](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.2...3.0.0-beta.3) (2021-02-18) -### Features +## Features - **iOS:** Add automatic Date serialization to bridge communication ([#4177](https://github.com/ionic-team/capacitor/issues/4177)) ([3dabc69](https://github.com/ionic-team/capacitor/commit/3dabc69eab1c8ce0b7734acb641b67d349ec3093)) # [3.0.0-beta.2](https://github.com/ionic-team/capacitor/compare/3.0.0-beta.1...3.0.0-beta.2) (2021-02-08) -### Bug Fixes +## Bug Fixes - address bug in `isPluginAvailable()` for web and native ([#4114](https://github.com/ionic-team/capacitor/issues/4114)) ([2fbd954](https://github.com/ionic-team/capacitor/commit/2fbd95465a321b8f4c50d4daf22a63d8043cee9b)) - **iOS:** preserve null values in bridged types ([#4072](https://github.com/ionic-team/capacitor/issues/4072)) ([6dc691e](https://github.com/ionic-team/capacitor/commit/6dc691e66a07a421d5d4b08028ea05a65b3ddd84)) @@ -827,7 +1127,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.13](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.12...3.0.0-alpha.13) (2021-01-13) -### Bug Fixes +## Bug Fixes - **iOS:** properly handle date types during JSValue coercion ([#4043](https://github.com/ionic-team/capacitor/issues/4043)) ([1affae7](https://github.com/ionic-team/capacitor/commit/1affae7cf8d2f49681bf25be48633ab985bbd12f)) - **iOS:** skip Swift type coercion on Cordova plugin calls ([#4048](https://github.com/ionic-team/capacitor/issues/4048)) ([7bb9e0f](https://github.com/ionic-team/capacitor/commit/7bb9e0f22fdea369a6522c2d63a5b56baab9f5ca)) @@ -838,7 +1138,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.11](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.10...3.0.0-alpha.11) (2020-12-26) -### Features +## Features - **iOS:** Open CAPBridgeViewController for subclassing ([#3973](https://github.com/ionic-team/capacitor/issues/3973)) ([a601705](https://github.com/ionic-team/capacitor/commit/a601705f8116ac10d1a0b5942511952c07cf474e)) @@ -848,17 +1148,17 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.8](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.7...3.0.0-alpha.8) (2020-12-15) -### Bug Fixes +## Bug Fixes - **ios:** expose lastURL getter ([#3898](https://github.com/ionic-team/capacitor/issues/3898)) ([90b7fe3](https://github.com/ionic-team/capacitor/commit/90b7fe39f5a7cb9d584618a6fba66338f2bbf5fe)) # [3.0.0-alpha.7](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.6...3.0.0-alpha.7) (2020-12-02) -### Bug Fixes +## Bug Fixes - **ios:** share message handler between webview and bridge ([#3875](https://github.com/ionic-team/capacitor/issues/3875)) ([f7dff2e](https://github.com/ionic-team/capacitor/commit/f7dff2e661a54bee770940ee1ebd9eab6456ba2e)) -### Features +## Features - **ios:** add local and remote notification router ([#3796](https://github.com/ionic-team/capacitor/issues/3796)) ([f3edaf9](https://github.com/ionic-team/capacitor/commit/f3edaf93d4328ea3ee90df573bf14ef0efc7553b)) - **ios:** add path utilities to bridge ([#3842](https://github.com/ionic-team/capacitor/issues/3842)) ([c31eb35](https://github.com/ionic-team/capacitor/commit/c31eb35f83a33626a9d88731c0fff18966c71b0b)) @@ -867,7 +1167,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.6](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.5...3.0.0-alpha.6) (2020-10-30) -### Features +## Features - unified errors and error codes ([#3673](https://github.com/ionic-team/capacitor/issues/3673)) ([f9e0803](https://github.com/ionic-team/capacitor/commit/f9e08038aa88f7453e8235f380d2767a12a7a073)) @@ -885,14 +1185,15 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline # [3.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/3.0.0-alpha.1...3.0.0-alpha.2) (2020-08-31) -### Features +## Features - Add extension for creating data from data url ([#3474](https://github.com/ionic-team/capacitor/issues/3474)) ([2909fd0](https://github.com/ionic-team/capacitor/commit/2909fd0ac0d9fdb2cdb7fd25e38742451aa05fb1)) # [3.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/2.4.0...3.0.0-alpha.1) (2020-08-21) -### Bug Fixes +## Bug Fixes - **ios:** config bug from swiftlint refactor ([ace879f](https://github.com/ionic-team/capacitor/commit/ace879f42b19aa064efa80142c3783f736745344)) # [3.0.0-alpha.0](https://github.com/ionic-team/capacitor/compare/2.3.0...3.0.0-alpha.0) (2020-07-23) + diff --git a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift index f5c033ecc..cc9c6dea0 100644 --- a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift +++ b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift @@ -23,11 +23,11 @@ public class SceneDelegateProxy: NSObject, UISceneDelegate { // registered. var token: NSObjectProtocol? token = NotificationCenter.default.addObserver(forName: .capacitorViewDidAppear, object: nil, queue: .main) { [weak self] _ in + guard let self, Self.isBridgeReady(for: scene) else { return } if let token { NotificationCenter.default.removeObserver(token) } token = nil - guard let self else { return } if !connectionOptions.urlContexts.isEmpty { self.scene(scene, openURLContexts: connectionOptions.urlContexts) } @@ -37,6 +37,22 @@ public class SceneDelegateProxy: NSObject, UISceneDelegate { } } + private static func isBridgeReady(for scene: UIScene) -> Bool { + guard let windowScene = scene as? UIWindowScene else { + return false + } + + let rootViewController = + windowScene.windows.first(where: { $0.isKeyWindow })?.rootViewController + ?? windowScene.windows.first?.rootViewController + + guard let bridge = rootViewController as? CAPBridgeViewController else { + return false + } + + return bridge.isViewLoaded && bridge.view.window != nil + } + public func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { for context in URLContexts { lastURL = context.url diff --git a/ios/Capacitor/TestsHostApp/AppDelegate.swift b/ios/Capacitor/TestsHostApp/AppDelegate.swift index 9107e3c45..1a0ff2b28 100644 --- a/ios/Capacitor/TestsHostApp/AppDelegate.swift +++ b/ios/Capacitor/TestsHostApp/AppDelegate.swift @@ -10,9 +10,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - let config = UISceneConfiguration(name: "Default Configuration", - sessionRole: connectingSceneSession.role) - config.delegateClass = SceneDelegate.self - return config + return UISceneConfiguration(name: "Default Configuration", + sessionRole: connectingSceneSession.role) } } From 8ccec4bd82e8e3bbb7a15bb66813704378e8e9d6 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 15:41:53 +0000 Subject: [PATCH 36/39] test(cli): expect no UISceneStoryboardFile in scene manifest Co-authored-by: Martin DONADIEU --- cli/test/migrate-uiscene-plist.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/test/migrate-uiscene-plist.spec.ts b/cli/test/migrate-uiscene-plist.spec.ts index dc3bd2513..f07dded8c 100644 --- a/cli/test/migrate-uiscene-plist.spec.ts +++ b/cli/test/migrate-uiscene-plist.spec.ts @@ -81,7 +81,7 @@ describe('addSceneManifestIfNeeded', () => { expect(roleArray).toHaveLength(1); expect(roleArray[0]['UISceneConfigurationName']).toBe('Default Configuration'); expect(roleArray[0]['UISceneDelegateClassName']).toBe('$(PRODUCT_MODULE_NAME).SceneDelegate'); - expect(roleArray[0]['UISceneStoryboardFile']).toBe('Main'); + expect(roleArray[0]['UISceneStoryboardFile']).toBeUndefined(); }); it('preserves sibling keys', async () => { From ace3f131a77c979fb6610667a4aa0ef4242ed50a Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 15:53:07 +0000 Subject: [PATCH 37/39] fix(cli): correct Swift string parsing and xcode build comments - findMatchingBrace: proper # raw string open/close and stringHashes tracking - xcode: set basename/group for addToPbxBuildFileSection helpers - tests for brace scanner strings and UISceneStoryboardFile removal Co-authored-by: Martin DONADIEU --- cli/src/tasks/migrate-uiscene.ts | 50 +++++++++++++++------------ cli/src/util/xcode.ts | 3 ++ cli/test/migrate-uiscene-scan.spec.ts | 22 +++++++++++- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/cli/src/tasks/migrate-uiscene.ts b/cli/src/tasks/migrate-uiscene.ts index 92058e86a..40b0bc420 100644 --- a/cli/src/tasks/migrate-uiscene.ts +++ b/cli/src/tasks/migrate-uiscene.ts @@ -140,11 +140,11 @@ function findMatchingBrace(source: string, openIdx: number): number | null { let inLineComment = false; let blockCommentDepth = 0; let inString: '"' | '"""' | null = null; + let stringHashes = 0; while (i < source.length && depth > 0) { const ch = source[i]; const next = source[i + 1]; - const next2 = source[i + 2]; if (inLineComment) { if (ch === '\n') inLineComment = false; @@ -168,18 +168,19 @@ function findMatchingBrace(source: string, openIdx: number): number | null { } if (inString === '"') { - if (ch === '\\') { + if (stringHashes === 0 && ch === '\\') { i += 2; continue; } if (ch === '"') { - let hashes = 0; - while (source[i + 1 + hashes] === '#') { - hashes++; + let closingHashes = 0; + while (source[i + 1 + closingHashes] === '#') { + closingHashes++; } - if (source[i + 1 + hashes] === '"') { - i += 2 + hashes; + if (closingHashes === stringHashes) { + i += 1 + closingHashes; inString = null; + stringHashes = 0; continue; } } @@ -188,14 +189,15 @@ function findMatchingBrace(source: string, openIdx: number): number | null { } if (inString === '"""') { - if (ch === '"' && next === '"' && next2 === '"') { - let hashes = 0; - while (source[i + 3 + hashes] === '#') { - hashes++; + if (ch === '"' && source[i + 1] === '"' && source[i + 2] === '"') { + let closingHashes = 0; + while (source[i + 3 + closingHashes] === '#') { + closingHashes++; } - if (source[i + 3 + hashes] === '"') { - i += 4 + hashes; + if (closingHashes === stringHashes) { + i += 3 + closingHashes; inString = null; + stringHashes = 0; continue; } } @@ -215,19 +217,22 @@ function findMatchingBrace(source: string, openIdx: number): number | null { continue; } - if (ch === '"') { + if (ch === '#' || ch === '"') { let hashes = 0; - while (source[i + 1 + hashes] === '#') { + while (source[i + hashes] === '#') { hashes++; } - if (source[i + 1 + hashes] === '"' && source[i + 2 + hashes] === '"' && source[i + 3 + hashes] === '"') { - inString = '"""'; - i += 4 + hashes; - continue; - } - if (source[i + 1 + hashes] === '"') { + const quoteIdx = i + hashes; + if (source[quoteIdx] === '"') { + if (source[quoteIdx + 1] === '"' && source[quoteIdx + 2] === '"') { + inString = '"""'; + stringHashes = hashes; + i = quoteIdx + 3; + continue; + } inString = '"'; - i += 2 + hashes; + stringHashes = hashes; + i = quoteIdx + 1; continue; } } @@ -382,6 +387,7 @@ function describeSignals({ export const __testables = { classify, describeSignals, + findMatchingBrace, insertBeforeAppDelegateClassEnd, extractConfigurationForConnecting, hasCustomDelegateBody, diff --git a/cli/src/util/xcode.ts b/cli/src/util/xcode.ts index 3476c069f..86a9707e9 100644 --- a/cli/src/util/xcode.ts +++ b/cli/src/util/xcode.ts @@ -1,4 +1,5 @@ import { writeFileSync } from 'fs-extra'; +import { basename } from 'path'; import { project as loadXcodeProject } from 'xcode'; import type { XcodeProject } from 'xcode'; @@ -44,6 +45,8 @@ export function addSwiftFileToAppTarget( const file = { fileRef: fileRefUuid, path: fileRelPath, + basename: basename(fileRelPath), + group: 'Sources', target: targetUuid, uuid: project.generateUuid(), }; diff --git a/cli/test/migrate-uiscene-scan.spec.ts b/cli/test/migrate-uiscene-scan.spec.ts index 015d776ee..7fa3f84e3 100644 --- a/cli/test/migrate-uiscene-scan.spec.ts +++ b/cli/test/migrate-uiscene-scan.spec.ts @@ -7,7 +7,7 @@ import { __testables } from '../src/tasks/migrate-uiscene'; import { mktmp } from './util'; -const { hasCustomDelegateBody, scanAndWarn } = __testables; +const { hasCustomDelegateBody, scanAndWarn, findMatchingBrace } = __testables; const OPEN_URL_SIG = /func application\([^)]*\bopen url:/; const CONTINUE_SIG = /func application\([^)]*\bcontinue userActivity:/; @@ -82,6 +82,26 @@ class AppDelegate: UIResponder, UIApplicationDelegate { }); }); +describe('findMatchingBrace', () => { + it('ignores braces inside ordinary string literals', () => { + const source = 'class AppDelegate {\n let payload = "{\\"a\\":1}"\n}'; + const openIdx = source.indexOf('{'); + expect(findMatchingBrace(source, openIdx)).toBe(source.length - 1); + }); + + it('ignores braces inside raw string literals', () => { + const source = 'class AppDelegate {\n let payload = #"}"#\n}'; + const openIdx = source.indexOf('{'); + expect(findMatchingBrace(source, openIdx)).toBe(source.length - 1); + }); + + it('ignores braces inside multiline string literals', () => { + const source = 'class AppDelegate {\n let payload = """\n }\n """\n}'; + const openIdx = source.indexOf('{'); + expect(findMatchingBrace(source, openIdx)).toBe(source.length - 1); + }); +}); + describe('scanAndWarn', () => { let tmpDir: any; let iosDir: string; From 4382a918ff13bb57640167a08cc8ffcaa32b7c0d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 15:55:00 +0000 Subject: [PATCH 38/39] fix: address cubic follow-up on PR #115 review threads - Reorder SPM update: generate Package.swift before optional plugin patching - Ship typescript runtime dep for TS7 config strip-only fallback - CAPSceneDelegateProxy: find bridge in nested view-controller hierarchies - Changelog: dedupe ios 8.3.1, normalize cli plus block formatting Co-authored-by: Martin DONADIEU --- bun.lock | 1 + cli/CHANGELOG.md | 76 +++++++++---------- cli/package.json | 1 + cli/src/ios/update.ts | 71 +++++++++-------- cli/src/util/node.ts | 10 ++- ios/CHANGELOG.md | 5 -- .../Capacitor/CAPSceneDelegateProxy.swift | 33 ++++++-- 7 files changed, 107 insertions(+), 90 deletions(-) diff --git a/bun.lock b/bun.lock index 827a6ffd0..c31809c92 100644 --- a/bun.lock +++ b/bun.lock @@ -53,6 +53,7 @@ "semver": "^7.6.3", "tar": "^7.5.3", "tslib": "^2.8.1", + "typescript": "~5.0.2", "xcode": "^3.0.1", "xml2js": "^0.6.2", }, diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 7940d2348..d444b5022 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -132,9 +132,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.3.4](https://github.com/Cap-go/capacitor-plus/compare/8.3.3...8.3.4) (2026-05-07) -### Bug Fixes +## Bug Fixes -* **cli:** link plugin dependencies in Package.swift ([#8457](https://github.com/Cap-go/capacitor-plus/issues/8457)) ([b3c769e](https://github.com/Cap-go/capacitor-plus/commit/b3c769e856c826b1174518877cf86ac7ce73bf09)) +- **cli:** link plugin dependencies in Package.swift ([#8457](https://github.com/Cap-go/capacitor-plus/issues/8457)) ([b3c769e](https://github.com/Cap-go/capacitor-plus/commit/b3c769e856c826b1174518877cf86ac7ce73bf09)) @@ -143,9 +143,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.3.3](https://github.com/Cap-go/capacitor-plus/compare/8.3.2...8.3.3) (2026-05-06) -### Bug Fixes +## Bug Fixes -* **cli:** generate resource entries in Package.swift ([#8455](https://github.com/Cap-go/capacitor-plus/issues/8455)) ([790bd27](https://github.com/Cap-go/capacitor-plus/commit/790bd27123497111984227010c3162cec94a108e)) +- **cli:** generate resource entries in Package.swift ([#8455](https://github.com/Cap-go/capacitor-plus/issues/8455)) ([790bd27](https://github.com/Cap-go/capacitor-plus/commit/790bd27123497111984227010c3162cec94a108e)) @@ -154,35 +154,35 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.3.2](https://github.com/Cap-go/capacitor-plus/compare/8.0.8...8.3.2) (2026-05-05) -### Bug Fixes +## Bug Fixes -* address follow-up review comments ([8bee786](https://github.com/Cap-go/capacitor-plus/commit/8bee786e2c68ca6c351e88f104b518291c1f81e3)) -* **cli:** add cSettings support for compiler flags in generated Package.swift ([#8448](https://github.com/Cap-go/capacitor-plus/issues/8448)) ([0bd0676](https://github.com/Cap-go/capacitor-plus/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0)) -* **cli:** add system framework and weak framework support in SPM Package.swift ([#8447](https://github.com/Cap-go/capacitor-plus/issues/8447)) ([3232f0f](https://github.com/Cap-go/capacitor-plus/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8)) -* **cli:** Allow to run update on non macOS ([#8344](https://github.com/Cap-go/capacitor-plus/issues/8344)) ([a441280](https://github.com/Cap-go/capacitor-plus/commit/a441280d7c6b310ca516d6fb2736c09525987774)) -* **cli:** check CAPACITOR_COCOAPODS_PATH in determinePackageManager ([#8407](https://github.com/Cap-go/capacitor-plus/issues/8407)) ([acb64ab](https://github.com/Cap-go/capacitor-plus/commit/acb64ab92a37ff53701cde453558e272e2e11eb6)) -* **cli:** correct Capacitor plugin SPM compat check ([#8440](https://github.com/Cap-go/capacitor-plus/issues/8440)) ([e5ccc45](https://github.com/Cap-go/capacitor-plus/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb)) -* **cli:** Don't overwrite config.server section with `--live-reload` ([#7528](https://github.com/Cap-go/capacitor-plus/issues/7528)) ([782b9d9](https://github.com/Cap-go/capacitor-plus/commit/782b9d9c26dcf1282b918996becb0224c0baca1d)) -* **cli:** generate binaryTarget entries for custom xcframeworks in Package.swift ([#8445](https://github.com/Cap-go/capacitor-plus/issues/8445)) ([1f7e33f](https://github.com/Cap-go/capacitor-plus/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d)) -* **cli:** handle Cordova plugins without iOS source files ([#8443](https://github.com/Cap-go/capacitor-plus/issues/8443)) ([0da130e](https://github.com/Cap-go/capacitor-plus/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3)) -* **cli:** inline CSS sourcemaps in addition to JS sourcemaps ([#8377](https://github.com/Cap-go/capacitor-plus/issues/8377)) ([69476ab](https://github.com/Cap-go/capacitor-plus/commit/69476ab9c0b47911a14d2482cab53a877a5ae784)) -* **cli:** Update tar package ([#8311](https://github.com/Cap-go/capacitor-plus/issues/8311)) ([0969c5c](https://github.com/Cap-go/capacitor-plus/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) -* **ios:** support Cordova plugins with Package.swift ([#8438](https://github.com/Cap-go/capacitor-plus/issues/8438)) ([139943b](https://github.com/Cap-go/capacitor-plus/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf)) -* resolve upstream sync conflicts ([75cbb30](https://github.com/Cap-go/capacitor-plus/commit/75cbb3097a7068bcb37313cbe6301628079101ca)) -* **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/Cap-go/capacitor-plus/issues/8384)) ([4e99598](https://github.com/Cap-go/capacitor-plus/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) +- address follow-up review comments ([8bee786](https://github.com/Cap-go/capacitor-plus/commit/8bee786e2c68ca6c351e88f104b518291c1f81e3)) +- **cli:** add cSettings support for compiler flags in generated Package.swift ([#8448](https://github.com/Cap-go/capacitor-plus/issues/8448)) ([0bd0676](https://github.com/Cap-go/capacitor-plus/commit/0bd0676315c5fd77e50312dd7b5bf4990dcbd7d0)) +- **cli:** add system framework and weak framework support in SPM Package.swift ([#8447](https://github.com/Cap-go/capacitor-plus/issues/8447)) ([3232f0f](https://github.com/Cap-go/capacitor-plus/commit/3232f0fe1d9811b0b5c500e3dc05cb8a250177f8)) +- **cli:** Allow to run update on non macOS ([#8344](https://github.com/Cap-go/capacitor-plus/issues/8344)) ([a441280](https://github.com/Cap-go/capacitor-plus/commit/a441280d7c6b310ca516d6fb2736c09525987774)) +- **cli:** check CAPACITOR_COCOAPODS_PATH in determinePackageManager ([#8407](https://github.com/Cap-go/capacitor-plus/issues/8407)) ([acb64ab](https://github.com/Cap-go/capacitor-plus/commit/acb64ab92a37ff53701cde453558e272e2e11eb6)) +- **cli:** correct Capacitor plugin SPM compat check ([#8440](https://github.com/Cap-go/capacitor-plus/issues/8440)) ([e5ccc45](https://github.com/Cap-go/capacitor-plus/commit/e5ccc451dda27d56bca824ed644bd20fe4d988cb)) +- **cli:** Don't overwrite config.server section with `--live-reload` ([#7528](https://github.com/Cap-go/capacitor-plus/issues/7528)) ([782b9d9](https://github.com/Cap-go/capacitor-plus/commit/782b9d9c26dcf1282b918996becb0224c0baca1d)) +- **cli:** generate binaryTarget entries for custom xcframeworks in Package.swift ([#8445](https://github.com/Cap-go/capacitor-plus/issues/8445)) ([1f7e33f](https://github.com/Cap-go/capacitor-plus/commit/1f7e33fca43d183332ec19d22b0d75ef81d8cc6d)) +- **cli:** handle Cordova plugins without iOS source files ([#8443](https://github.com/Cap-go/capacitor-plus/issues/8443)) ([0da130e](https://github.com/Cap-go/capacitor-plus/commit/0da130eb7a861bee4e2c35bc0aac53ba9c983fc3)) +- **cli:** inline CSS sourcemaps in addition to JS sourcemaps ([#8377](https://github.com/Cap-go/capacitor-plus/issues/8377)) ([69476ab](https://github.com/Cap-go/capacitor-plus/commit/69476ab9c0b47911a14d2482cab53a877a5ae784)) +- **cli:** Update tar package ([#8311](https://github.com/Cap-go/capacitor-plus/issues/8311)) ([0969c5c](https://github.com/Cap-go/capacitor-plus/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) +- **ios:** support Cordova plugins with Package.swift ([#8438](https://github.com/Cap-go/capacitor-plus/issues/8438)) ([139943b](https://github.com/Cap-go/capacitor-plus/commit/139943b0c05fddb2d1ce2d6f468800fddf17b4cf)) +- resolve upstream sync conflicts ([75cbb30](https://github.com/Cap-go/capacitor-plus/commit/75cbb3097a7068bcb37313cbe6301628079101ca)) +- **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/Cap-go/capacitor-plus/issues/8384)) ([4e99598](https://github.com/Cap-go/capacitor-plus/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) -### Features +## Features -* **cli:** Add --https option for --live-reload ([#8194](https://github.com/Cap-go/capacitor-plus/issues/8194)) ([5db81e6](https://github.com/Cap-go/capacitor-plus/commit/5db81e68c67652e9d2b29d7ad30629b423d2ad30)) -* **cli:** Add packageManager to iOS config ([#8321](https://github.com/Cap-go/capacitor-plus/issues/8321)) ([a125498](https://github.com/Cap-go/capacitor-plus/commit/a1254983bbb9dcb273d93f3c5f639b792e516406)) -* **cli:** Experimental config for swift-tools-version in SPM apps ([#8372](https://github.com/Cap-go/capacitor-plus/issues/8372)) ([d2ee84f](https://github.com/Cap-go/capacitor-plus/commit/d2ee84f8186909b142b418c02fc19f79d3c6a6ed)) -* **cli:** support SPM package traits in generated Package.swift ([#8351](https://github.com/Cap-go/capacitor-plus/issues/8351)) ([27e6aa8](https://github.com/Cap-go/capacitor-plus/commit/27e6aa89cf22e0b1a6d46710faed9aa8899600b0)) +- **cli:** Add --https option for --live-reload ([#8194](https://github.com/Cap-go/capacitor-plus/issues/8194)) ([5db81e6](https://github.com/Cap-go/capacitor-plus/commit/5db81e68c67652e9d2b29d7ad30629b423d2ad30)) +- **cli:** Add packageManager to iOS config ([#8321](https://github.com/Cap-go/capacitor-plus/issues/8321)) ([a125498](https://github.com/Cap-go/capacitor-plus/commit/a1254983bbb9dcb273d93f3c5f639b792e516406)) +- **cli:** Experimental config for swift-tools-version in SPM apps ([#8372](https://github.com/Cap-go/capacitor-plus/issues/8372)) ([d2ee84f](https://github.com/Cap-go/capacitor-plus/commit/d2ee84f8186909b142b418c02fc19f79d3c6a6ed)) +- **cli:** support SPM package traits in generated Package.swift ([#8351](https://github.com/Cap-go/capacitor-plus/issues/8351)) ([27e6aa8](https://github.com/Cap-go/capacitor-plus/commit/27e6aa89cf22e0b1a6d46710faed9aa8899600b0)) ### Reverts -* revert version bump from [#8319](https://github.com/Cap-go/capacitor-plus/issues/8319) and [#8320](https://github.com/Cap-go/capacitor-plus/issues/8320) ([a48ebb6](https://github.com/Cap-go/capacitor-plus/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) +- revert version bump from [#8319](https://github.com/Cap-go/capacitor-plus/issues/8319) and [#8320](https://github.com/Cap-go/capacitor-plus/issues/8320) ([a48ebb6](https://github.com/Cap-go/capacitor-plus/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) @@ -207,9 +207,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.0.6](https://github.com/Cap-go/capacitor-plus/compare/8.0.5...8.0.6) (2026-01-09) -### Bug Fixes +## Bug Fixes -* **cli:** Support wireless iOS devices in `cap run` ([#8301](https://github.com/Cap-go/capacitor-plus/issues/8301)) ([dcb368c](https://github.com/Cap-go/capacitor-plus/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) +- **cli:** Support wireless iOS devices in `cap run` ([#8301](https://github.com/Cap-go/capacitor-plus/issues/8301)) ([dcb368c](https://github.com/Cap-go/capacitor-plus/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) @@ -218,9 +218,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.0.5](https://github.com/Cap-go/capacitor-plus/compare/8.0.4...8.0.5) (2026-01-08) -### Bug Fixes +## Bug Fixes -* **cli:** use latest native-run ([#8296](https://github.com/Cap-go/capacitor-plus/issues/8296)) ([121d830](https://github.com/Cap-go/capacitor-plus/commit/121d83013f39e25009121533a2c3ad86e428d6b2)) +- **cli:** use latest native-run ([#8296](https://github.com/Cap-go/capacitor-plus/issues/8296)) ([121d830](https://github.com/Cap-go/capacitor-plus/commit/121d83013f39e25009121533a2c3ad86e428d6b2)) @@ -229,9 +229,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.0.4](https://github.com/Cap-go/capacitor-plus/compare/8.0.3...8.0.4) (2025-12-16) -### Features +## Features -* enhance package resolution by adding fallbacks for Capacitor packages ([7a03a14](https://github.com/Cap-go/capacitor-plus/commit/7a03a14fdf223088594b45f5ddeca29306eab3c6)) +- enhance package resolution by adding fallbacks for Capacitor packages ([7a03a14](https://github.com/Cap-go/capacitor-plus/commit/7a03a14fdf223088594b45f5ddeca29306eab3c6)) @@ -240,9 +240,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.0.3](https://github.com/Cap-go/capacitor-plus/compare/8.0.2...8.0.3) (2025-12-16) -### Bug Fixes +## Bug Fixes -* update homepage URL in package.json files for all platforms ([61ccdc4](https://github.com/Cap-go/capacitor-plus/commit/61ccdc4128a1ce2a7178eb0a195b188876ec0a9d)) +- update homepage URL in package.json files for all platforms ([61ccdc4](https://github.com/Cap-go/capacitor-plus/commit/61ccdc4128a1ce2a7178eb0a195b188876ec0a9d)) @@ -251,9 +251,9 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.0.2](https://github.com/Cap-go/capacitor-plus/compare/8.0.1...8.0.2) (2025-12-16) -### Features +## Features -* add new workflows for testing and version bumping; update README files for all packages ([a01c2a8](https://github.com/Cap-go/capacitor-plus/commit/a01c2a842c363c2aa58e5681210fa62fac8e5de5)) +- add new workflows for testing and version bumping; update README files for all packages ([a01c2a8](https://github.com/Cap-go/capacitor-plus/commit/a01c2a842c363c2aa58e5681210fa62fac8e5de5)) @@ -261,7 +261,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.0.1](https://github.com/Cap-go/capacitor-plus/compare/3.3.4...8.0.1) (2025-12-16) -### Bug Fixes +## Bug Fixes - add error code checking to `runPlatformHook` ([#7994](https://github.com/Cap-go/capacitor-plus/issues/7994)) ([8717680](https://github.com/Cap-go/capacitor-plus/commit/871768049187afe9f5d358d3fe08b6f18f70533e)) - allow double quotes in Gemfile ([#6903](https://github.com/Cap-go/capacitor-plus/issues/6903)) ([3abdbed](https://github.com/Cap-go/capacitor-plus/commit/3abdbed38844d5d59d244f6f0dfc2647f29ce446)) @@ -364,7 +364,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - update package references to use [@capacitor-plus](https://github.com/capacitor-plus) namespace ([6dd88e6](https://github.com/Cap-go/capacitor-plus/commit/6dd88e6c3101b3ab051dfc216a397bc1d1aca0f0)) - use Capacitor 7 for SPM dependency ([#7835](https://github.com/Cap-go/capacitor-plus/issues/7835)) ([640c3cb](https://github.com/Cap-go/capacitor-plus/commit/640c3cb22a62e4b8fb13cd36031d39307622c60a)) -### Features +## Features - Add global initialFocus configuration ([#7775](https://github.com/Cap-go/capacitor-plus/issues/7775)) ([61d0165](https://github.com/Cap-go/capacitor-plus/commit/61d01653685d8e3594d2d8a6bd870fa9643ba95c)) - add livereload to run command ([#6831](https://github.com/Cap-go/capacitor-plus/issues/6831)) ([4099969](https://github.com/Cap-go/capacitor-plus/commit/4099969f70e9b995182bacecc16e160d89bbc746)) @@ -418,7 +418,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) -### Bug Fixes +## Bug Fixes - **cli:** check CAPACITOR_COCOAPODS_PATH in determinePackageManager ([#8407](https://github.com/ionic-team/capacitor/issues/8407)) ([acb64ab](https://github.com/ionic-team/capacitor/commit/acb64ab92a37ff53701cde453558e272e2e11eb6)) diff --git a/cli/package.json b/cli/package.json index 05bdffcb0..abb115f33 100644 --- a/cli/package.json +++ b/cli/package.json @@ -60,6 +60,7 @@ "semver": "^7.6.3", "tar": "^7.5.3", "tslib": "^2.8.1", + "typescript": "~5.0.2", "xcode": "^3.0.1", "xml2js": "^0.6.2" }, diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 6f3f54026..7494f289e 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -59,44 +59,43 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: await generateCordovaPackageFiles(cordovaPlugins, config); const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); - let iosPlatformVersion: string | null = null; - try { - iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); - } catch { - iosPlatformVersion = null; - } - if (iosPlatformVersion) { - const platformVersion = iosPlatformVersion; - await Promise.all( - validSPMPackages.map(async (plugin) => { - const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); - let content = await readFile(packageSwiftPath, { encoding: 'utf-8' }); - const regex = new RegExp( - 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*(?:from|exact):\\s*"([^"]+)"', - ); - const version = content.match(regex)?.[1]; - if (!version || !valid(version)) { - logger.warn(`${plugin.id}: skipping Package.swift version check for invalid version "${version ?? ''}"`); - return; - } - const majorCapVersion = major(platformVersion); - if (major(version) != majorCapVersion) { - const preCapVersion = prerelease(platformVersion); - const forceVersion = preCapVersion ? platformVersion : `${majorCapVersion}.0.0`; - content = setAllStringIn( - content, - `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, - `)`, - ` from: "${forceVersion}"`, - ); - await writeFile(packageSwiftPath, content); - logger.warn(`${plugin.id} is built for Capacitor ${major(version)}, it might cause issues`); - } - }), - ); - } await generatePackageFile(config, validSPMPackages.concat(cordovaPlugins)); + + if (validSPMPackages.length > 0) { + try { + const platformVersion = await getCapacitorPackageVersion(config, config.ios.name); + await Promise.all( + validSPMPackages.map(async (plugin) => { + const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); + let content = await readFile(packageSwiftPath, { encoding: 'utf-8' }); + const regex = new RegExp( + 'url:\\s*"https://github.com/ionic-team/capacitor-swift-pm\\.git",\\s*(?:from|exact):\\s*"([^"]+)"', + ); + const version = content.match(regex)?.[1]; + if (!version || !valid(version)) { + logger.warn(`${plugin.id}: skipping Package.swift version check for invalid version "${version ?? ''}"`); + return; + } + const majorCapVersion = major(platformVersion); + if (major(version) != majorCapVersion) { + const preCapVersion = prerelease(platformVersion); + const forceVersion = preCapVersion ? platformVersion : `${majorCapVersion}.0.0`; + content = setAllStringIn( + content, + `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, + `)`, + ` from: "${forceVersion}"`, + ); + await writeFile(packageSwiftPath, content); + logger.warn(`${plugin.id} is built for Capacitor ${major(version)}, it might cause issues`); + } + }), + ); + } catch (err) { + logger.warn(`Skipping plugin Package.swift Capacitor version patching: ${err}`); + } + } } else { await generateCordovaPodspecs(cordovaPlugins, config); await installCocoaPodsPlugins(config, plugins, deployment); diff --git a/cli/src/util/node.ts b/cli/src/util/node.ts index abf639d73..5600b5cad 100644 --- a/cli/src/util/node.ts +++ b/cli/src/util/node.ts @@ -1,6 +1,6 @@ import { existsSync } from 'fs'; import { readFileSync } from 'fs-extra'; -import { dirname, resolve } from 'path'; +import { resolve } from 'path'; import type typescript from 'typescript'; import { pathToFileURL } from 'url'; @@ -66,9 +66,11 @@ function loadWithClassicCompiler(ts: typeof typescript, id: string): unknown { } function loadWithCliBundledCompiler(id: string): unknown | null { - const cliTsPath = resolveNode(dirname(dirname(__dirname)), 'typescript'); - - if (!cliTsPath) { + const cliRoot = resolve(__dirname, '..', '..'); + let cliTsPath: string; + try { + cliTsPath = require.resolve('typescript', { paths: [cliRoot] }); + } catch { return null; } diff --git a/ios/CHANGELOG.md b/ios/CHANGELOG.md index 14401d34d..2d5f46c48 100644 --- a/ios/CHANGELOG.md +++ b/ios/CHANGELOG.md @@ -335,11 +335,6 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline - System Bars Plugin ([#8180](https://github.com/Cap-go/capacitor-plus/issues/8180)) ([a32216a](https://github.com/Cap-go/capacitor-plus/commit/a32216ac0607172a3a9c7ae5cdbfc598769294a6)) - **webview:** add setServerAssetPath method ([881235b](https://github.com/Cap-go/capacitor-plus/commit/881235b14de23ef988746bfb89a5a0fc3c8d8466)) -## [8.3.1](https://github.com/ionic-team/capacitor/compare/8.3.0...8.3.1) (2026-04-16) - -### Bug Fixes - -- boundary value extraction for form-data requests ([#7518](https://github.com/ionic-team/capacitor/issues/7518)) ([64ab854](https://github.com/ionic-team/capacitor/commit/64ab854c12330804c24275d88d3a9f7c8e52a73d)) ## [8.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) diff --git a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift index cc9c6dea0..6ef6235e9 100644 --- a/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift +++ b/ios/Capacitor/Capacitor/CAPSceneDelegateProxy.swift @@ -42,15 +42,34 @@ public class SceneDelegateProxy: NSObject, UISceneDelegate { return false } - let rootViewController = - windowScene.windows.first(where: { $0.isKeyWindow })?.rootViewController - ?? windowScene.windows.first?.rootViewController - - guard let bridge = rootViewController as? CAPBridgeViewController else { - return false + for window in windowScene.windows { + guard let bridge = findBridge(in: window.rootViewController) else { + continue + } + if bridge.isViewLoaded && bridge.view.window != nil { + return true + } } - return bridge.isViewLoaded && bridge.view.window != nil + return false + } + + private static func findBridge(in viewController: UIViewController?) -> CAPBridgeViewController? { + if let bridge = viewController as? CAPBridgeViewController { + return bridge + } + if let navigationController = viewController as? UINavigationController { + return findBridge(in: navigationController.visibleViewController) + } + if let tabBarController = viewController as? UITabBarController { + return findBridge(in: tabBarController.selectedViewController) + } + for child in viewController?.children ?? [] { + if let bridge = findBridge(in: child) { + return bridge + } + } + return nil } public func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { From bfa9736cdd31f53c9be9ae1b8ccc7dc8a35b61d9 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 24 Aug 2026 16:06:11 +0000 Subject: [PATCH 39/39] fix(cli): only catch Capacitor version lookup in SPM plugin patching Co-authored-by: Martin DONADIEU --- cli/src/ios/update.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 7494f289e..8d2888833 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -63,8 +63,15 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: await generatePackageFile(config, validSPMPackages.concat(cordovaPlugins)); if (validSPMPackages.length > 0) { + let platformVersion: string | undefined; try { - const platformVersion = await getCapacitorPackageVersion(config, config.ios.name); + platformVersion = await getCapacitorPackageVersion(config, config.ios.name); + } catch (err) { + logger.warn(`Skipping plugin Package.swift Capacitor version patching: ${err}`); + } + + if (platformVersion) { + const resolvedPlatformVersion = platformVersion; await Promise.all( validSPMPackages.map(async (plugin) => { const packageSwiftPath = join(plugin.rootPath, 'Package.swift'); @@ -77,10 +84,10 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: logger.warn(`${plugin.id}: skipping Package.swift version check for invalid version "${version ?? ''}"`); return; } - const majorCapVersion = major(platformVersion); + const majorCapVersion = major(resolvedPlatformVersion); if (major(version) != majorCapVersion) { - const preCapVersion = prerelease(platformVersion); - const forceVersion = preCapVersion ? platformVersion : `${majorCapVersion}.0.0`; + const preCapVersion = prerelease(resolvedPlatformVersion); + const forceVersion = preCapVersion ? resolvedPlatformVersion : `${majorCapVersion}.0.0`; content = setAllStringIn( content, `url: "https://github.com/ionic-team/capacitor-swift-pm.git",`, @@ -92,8 +99,6 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: } }), ); - } catch (err) { - logger.warn(`Skipping plugin Package.swift Capacitor version patching: ${err}`); } } } else {