From ae800dfe1b061894748d94fa692ba73efa3e3b65 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of andredestro)" Date: Tue, 13 Jan 2026 11:56:50 +0000 Subject: [PATCH 01/42] Release 8.0.1 --- CHANGELOG.md | 8 ++++++++ android/CHANGELOG.md | 6 ++++++ 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, 34 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61b8cd20ec..a40e32add6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) + +### Bug Fixes + +- **android:** Remove calculated bottom inset if keyboard is visible ([#8280](https://github.com/ionic-team/capacitor/issues/8280)) ([196b642](https://github.com/ionic-team/capacitor/commit/196b642236d293a5012e3c307fcd942766e56cce)) +- **cli:** Support wireless iOS devices in `cap run` ([#8301](https://github.com/ionic-team/capacitor/issues/8301)) ([dcb368c](https://github.com/ionic-team/capacitor/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) +- **cli:** use latest native-run ([#8296](https://github.com/ionic-team/capacitor/issues/8296)) ([121d830](https://github.com/ionic-team/capacitor/commit/121d83013f39e25009121533a2c3ad86e428d6b2)) + # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 83f6944999..4366b9e7c9 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.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) + +### Bug Fixes + +- **android:** Remove calculated bottom inset if keyboard is visible ([#8280](https://github.com/ionic-team/capacitor/issues/8280)) ([196b642](https://github.com/ionic-team/capacitor/commit/196b642236d293a5012e3c307fcd942766e56cce)) + # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) ### Features diff --git a/android/package.json b/android/package.json index 1e2f2524d6..87ea730cf4 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.0.0", + "version": "8.0.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 9b70395bda..76b572cf9b 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.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) + +### Bug Fixes + +- **cli:** Support wireless iOS devices in `cap run` ([#8301](https://github.com/ionic-team/capacitor/issues/8301)) ([dcb368c](https://github.com/ionic-team/capacitor/commit/dcb368c33555487f1b6f46a6d8e30736bdd78955)) +- **cli:** use latest native-run ([#8296](https://github.com/ionic-team/capacitor/issues/8296)) ([121d830](https://github.com/ionic-team/capacitor/commit/121d83013f39e25009121533a2c3ad86e428d6b2)) + # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index 3527315225..3e1f298858 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.0.0", + "version": "8.0.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 41eeb14986..921a9a9886 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.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) + +**Note:** Version bump only for package @capacitor/core + # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) ### Features diff --git a/core/package.json b/core/package.json index edf1834274..25c1bbed04 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.0.0", + "version": "8.0.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 b097715bd5..f1ada5d6b9 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.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) + +**Note:** Version bump only for package @capacitor/ios + # [8.0.0](https://github.com/ionic-team/capacitor/compare/8.0.0-beta.0...8.0.0) (2025-12-08) ### Bug Fixes diff --git a/ios/package.json b/ios/package.json index b23bde6bfc..3d5b10b290 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.0.0", + "version": "8.0.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 70c549acfd..d790680ade 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.0.0", + "version": "8.0.1", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 95dc7d8ace3aabdda7e325c4a8ef7d1432ad37e9 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 13 Jan 2026 17:33:22 +0100 Subject: [PATCH 02/42] fix(core): make SystemBars hide and show options optional (#8305) --- core/src/core-plugins.ts | 4 ++-- core/system-bars.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/core-plugins.ts b/core/src/core-plugins.ts index 8a4bd755f3..276fd0a972 100644 --- a/core/src/core-plugins.ts +++ b/core/src/core-plugins.ts @@ -617,14 +617,14 @@ export interface SystemBarsPlugin { * * @since 8.0.0 */ - show(options: SystemBarsVisibilityOptions): Promise; + show(options?: SystemBarsVisibilityOptions): Promise; /** * Hide the system bars. * * @since 8.0.0 */ - hide(options: SystemBarsVisibilityOptions): Promise; + hide(options?: SystemBarsVisibilityOptions): Promise; /** * Set the animation to use when showing / hiding the status bar. diff --git a/core/system-bars.md b/core/system-bars.md index 2f9b78603f..c7654063bc 100644 --- a/core/system-bars.md +++ b/core/system-bars.md @@ -39,7 +39,7 @@ To control this behavior, use the `insetsHandling` configuration setting. ## Example ```typescript -import { SystemBars, SystemBarsStyle } from '@capacitor/core'; +import { SystemBars, SystemBarsStyle, SystemBarType } from '@capacitor/core'; const setSystemBarStyleDark = async () => { await SystemBars.setStyle({ style: SystemBarsStyle.Dark }); @@ -152,7 +152,7 @@ Set the current style of the system bars. ### show(...) ```typescript -show(options: SystemBarsVisibilityOptions) => Promise +show(options?: SystemBarsVisibilityOptions) => Promise ``` Show the system bars. @@ -169,7 +169,7 @@ Show the system bars. ### hide(...) ```typescript -hide(options: SystemBarsVisibilityOptions) => Promise +hide(options?: SystemBarsVisibilityOptions) => Promise ``` Hide the system bars. From 2a66b44915895f971e4a26a8612798aa2f95ea11 Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Tue, 13 Jan 2026 12:07:50 -0600 Subject: [PATCH 03/42] fix(SystemBars): get correct style on handleOnConfigurationChanged (#8295) --- .../src/main/java/com/getcapacitor/plugin/SystemBars.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 affb414a7b..2c7243b793 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -47,6 +47,8 @@ function capacitorSystemBarsCheckMetaViewport() { private boolean insetHandlingEnabled = true; private boolean hasViewportCover = false; + private String currentStyle = STYLE_DEFAULT; + @Override public void load() { getBridge().getWebView().addJavascriptInterface(this, "CapacitorSystemBarsAndroidInterface"); @@ -73,7 +75,7 @@ public void onPageCommitVisible(WebView view, String url) { @Override protected void handleOnConfigurationChanged(Configuration newConfig) { super.handleOnConfigurationChanged(newConfig); - setStyle(STYLE_DEFAULT, ""); + setStyle(currentStyle, ""); } private void initSystemBars() { @@ -224,6 +226,8 @@ private void injectSafeAreaCSS(int top, int right, int bottom, int left) { } private void setStyle(String style, String bar) { + currentStyle = style; + if (style.equals(STYLE_DEFAULT)) { style = getStyleForTheme(); } From 0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 20 Jan 2026 15:55:42 +0100 Subject: [PATCH 04/42] fix(cli): Update tar package (#8311) --- cli/package.json | 3 +-- cli/src/util/template.ts | 4 ++-- package.json | 3 +-- scripts/pack-cli-assets.mjs | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/cli/package.json b/cli/package.json index 3e1f298858..d4293140df 100644 --- a/cli/package.json +++ b/cli/package.json @@ -58,7 +58,7 @@ "prompts": "^2.4.2", "rimraf": "^6.0.1", "semver": "^7.6.3", - "tar": "^6.1.11", + "tar": "^7.5.3", "tslib": "^2.8.1", "xml2js": "^0.6.2" }, @@ -69,7 +69,6 @@ "@types/plist": "^3.0.5", "@types/prompts": "^2.4.9", "@types/semver": "^7.5.8", - "@types/tar": "^6.1.1", "@types/tmp": "^0.2.6", "@types/xml2js": "0.4.5", "jest": "^29.7.0", diff --git a/cli/src/util/template.ts b/cli/src/util/template.ts index 76b699ee26..dd36751cf0 100644 --- a/cli/src/util/template.ts +++ b/cli/src/util/template.ts @@ -1,7 +1,7 @@ import { mkdirp } from 'fs-extra'; -import tar from 'tar'; +import { extract } from 'tar'; export async function extractTemplate(src: string, dir: string): Promise { await mkdirp(dir); - await tar.extract({ file: src, cwd: dir }); + await extract({ file: src, cwd: dir }); } diff --git a/package.json b/package.json index 82c7768812..8f339f1966 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "@ionic/prettier-config": "^4.0.0", "@ionic/swiftlint-config": "^2.0.0", "@types/node": "18.18.6", - "@types/tar": "^6.1.2", "eslint": "^8.57.0", "lerna": "^7.1.3", "prettier": "^3.3.0", @@ -41,6 +40,6 @@ "rimraf": "^4.4.1", "semver": "^7.3.7", "swiftlint": "^2.0.0", - "tar": "^6.1.11" + "tar": "^7.5.3" } } diff --git a/scripts/pack-cli-assets.mjs b/scripts/pack-cli-assets.mjs index 99dae12e65..20df223c12 100644 --- a/scripts/pack-cli-assets.mjs +++ b/scripts/pack-cli-assets.mjs @@ -1,5 +1,5 @@ import { resolve } from 'path'; -import tar from 'tar'; +import { create } from 'tar'; import { execute } from './lib/cli.mjs'; import { mkdir } from './lib/fs.mjs'; @@ -25,7 +25,7 @@ execute(async () => { const files = await lsfiles(templatePath, { cwd: templatePath }); - await tar.create({ gzip: true, file: dest, cwd: templatePath }, files); + await create({ gzip: true, file: dest, cwd: templatePath }, files); console.log(`Packed ${dest}!`); } From 53c33b614218bf635322fbdf9a38038a7964e3d4 Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Thu, 22 Jan 2026 10:01:27 -0600 Subject: [PATCH 05/42] fix(SystemBars): Skipping margin manipulation when on a fixed WebView (#8309) --- .../com/getcapacitor/plugin/SystemBars.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 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 2c7243b793..a03d6fb193 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -1,5 +1,6 @@ package com.getcapacitor.plugin; +import android.content.pm.PackageInfo; import android.content.res.Configuration; import android.os.Build; import android.view.View; @@ -12,6 +13,7 @@ import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; +import androidx.webkit.WebViewCompat; import com.getcapacitor.Plugin; import com.getcapacitor.PluginCall; import com.getcapacitor.PluginMethod; @@ -145,6 +147,9 @@ public void onDOMReady() { private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { Insets safeArea = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout()); + if (insets.isVisible(WindowInsetsCompat.Type.ime())) { + return Insets.of(safeArea.left, safeArea.top, safeArea.right, 0); + } return Insets.of(safeArea.left, safeArea.top, safeArea.right, safeArea.bottom); } @@ -162,21 +167,25 @@ private void initSafeAreaInsets() { private void initWindowInsetsListener() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { + boolean hasBrokenWebViewVersion = getWebViewMajorVersion() <= 139; + if (hasViewportCover) { Insets safeAreaInsets = calcSafeAreaInsets(insets); - boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); - - if (keyboardVisible) { - safeAreaInsets = Insets.of(safeAreaInsets.left, safeAreaInsets.top, safeAreaInsets.right, 0); + injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); + } - Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); - setViewMargins(v, Insets.of(0, 0, 0, imeInsets.bottom)); - } else { - setViewMargins(v, Insets.NONE); + if (hasBrokenWebViewVersion) { + if (hasViewportCover && v.hasWindowFocus() && v.isShown()) { + boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); + if (keyboardVisible) { + Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); + setViewMargins(v, Insets.of(0, 0, 0, imeInsets.bottom)); + } else { + setViewMargins(v, Insets.NONE); + } + + return WindowInsetsCompat.CONSUMED; } - - injectSafeAreaCSS(safeAreaInsets.top, safeAreaInsets.right, safeAreaInsets.bottom, safeAreaInsets.left); - return WindowInsetsCompat.CONSUMED; } return insets; @@ -272,4 +281,14 @@ private String getStyleForTheme() { } return STYLE_DARK; } + + private Integer getWebViewMajorVersion() { + PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); + if (info != null && info.versionName != null) { + String[] versionSegments = info.versionName.split("\\."); + return Integer.valueOf(versionSegments[0]); + } + + return 0; + } } From 6037e3836ec24c9ddf26e74e5fbec20ab506adfd Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Mon, 26 Jan 2026 09:48:20 -0600 Subject: [PATCH 06/42] fix(SystemBars): Set window background color according to theme (#8306) --- .../java/com/getcapacitor/plugin/SystemBars.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 a03d6fb193..3f04adf976 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -1,8 +1,11 @@ package com.getcapacitor.plugin; +import android.content.Context; import android.content.pm.PackageInfo; import android.content.res.Configuration; +import android.content.res.Resources; import android.os.Build; +import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -77,6 +80,7 @@ public void onPageCommitVisible(WebView view, String url) { @Override protected void handleOnConfigurationChanged(Configuration newConfig) { super.handleOnConfigurationChanged(newConfig); + setStyle(currentStyle, ""); } @@ -250,6 +254,8 @@ private void setStyle(String style, String bar) { if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) { windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK)); } + + getActivity().getWindow().getDecorView().setBackgroundColor(getThemeColor(getContext(), android.R.attr.windowBackground)); } private void setHidden(boolean hide, String bar) { @@ -282,6 +288,14 @@ private String getStyleForTheme() { return STYLE_DARK; } + public int getThemeColor(Context context, int attrRes) { + TypedValue typedValue = new TypedValue(); + + Resources.Theme theme = context.getTheme(); + theme.resolveAttribute(attrRes, typedValue, true); + return typedValue.data; + } + private Integer getWebViewMajorVersion() { PackageInfo info = WebViewCompat.getCurrentWebViewPackage(getContext()); if (info != null && info.versionName != null) { From dcc76c37508a9b71fb36d95707748c2dd115cf52 Mon Sep 17 00:00:00 2001 From: Terence Honles Date: Tue, 27 Jan 2026 17:35:19 +0100 Subject: [PATCH 07/42] fix(android): AGP 9.0 no longer supports `proguard-android.txt` (#8315) --- android/capacitor/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/capacitor/build.gradle b/android/capacitor/build.gradle index dd998c1aff..6ece3eda05 100644 --- a/android/capacitor/build.gradle +++ b/android/capacitor/build.gradle @@ -53,7 +53,7 @@ android { buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } lintOptions { From 154f3cec41cc76bb9d3531ed566985f9ceadf5d6 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of markemer)" Date: Tue, 27 Jan 2026 17:29:03 +0000 Subject: [PATCH 08/42] Release 8.0.2 --- CHANGELOG.md | 11 +++++++++++ android/CHANGELOG.md | 9 +++++++++ android/package.json | 2 +- cli/CHANGELOG.md | 6 ++++++ cli/package.json | 2 +- core/CHANGELOG.md | 6 ++++++ core/package.json | 2 +- ios/CHANGELOG.md | 4 ++++ ios/package.json | 2 +- lerna.json | 2 +- 10 files changed, 41 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a40e32add6..ba7d6106a4 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.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) + +### Bug Fixes + +- **android:** AGP 9.0 no longer supports `proguard-android.txt` ([#8315](https://github.com/ionic-team/capacitor/issues/8315)) ([dcc76c3](https://github.com/ionic-team/capacitor/commit/dcc76c37508a9b71fb36d95707748c2dd115cf52)) +- **cli:** Update tar package ([#8311](https://github.com/ionic-team/capacitor/issues/8311)) ([0969c5c](https://github.com/ionic-team/capacitor/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) +- **core:** make SystemBars hide and show options optional ([#8305](https://github.com/ionic-team/capacitor/issues/8305)) ([95dc7d8](https://github.com/ionic-team/capacitor/commit/95dc7d8ace3aabdda7e325c4a8ef7d1432ad37e9)) +- **SystemBars:** get correct style on handleOnConfigurationChanged ([#8295](https://github.com/ionic-team/capacitor/issues/8295)) ([2a66b44](https://github.com/ionic-team/capacitor/commit/2a66b44915895f971e4a26a8612798aa2f95ea11)) +- **SystemBars:** Set window background color according to theme ([#8306](https://github.com/ionic-team/capacitor/issues/8306)) ([6037e38](https://github.com/ionic-team/capacitor/commit/6037e3836ec24c9ddf26e74e5fbec20ab506adfd)) +- **SystemBars:** Skipping margin manipulation when on a fixed WebView ([#8309](https://github.com/ionic-team/capacitor/issues/8309)) ([53c33b6](https://github.com/ionic-team/capacitor/commit/53c33b614218bf635322fbdf9a38038a7964e3d4)) + ## [8.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 4366b9e7c9..be9db4c964 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [8.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) + +### Bug Fixes + +- **android:** AGP 9.0 no longer supports `proguard-android.txt` ([#8315](https://github.com/ionic-team/capacitor/issues/8315)) ([dcc76c3](https://github.com/ionic-team/capacitor/commit/dcc76c37508a9b71fb36d95707748c2dd115cf52)) +- **SystemBars:** get correct style on handleOnConfigurationChanged ([#8295](https://github.com/ionic-team/capacitor/issues/8295)) ([2a66b44](https://github.com/ionic-team/capacitor/commit/2a66b44915895f971e4a26a8612798aa2f95ea11)) +- **SystemBars:** Set window background color according to theme ([#8306](https://github.com/ionic-team/capacitor/issues/8306)) ([6037e38](https://github.com/ionic-team/capacitor/commit/6037e3836ec24c9ddf26e74e5fbec20ab506adfd)) +- **SystemBars:** Skipping margin manipulation when on a fixed WebView ([#8309](https://github.com/ionic-team/capacitor/issues/8309)) ([53c33b6](https://github.com/ionic-team/capacitor/commit/53c33b614218bf635322fbdf9a38038a7964e3d4)) + ## [8.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) ### Bug Fixes diff --git a/android/package.json b/android/package.json index 87ea730cf4..81d957abc3 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.0.1", + "version": "8.0.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 76b572cf9b..eaf2406bcb 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.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) + +### Bug Fixes + +- **cli:** Update tar package ([#8311](https://github.com/ionic-team/capacitor/issues/8311)) ([0969c5c](https://github.com/ionic-team/capacitor/commit/0969c5cd0b16cf23d2489a85a3b8fa1bee2ebf3b)) + ## [8.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index d4293140df..69ea186e4e 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.0.1", + "version": "8.0.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 921a9a9886..f0aa1a8c66 100644 --- a/core/CHANGELOG.md +++ b/core/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.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) + +### Bug Fixes + +- **core:** make SystemBars hide and show options optional ([#8305](https://github.com/ionic-team/capacitor/issues/8305)) ([95dc7d8](https://github.com/ionic-team/capacitor/commit/95dc7d8ace3aabdda7e325c4a8ef7d1432ad37e9)) + ## [8.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index 25c1bbed04..ed25a387b1 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.0.1", + "version": "8.0.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 f1ada5d6b9..44d394b804 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.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) + +**Note:** Version bump only for package @capacitor/ios + ## [8.0.1](https://github.com/ionic-team/capacitor/compare/8.0.0...8.0.1) (2026-01-13) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index 3d5b10b290..a200fac3d0 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.0.1", + "version": "8.0.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 d790680ade..1d634660cf 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.0.1", + "version": "8.0.2", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From c5476c8f7ed58a13580ade9d1c0c2c84a867240b Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Wed, 28 Jan 2026 11:27:45 -0500 Subject: [PATCH 09/42] chore: update latest workflow to only allow pointing at 8.x (#8319) --- .github/workflows/publish-npm-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-npm-latest.yml b/.github/workflows/publish-npm-latest.yml index 3f5e7bc244..774c8fbd31 100644 --- a/.github/workflows/publish-npm-latest.yml +++ b/.github/workflows/publish-npm-latest.yml @@ -15,7 +15,7 @@ permissions: jobs: deploy-npm-latest: - if: github.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/8.x' runs-on: macos-15 timeout-minutes: 30 steps: From 44e1cd541c9995a5b910bd7a5d99dc043a09843b Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Thu, 29 Jan 2026 19:12:08 +0100 Subject: [PATCH 10/42] chore(ci): download iOS simulators and test on iPhone 17 (#8322) --- .github/workflows/ci.yml | 2 ++ .github/workflows/publish-ios.yml | 2 ++ ios/package.json | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a261ce46ff..56fce53892 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -100,6 +100,8 @@ jobs: - /Applications/Xcode_26.0.app steps: - run: sudo xcode-select --switch ${{ matrix.xcode }} + - run: xcrun simctl list > /dev/null + - run: xcodebuild -downloadPlatform iOS - uses: actions/setup-node@v6 with: node-version: 22.x diff --git a/.github/workflows/publish-ios.yml b/.github/workflows/publish-ios.yml index ff6ba0ddaa..e5e6447767 100644 --- a/.github/workflows/publish-ios.yml +++ b/.github/workflows/publish-ios.yml @@ -13,6 +13,8 @@ jobs: timeout-minutes: 30 steps: - run: sudo xcode-select --switch /Applications/Xcode_26.0.app + - run: xcrun simctl list > /dev/null + - run: xcodebuild -downloadPlatform iOS - uses: actions/setup-node@v6 with: node-version: 22.x diff --git a/ios/package.json b/ios/package.json index a200fac3d0..87f1871398 100644 --- a/ios/package.json +++ b/ios/package.json @@ -21,7 +21,7 @@ ], "scripts": { "verify": "npm run xc:build:Capacitor && npm run xc:build:CapacitorCordova", - "xc:build:Capacitor": "cd Capacitor && xcodebuild clean test -workspace Capacitor.xcworkspace -scheme Capacitor -destination 'platform=iOS Simulator,name=iPhone 16,OS=26.0.1' && cd ..", + "xc:build:Capacitor": "cd Capacitor && xcodebuild clean test -workspace Capacitor.xcworkspace -scheme Capacitor -destination 'platform=iOS Simulator,name=iPhone 17,OS=26.0.1' && cd ..", "xc:build:CapacitorCordova": "cd CapacitorCordova && xcodebuild && cd .." }, "peerDependencies": { From 0412d464af5100f88362357582634bf40cd327c9 Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Thu, 29 Jan 2026 16:54:53 -0500 Subject: [PATCH 11/42] chore: bump main to 9.0.0-dev.0 (#8320) --- android/package.json | 4 ++-- cli/package.json | 2 +- core/package.json | 2 +- ios/package.json | 4 ++-- lerna.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/android/package.json b/android/package.json index 81d957abc3..d1f6155219 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.0.2", + "version": "9.0.0-dev.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.0.0" + "@capacitor/core": "^9.0.0-dev.0" }, "publishConfig": { "access": "public" diff --git a/cli/package.json b/cli/package.json index 69ea186e4e..9f9d89eed9 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.0.2", + "version": "9.0.0-dev.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/package.json b/core/package.json index ed25a387b1..674c151eff 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.0.2", + "version": "9.0.0-dev.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/package.json b/ios/package.json index 87f1871398..477e3c881b 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.0.2", + "version": "9.0.0-dev.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.0.0" + "@capacitor/core": "^9.0.0-dev.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index 1d634660cf..cac40342b5 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.0.2", + "version": "9.0.0-dev.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From a1254983bbb9dcb273d93f3c5f639b792e516406 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 3 Feb 2026 21:06:24 +0100 Subject: [PATCH 12/42] feat(cli): Add packageManager to iOS config (#8321) --- cli/src/config.ts | 34 ++++++++++++++++++++++------------ cli/src/definitions.ts | 4 ++++ cli/src/index.ts | 15 ++++++++++++--- cli/src/ios/build.ts | 5 +---- cli/src/ios/common.ts | 11 +++++++++++ cli/src/ios/doctor.ts | 4 ++-- cli/src/ios/open.ts | 3 +-- cli/src/ios/run.ts | 5 ++--- cli/src/ios/update.ts | 25 ++++++++++--------------- cli/src/tasks/add.ts | 8 ++++---- cli/src/tasks/migrate-spm.ts | 14 ++++++++------ cli/src/tasks/migrate.ts | 3 +-- cli/src/tasks/sync.ts | 4 ++-- cli/src/tasks/update.ts | 27 ++++++++++++++++++++++++--- cli/src/util/spm.ts | 31 +++++++++++++++---------------- 15 files changed, 119 insertions(+), 74 deletions(-) diff --git a/cli/src/config.ts b/cli/src/config.ts index 216a15abee..b7e2735181 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -1,5 +1,5 @@ import Debug from 'debug'; -import { pathExists, readFile, readJSON, writeFile, writeJSON } from 'fs-extra'; +import { existsSync, pathExists, readFile, readJSON, writeFile, writeJSON } from 'fs-extra'; import { dirname, extname, join, relative, resolve } from 'path'; import c from './colors'; @@ -13,6 +13,7 @@ import type { IOSConfig, WebConfig, XcodeExportMethod, + PackageManager, } from './definitions'; import { OS } from './definitions'; import { fatal, isFatal } from './errors'; @@ -22,7 +23,7 @@ import { formatJSObject } from './util/js'; import { findNXMonorepoRoot, isNXMonorepo } from './util/monorepotools'; import { requireTS, resolveNode } from './util/node'; import { lazy } from './util/promise'; -import { getCommandOutput } from './util/subprocess'; +import { getCommandOutput, isInstalled } from './util/subprocess'; const debug = Debug('capacitor:config'); @@ -273,7 +274,8 @@ async function loadIOSConfig(rootDir: string, extConfig: ExternalConfig): Promis const nativeXcodeProjDir = `${nativeProjectDir}/App.xcodeproj`; const nativeXcodeProjDirAbs = resolve(platformDirAbs, nativeXcodeProjDir); const nativeXcodeWorkspaceDirAbs = lazy(() => determineXcodeWorkspaceDirAbs(nativeProjectDirAbs)); - const podPath = lazy(() => determineGemfileOrCocoapodPath(rootDir, platformDirAbs, nativeProjectDirAbs)); + const podPath = lazy(() => determineCocoapodPath()); + const packageManager = lazy(() => determinePackageManager(rootDir, platformDirAbs, nativeProjectDirAbs)); const webDirAbs = lazy(() => determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs)); const cordovaPluginsDir = 'capacitor-cordova-ios-plugins'; const buildOptions = { @@ -301,6 +303,7 @@ async function loadIOSConfig(rootDir: string, extConfig: ExternalConfig): Promis webDir: lazy(async () => relative(platformDirAbs, await webDirAbs)), webDirAbs, podPath, + packageManager, buildOptions, }; } @@ -415,13 +418,20 @@ async function determineAndroidStudioPath(os: OS): Promise { return ''; } -async function determineGemfileOrCocoapodPath( +async function determineCocoapodPath(): Promise { + if (process.env.CAPACITOR_COCOAPODS_PATH) { + return process.env.CAPACITOR_COCOAPODS_PATH; + } + return 'pod'; +} + +async function determinePackageManager( rootDir: string, platformDir: any, nativeProjectDirAbs: string, -): Promise { - if (process.env.CAPACITOR_COCOAPODS_PATH) { - return process.env.CAPACITOR_COCOAPODS_PATH; +): Promise { + if (existsSync(resolve(nativeProjectDirAbs, 'CapApp-SPM'))) { + return 'SPM'; } let gemfilePath = ''; @@ -450,17 +460,17 @@ async function determineGemfileOrCocoapodPath( try { const gemfileText = (await readFile(gemfilePath)).toString(); if (!gemfileText) { - return 'pod'; + return 'Cocoapods'; } const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText); - if (cocoapodsInGemfile) { - return 'bundle exec pod'; + if (cocoapodsInGemfile && (await isInstalled('bundle'))) { + return 'bundler'; } else { - return 'pod'; + return 'Cocoapods'; } } catch { - return 'pod'; + return 'Cocoapods'; } } diff --git a/cli/src/definitions.ts b/cli/src/definitions.ts index 893a9d0300..2df6398e97 100644 --- a/cli/src/definitions.ts +++ b/cli/src/definitions.ts @@ -3,6 +3,7 @@ import type { CapacitorConfig, PluginsConfig } from './declarations'; type DeepReadonly = { readonly [P in keyof T]: DeepReadonly }; export type ExternalConfig = DeepReadonly; +export type Writable = T extends object ? { -readonly [K in keyof T]: Writable } : T; export const enum OS { Unknown = 'unknown', @@ -11,6 +12,8 @@ export const enum OS { Linux = 'linux', } +export type PackageManager = 'Cocoapods' | 'bundler' | 'SPM'; + export interface PackageJson { readonly name: string; readonly version: string; @@ -116,6 +119,7 @@ export interface IOSConfig extends PlatformConfig { readonly cordovaPluginsDirAbs: string; readonly minVersion: string; readonly podPath: Promise; + readonly packageManager: Promise; readonly scheme: string; readonly webDir: Promise; readonly webDirAbs: Promise; diff --git a/cli/src/index.ts b/cli/src/index.ts index 999fb0c1af..7cbbe7679e 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -3,7 +3,7 @@ import { resolve } from 'path'; import c from './colors'; import { loadConfig } from './config'; -import type { Config } from './definitions'; +import type { Config, PackageManager, Writable } from './definitions'; import { fatal, isFatal } from './errors'; import { receive } from './ipc'; import { logger, output } from './log'; @@ -11,8 +11,6 @@ import { telemetryAction } from './telemetry'; import { wrapAction } from './util/cli'; import { emoji as _e } from './util/emoji'; -type Writable = T extends object ? { -readonly [K in keyof T]: Writable } : T; - process.on('unhandledRejection', (error) => { console.error(c.failure('[fatal]'), error); }); @@ -29,6 +27,16 @@ export async function run(): Promise { } } +async function getPackageManager(config: Config, packageManager: any): Promise { + if (packageManager === 'cocoapods') { + if ((await config.ios.packageManager) === 'bundler') { + return 'bundler'; + } + return 'Cocoapods'; + } + return 'SPM'; +} + export function runProgram(config: Config): void { program.version(config.cli.package.version); @@ -313,6 +321,7 @@ export function runProgram(config: Config): void { const { addCommand } = await import('./tasks/add'); const configWritable: Writable = config as Writable; + configWritable.ios.packageManager = getPackageManager(config, packagemanager?.toLowerCase()); if (packagemanager?.toLowerCase() === 'CocoaPods'.toLowerCase()) { configWritable.cli.assets.ios.platformTemplateArchive = 'ios-pods-template.tar.gz'; configWritable.cli.assets.ios.platformTemplateArchiveAbs = resolve( diff --git a/cli/src/ios/build.ts b/cli/src/ios/build.ts index 982e30c337..83485f913a 100644 --- a/cli/src/ios/build.ts +++ b/cli/src/ios/build.ts @@ -6,18 +6,15 @@ import { runTask } from '../common'; import { XcodeExportMethod, type Config } from '../definitions'; import { logSuccess } from '../log'; import { type BuildCommandOptions } from '../tasks/build'; -import { checkPackageManager } from '../util/spm'; import { runCommand } from '../util/subprocess'; export async function buildiOS(config: Config, buildOptions: BuildCommandOptions): Promise { const theScheme = buildOptions.scheme ?? 'App'; - const packageManager = await checkPackageManager(config); - let typeOfBuild: string; let projectName: string; - if (packageManager == 'Cocoapods') { + if ((await config.ios.packageManager) !== 'SPM') { typeOfBuild = '-workspace'; projectName = basename(await config.ios.nativeXcodeWorkspaceDirAbs); } else { diff --git a/cli/src/ios/common.ts b/cli/src/ios/common.ts index 71bd344990..312c13dad2 100644 --- a/cli/src/ios/common.ts +++ b/cli/src/ios/common.ts @@ -4,6 +4,7 @@ import { join, resolve } from 'path'; import c from '../colors'; import { checkCapacitorPlatform } from '../common'; +import type { CheckFunction } from '../common'; import { getIncompatibleCordovaPlugins } from '../cordova'; import { OS } from '../definitions'; import type { Config } from '../definitions'; @@ -25,6 +26,16 @@ function execBundler() { } } +export async function getCommonChecks(config: Config): Promise { + const checks: CheckFunction[] = []; + if ((await config.ios.packageManager) === 'bundler') { + checks.push(() => checkBundler(config)); + } else if ((await config.ios.packageManager) === 'Cocoapods') { + checks.push(() => checkCocoaPods(config)); + } + return checks; +} + export async function checkBundler(config: Config): Promise { if (config.cli.os === OS.Mac) { let bundlerResult = execBundler(); diff --git a/cli/src/ios/doctor.ts b/cli/src/ios/doctor.ts index 77d9b8b175..87bb3911f5 100644 --- a/cli/src/ios/doctor.ts +++ b/cli/src/ios/doctor.ts @@ -4,7 +4,7 @@ import { fatal } from '../errors'; import { logSuccess } from '../log'; import { isInstalled } from '../util/subprocess'; -import { checkBundler, checkCocoaPods } from './common'; +import { getCommonChecks } from './common'; export async function doctorIOS(config: Config): Promise { // DOCTOR ideas for iOS: @@ -19,7 +19,7 @@ export async function doctorIOS(config: Config): Promise { // check online datebase of common errors // check if www folder is empty (index.html does not exist) try { - await check([() => checkBundler(config) || checkCocoaPods(config), () => checkWebDir(config), checkXcode]); + await check([() => checkWebDir(config), checkXcode, ...(await getCommonChecks(config))]); logSuccess('iOS looking great! 👌'); } catch (e: any) { fatal(e.stack ?? e); diff --git a/cli/src/ios/open.ts b/cli/src/ios/open.ts index ea115ca0f2..3652b9eeac 100644 --- a/cli/src/ios/open.ts +++ b/cli/src/ios/open.ts @@ -2,10 +2,9 @@ import open from 'open'; import { wait } from '../common'; import type { Config } from '../definitions'; -import { checkPackageManager } from '../util/spm'; export async function openIOS(config: Config): Promise { - if ((await checkPackageManager(config)) == 'SPM') { + if ((await config.ios.packageManager) == 'SPM') { await open(config.ios.nativeXcodeProjDirAbs, { wait: false }); } else { await open(await config.ios.nativeXcodeWorkspaceDirAbs, { wait: false }); diff --git a/cli/src/ios/run.ts b/cli/src/ios/run.ts index 13a031f395..d893f8cf1e 100644 --- a/cli/src/ios/run.ts +++ b/cli/src/ios/run.ts @@ -6,7 +6,6 @@ import { promptForPlatformTarget, runTask } from '../common'; import type { Config } from '../definitions'; import type { RunCommandOptions } from '../tasks/run'; import { runNativeRun, getPlatformTargets } from '../util/native-run'; -import { checkPackageManager } from '../util/spm'; import { runCommand } from '../util/subprocess'; const debug = Debug('capacitor:ios:run'); @@ -33,12 +32,12 @@ export async function runIOS( const derivedDataPath = resolve(config.ios.platformDirAbs, 'DerivedData', target.id); - const packageManager = await checkPackageManager(config); + const packageManager = await config.ios.packageManager; let typeOfBuild: string; let projectName: string; - if (packageManager == 'Cocoapods') { + if (packageManager !== 'SPM') { typeOfBuild = '-workspace'; projectName = basename(await config.ios.nativeXcodeWorkspaceDirAbs); } else { diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index e5aaea6c4e..1003098ca1 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -21,7 +21,7 @@ import { copy as copyTask } from '../tasks/copy'; import { convertToUnixPath } from '../util/fs'; import { generateIOSPackageJSON } from '../util/iosplugin'; import { resolveNode } from '../util/node'; -import { checkPackageManager, generatePackageFile, checkPluginsForPackageSwift } from '../util/spm'; +import { generatePackageFile, checkPluginsForPackageSwift } from '../util/spm'; import { runCommand, isInstalled } from '../util/subprocess'; import { extractTemplate } from '../util/template'; @@ -51,7 +51,7 @@ async function updatePluginFiles(config: Config, plugins: Plugin[], deployment: } await handleCordovaPluginsJS(cordovaPlugins, config, platform); await checkPluginDependencies(plugins, platform, config.app.extConfig.cordova?.failOnUninstalledPlugins); - if ((await checkPackageManager(config)) === 'SPM') { + if ((await config.ios.packageManager) === 'SPM') { await generateCordovaPackageFiles(cordovaPlugins, config); const validSPMPackages = await checkPluginsForPackageSwift(config, plugins); @@ -131,20 +131,15 @@ async function updatePodfile(config: Config, plugins: Plugin[], deployment: bool await writeFile(podfilePath, podfileContent, { encoding: 'utf-8' }); const podPath = await config.ios.podPath; - const useBundler = podPath.startsWith('bundle') && (await isInstalled('bundle')); - const podCommandExists = await isInstalled('pod'); - if (useBundler || podCommandExists) { - if (useBundler) { - await runCommand('bundle', ['exec', 'pod', 'install', ...(deployment ? ['--deployment'] : [])], { - cwd: config.ios.nativeProjectDirAbs, - }); - } else { - await runCommand(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { - cwd: config.ios.nativeProjectDirAbs, - }); - } + const useBundler = (await config.ios.packageManager) === 'bundler'; + if (useBundler) { + await runCommand('bundle', ['exec', 'pod', 'install', ...(deployment ? ['--deployment'] : [])], { + cwd: config.ios.nativeProjectDirAbs, + }); } else { - logger.warn('Skipping pod install because CocoaPods is not installed'); + await runCommand(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { + cwd: config.ios.nativeProjectDirAbs, + }); } const isXcodebuildAvailable = await isInstalled('xcodebuild'); diff --git a/cli/src/tasks/add.ts b/cli/src/tasks/add.ts index f849132bf4..f45b0c363c 100644 --- a/cli/src/tasks/add.ts +++ b/cli/src/tasks/add.ts @@ -22,7 +22,7 @@ import type { CheckFunction } from '../common'; import type { Config } from '../definitions'; import { fatal, isFatal } from '../errors'; import { addIOS } from '../ios/add'; -import { editProjectSettingsIOS, checkBundler, checkCocoaPods, checkIOSPackage } from '../ios/common'; +import { editProjectSettingsIOS, checkIOSPackage, getCommonChecks } from '../ios/common'; import { logger, logSuccess, output } from '../log'; import { sync } from './sync'; @@ -75,7 +75,7 @@ export async function addCommand(config: Config, selectedPlatformName: string): } try { - await check([() => checkPackage(), () => checkAppConfig(config), ...addChecks(config, platformName)]); + await check([() => checkPackage(), () => checkAppConfig(config), ...(await getAddChecks(config, platformName))]); await doAdd(config, platformName); await editPlatforms(config, platformName); @@ -110,9 +110,9 @@ function printNextSteps(platformName: string) { ); } -function addChecks(config: Config, platformName: string): CheckFunction[] { +async function getAddChecks(config: Config, platformName: string): Promise { if (platformName === config.ios.name) { - return [() => checkIOSPackage(config), () => checkBundler(config) || checkCocoaPods(config)]; + return [() => checkIOSPackage(config), ...(await getCommonChecks(config))]; } else if (platformName === config.android.name) { return [() => checkAndroidPackage(config)]; } else if (platformName === config.web.name) { diff --git a/cli/src/tasks/migrate-spm.ts b/cli/src/tasks/migrate-spm.ts index f59a069a2b..a99f5cb591 100644 --- a/cli/src/tasks/migrate-spm.ts +++ b/cli/src/tasks/migrate-spm.ts @@ -1,8 +1,9 @@ -import type { Config } from '../definitions'; +import { check } from '../common'; +import type { Config, Writable } from '../definitions'; import { fatal } from '../errors'; +import { getCommonChecks } from '../ios/common'; import { logger } from '../log'; import { - checkPackageManager, extractSPMPackageDirectory, removeCocoapodsFiles, runCocoapodsDeintegrate, @@ -12,16 +13,17 @@ import { import { update } from './update'; export async function migrateToSPM(config: Config): Promise { - if ((await checkPackageManager(config)) == 'SPM') { + if ((await config.ios.packageManager) == 'SPM') { fatal('Capacitor project is already using SPM, exiting.'); } - + await check(await getCommonChecks(config)); await extractSPMPackageDirectory(config); await runCocoapodsDeintegrate(config); await removeCocoapodsFiles(config); await addInfoPlistDebugIfNeeded(config); - await update(config, 'ios', true); - + const configWritable: Writable = config as Writable; + configWritable.ios.packageManager = Promise.resolve('SPM'); + await update(configWritable as Config, 'ios', false); logger.info( 'To complete migration follow the manual steps at https://capacitorjs.com/docs/ios/spm#using-our-migration-tool', ); diff --git a/cli/src/tasks/migrate.ts b/cli/src/tasks/migrate.ts index 8794c704ab..b2c419c080 100644 --- a/cli/src/tasks/migrate.ts +++ b/cli/src/tasks/migrate.ts @@ -10,7 +10,6 @@ import { fatal } from '../errors'; import { getMajoriOSVersion } from '../ios/common'; import { logger, logPrompt, logSuccess } from '../log'; import { deleteFolderRecursive } from '../util/fs'; -import { checkPackageManager } from '../util/spm'; import { runCommand } from '../util/subprocess'; import { extractTemplate } from '../util/template'; @@ -161,7 +160,7 @@ export async function migrateCommand(config: Config, noprompt: boolean, packagem ); }); - if ((await checkPackageManager(config)) === 'Cocoapods') { + if ((await config.ios.packageManager) !== 'SPM') { // Update Podfile await runTask(`Migrating Podfile to ${iOSVersion}.0.`, () => { return updateFile( diff --git a/cli/src/tasks/sync.ts b/cli/src/tasks/sync.ts index 98660e8b8c..e76ecaac87 100644 --- a/cli/src/tasks/sync.ts +++ b/cli/src/tasks/sync.ts @@ -5,7 +5,7 @@ import { logger } from '../log'; import { allSerial } from '../util/promise'; import { copy, copyCommand } from './copy'; -import { update, updateChecks, updateCommand } from './update'; +import { addUpdateChecks, update, updateCommand } from './update'; /** * Sync is a copy and an update in one. @@ -27,7 +27,7 @@ export async function syncCommand( const then = +new Date(); const platforms = await selectPlatforms(config, selectedPlatformName); try { - await check([() => checkPackage(), () => checkWebDir(config), ...updateChecks(config, platforms)]); + await check([() => checkPackage(), () => checkWebDir(config), ...(await addUpdateChecks(config, platforms))]); await allSerial(platforms.map((platformName) => () => sync(config, platformName, deployment, inline))); const now = +new Date(); const diff = (now - then) / 1000; diff --git a/cli/src/tasks/update.ts b/cli/src/tasks/update.ts index a2b6cbe0d6..362a20aa70 100644 --- a/cli/src/tasks/update.ts +++ b/cli/src/tasks/update.ts @@ -13,7 +13,7 @@ import { import type { CheckFunction } from '../common'; import type { Config } from '../definitions'; import { fatal, isFatal } from '../errors'; -import { checkBundler, checkCocoaPods } from '../ios/common'; +import { checkBundler, checkCocoaPods, getCommonChecks } from '../ios/common'; import { updateIOS } from '../ios/update'; import { logger } from '../log'; import { allSerial } from '../util/promise'; @@ -30,8 +30,7 @@ export async function updateCommand(config: Config, selectedPlatformName: string const then = +new Date(); const platforms = await selectPlatforms(config, selectedPlatformName); try { - await check([() => checkPackage(), ...updateChecks(config, platforms)]); - + await check([() => checkPackage(), ...(await addUpdateChecks(config, platforms))]); await allSerial(platforms.map((platformName) => async () => await update(config, platformName, deployment))); const now = +new Date(); const diff = (now - then) / 1000; @@ -46,6 +45,28 @@ export async function updateCommand(config: Config, selectedPlatformName: string } } +export async function addUpdateChecks(config: Config, platforms: string[]): Promise { + let checks: CheckFunction[] = []; + for (const platformName of platforms) { + if (platformName === config.ios.name) { + checks = await getCommonChecks(config); + } else if (platformName === config.android.name) { + continue; + } else if (platformName === config.web.name) { + continue; + } else { + throw `Platform ${platformName} is not valid.`; + } + } + return checks; +} + +/** + * @deprecated use addUpdateChecks + * @param config + * @param platforms + * @returns + */ export function updateChecks(config: Config, platforms: string[]): CheckFunction[] { const checks: CheckFunction[] = []; for (const platformName of platforms) { diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index b5dc1a8afc..30e51cf1a4 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -12,13 +12,18 @@ import { getMajoriOSVersion } from '../ios/common'; import { logger } from '../log'; import type { Plugin } from '../plugin'; import { getPluginType, PluginType } from '../plugin'; -import { runCommand, isInstalled } from '../util/subprocess'; +import { runCommand } from '../util/subprocess'; export interface SwiftPlugin { name: string; path: string; } +/** + * @deprecated use config.ios.packageManager + * @param config + * @returns 'Cocoapods' | 'SPM' + */ export async function checkPackageManager(config: Config): Promise<'Cocoapods' | 'SPM'> { const iosDirectory = config.ios.nativeProjectDirAbs; if (existsSync(resolve(iosDirectory, 'CapApp-SPM'))) { @@ -144,25 +149,19 @@ let package = Package( export async function runCocoapodsDeintegrate(config: Config): Promise { const podPath = await config.ios.podPath; const projectFileName = config.ios.nativeXcodeProjDirAbs; - const useBundler = podPath.startsWith('bundle') && (await isInstalled('bundle')); - const podCommandExists = await isInstalled('pod'); - - if (useBundler) logger.info('Found bundler, using it to run CocoaPods.'); + const useBundler = (await config.ios.packageManager) === 'bundler'; logger.info('Running pod deintegrate on project ' + projectFileName); - if (useBundler || podCommandExists) { - if (useBundler) { - await runCommand('bundle', ['exec', 'pod', 'deintegrate', projectFileName], { - cwd: config.ios.nativeProjectDirAbs, - }); - } else { - await runCommand(podPath, ['deintegrate', projectFileName], { - cwd: config.ios.nativeProjectDirAbs, - }); - } + if (useBundler) { + logger.info('Found bundler, using it to run CocoaPods.'); + await runCommand('bundle', ['exec', 'pod', 'deintegrate', projectFileName], { + cwd: config.ios.nativeProjectDirAbs, + }); } else { - logger.warn('Skipping pod deintegrate because CocoaPods is not installed - migration will be incomplete'); + await runCommand(podPath, ['deintegrate', projectFileName], { + cwd: config.ios.nativeProjectDirAbs, + }); } } From b10cd7ff15b010a76802374214f4e0cbd04abdab Mon Sep 17 00:00:00 2001 From: Chace Daniels Date: Wed, 11 Feb 2026 10:22:00 -0600 Subject: [PATCH 13/42] fix(cookies): only send expires param on web if a date is set --- core/src/core-plugins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/core-plugins.ts b/core/src/core-plugins.ts index 276fd0a972..a1efe9c901 100644 --- a/core/src/core-plugins.ts +++ b/core/src/core-plugins.ts @@ -110,7 +110,7 @@ export class CapacitorCookiesPluginWeb extends WebPlugin implements CapacitorCoo const encodedValue = encode(options.value); // Clean & sanitize options - const expires = `; expires=${(options.expires || '').replace('expires=', '')}`; // Default is "; expires=" + const expires = options.expires ? `; expires=${options.expires.replace('expires=', '')}` : ''; const path = (options.path || '/').replace('path=', ''); // Default is "path=/" const domain = options.url != null && options.url.length > 0 ? `domain=${options.url}` : ''; From a48ebb622ea4ebe92927bf1756a4d8ac6012884b Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Wed, 11 Feb 2026 13:33:14 -0500 Subject: [PATCH 14/42] revert: revert version bump from #8319 and #8320 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts "chore: bump main to 9.0.0-dev.0 (#8320)" and “chore: update latest workflow to only allow pointing at 8.x” This reverts commit c5476c8f7ed58a13580ade9d1c0c2c84a867240b and 0412d464af5100f88362357582634bf40cd327c9 --- .github/workflows/publish-npm-latest.yml | 2 +- android/package.json | 4 ++-- cli/package.json | 2 +- core/package.json | 2 +- ios/package.json | 4 ++-- lerna.json | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/publish-npm-latest.yml b/.github/workflows/publish-npm-latest.yml index 774c8fbd31..3f5e7bc244 100644 --- a/.github/workflows/publish-npm-latest.yml +++ b/.github/workflows/publish-npm-latest.yml @@ -15,7 +15,7 @@ permissions: jobs: deploy-npm-latest: - if: github.ref == 'refs/heads/8.x' + if: github.ref == 'refs/heads/main' runs-on: macos-15 timeout-minutes: 30 steps: diff --git a/android/package.json b/android/package.json index d1f6155219..81d957abc3 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "9.0.0-dev.0", + "version": "8.0.2", "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": "^9.0.0-dev.0" + "@capacitor/core": "^8.0.0" }, "publishConfig": { "access": "public" diff --git a/cli/package.json b/cli/package.json index 9f9d89eed9..69ea186e4e 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "9.0.0-dev.0", + "version": "8.0.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/package.json b/core/package.json index 674c151eff..ed25a387b1 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "9.0.0-dev.0", + "version": "8.0.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/package.json b/ios/package.json index 477e3c881b..87f1871398 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "9.0.0-dev.0", + "version": "8.0.2", "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": "^9.0.0-dev.0" + "@capacitor/core": "^8.0.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index cac40342b5..1d634660cf 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "9.0.0-dev.0", + "version": "8.0.2", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 6994aaaf62c9b5d4aac94b39acbf700bf811b20f Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of markemer)" Date: Wed, 11 Feb 2026 18:42:42 +0000 Subject: [PATCH 15/42] Release 8.1.0 --- CHANGELOG.md | 14 ++++++++++++++ android/CHANGELOG.md | 6 ++++++ android/package.json | 4 ++-- cli/CHANGELOG.md | 10 ++++++++++ cli/package.json | 2 +- core/CHANGELOG.md | 10 ++++++++++ core/package.json | 2 +- ios/CHANGELOG.md | 6 ++++++ ios/package.json | 4 ++-- lerna.json | 2 +- 10 files changed, 53 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba7d6106a4..e6762d0fe7 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.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) + +### Bug Fixes + +- **cookies:** only send expires param on web if a date is set ([b10cd7f](https://github.com/ionic-team/capacitor/commit/b10cd7ff15b010a76802374214f4e0cbd04abdab)) + +### Features + +- **cli:** Add packageManager to iOS config ([#8321](https://github.com/ionic-team/capacitor/issues/8321)) ([a125498](https://github.com/ionic-team/capacitor/commit/a1254983bbb9dcb273d93f3c5f639b792e516406)) + +### Reverts + +- revert version bump from [#8319](https://github.com/ionic-team/capacitor/issues/8319) and [#8320](https://github.com/ionic-team/capacitor/issues/8320) ([a48ebb6](https://github.com/ionic-team/capacitor/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + ## [8.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index be9db4c964..e3baa5dfd2 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.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) + +### Reverts + +- revert version bump from [#8319](https://github.com/ionic-team/capacitor/issues/8319) and [#8320](https://github.com/ionic-team/capacitor/issues/8320) ([a48ebb6](https://github.com/ionic-team/capacitor/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + ## [8.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) ### Bug Fixes diff --git a/android/package.json b/android/package.json index 81d957abc3..6be24c6899 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.0.2", + "version": "8.1.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.0.0" + "@capacitor/core": "^8.1.0" }, "publishConfig": { "access": "public" diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index eaf2406bcb..c809b17a45 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.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) + +### Features + +- **cli:** Add packageManager to iOS config ([#8321](https://github.com/ionic-team/capacitor/issues/8321)) ([a125498](https://github.com/ionic-team/capacitor/commit/a1254983bbb9dcb273d93f3c5f639b792e516406)) + +### Reverts + +- revert version bump from [#8319](https://github.com/ionic-team/capacitor/issues/8319) and [#8320](https://github.com/ionic-team/capacitor/issues/8320) ([a48ebb6](https://github.com/ionic-team/capacitor/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + ## [8.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index 69ea186e4e..adccb1dd2a 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.0.2", + "version": "8.1.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 f0aa1a8c66..efe9480527 100644 --- a/core/CHANGELOG.md +++ b/core/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.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) + +### Bug Fixes + +- **cookies:** only send expires param on web if a date is set ([b10cd7f](https://github.com/ionic-team/capacitor/commit/b10cd7ff15b010a76802374214f4e0cbd04abdab)) + +### Reverts + +- revert version bump from [#8319](https://github.com/ionic-team/capacitor/issues/8319) and [#8320](https://github.com/ionic-team/capacitor/issues/8320) ([a48ebb6](https://github.com/ionic-team/capacitor/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + ## [8.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) ### Bug Fixes diff --git a/core/package.json b/core/package.json index ed25a387b1..74b7fc185c 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.0.2", + "version": "8.1.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 44d394b804..8e99f8109f 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.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) + +### Reverts + +- revert version bump from [#8319](https://github.com/ionic-team/capacitor/issues/8319) and [#8320](https://github.com/ionic-team/capacitor/issues/8320) ([a48ebb6](https://github.com/ionic-team/capacitor/commit/a48ebb622ea4ebe92927bf1756a4d8ac6012884b)) + ## [8.0.2](https://github.com/ionic-team/capacitor/compare/8.0.1...8.0.2) (2026-01-27) **Note:** Version bump only for package @capacitor/ios diff --git a/ios/package.json b/ios/package.json index 87f1871398..a9daadec86 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.0.2", + "version": "8.1.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.0.0" + "@capacitor/core": "^8.1.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index 1d634660cf..b297e3ef13 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.0.2", + "version": "8.1.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 05b1c160a63f3e53c265e1436781a1aa0346631c Mon Sep 17 00:00:00 2001 From: Mark Anderson Date: Wed, 11 Feb 2026 15:37:26 -0500 Subject: [PATCH 16/42] chore: update workflow timeout --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56fce53892..b6b41098f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ concurrency: jobs: setup: runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 60 steps: - name: Get Latest uses: actions/setup-node@v6 From a55dc5ee4dfeab861cde1e11c9063aefea91006b Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Thu, 12 Feb 2026 18:37:44 +0100 Subject: [PATCH 17/42] fix(cli): use 8.0.0 as default Capacitor SPM dependency version (#8341) --- ios-spm-template/App/CapApp-SPM/Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios-spm-template/App/CapApp-SPM/Package.swift b/ios-spm-template/App/CapApp-SPM/Package.swift index e141a50648..5cde8b6645 100644 --- a/ios-spm-template/App/CapApp-SPM/Package.swift +++ b/ios-spm-template/App/CapApp-SPM/Package.swift @@ -11,7 +11,7 @@ let package = Package( targets: ["CapApp-SPM"]) ], dependencies: [ - .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", from: "7.0.0") + .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", from: "8.0.0") ], targets: [ .target( From a441280d7c6b310ca516d6fb2736c09525987774 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 13 Feb 2026 14:22:59 +0100 Subject: [PATCH 18/42] fix(cli): Allow to run update on non macOS (#8344) --- cli/src/ios/update.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cli/src/ios/update.ts b/cli/src/ios/update.ts index 1003098ca1..cd9c82a00d 100644 --- a/cli/src/ios/update.ts +++ b/cli/src/ios/update.ts @@ -136,10 +136,12 @@ async function updatePodfile(config: Config, plugins: Plugin[], deployment: bool await runCommand('bundle', ['exec', 'pod', 'install', ...(deployment ? ['--deployment'] : [])], { cwd: config.ios.nativeProjectDirAbs, }); - } else { + } else if (await isInstalled('pod')) { await runCommand(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { cwd: config.ios.nativeProjectDirAbs, }); + } else { + logger.warn('Skipping pod install because CocoaPods is not installed'); } const isXcodebuildAvailable = await isInstalled('xcodebuild'); From ee304e3c38a0e80d70f2143fffa192683f067e6d Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Mon, 16 Feb 2026 14:31:15 +0100 Subject: [PATCH 19/42] chore(ci): increase timeout (#8340) --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b6b41098f3..8664a402da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,7 +32,7 @@ jobs: key: ${{ runner.OS }}-dependencies-cache-${{ hashFiles('**/package.json') }} lint: runs-on: macos-15 - timeout-minutes: 30 + timeout-minutes: 60 steps: - uses: actions/setup-node@v6 with: @@ -48,7 +48,7 @@ jobs: - run: npm run lint test-cli: runs-on: macos-15 - timeout-minutes: 30 + timeout-minutes: 60 needs: - setup - lint @@ -69,7 +69,7 @@ jobs: working-directory: ./cli test-core: runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 60 needs: - setup - lint @@ -90,7 +90,7 @@ jobs: working-directory: ./core test-ios: runs-on: macos-15 - timeout-minutes: 30 + timeout-minutes: 60 needs: - setup - lint @@ -118,7 +118,7 @@ jobs: run: sh ./scripts/native-podspec.sh lint test-android: runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 60 needs: - setup - lint From fc9647f26f08ff64f53b32c79fb19f153e3b0a24 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 17 Feb 2026 18:47:05 +0100 Subject: [PATCH 20/42] fix(ios): remove tmpWindow usages on presentVC/dismissVC (#8338) Co-authored-by: Mark Anderson --- .../Capacitor/CAPBridgeProtocol.swift | 2 ++ ios/Capacitor/Capacitor/CapacitorBridge.swift | 19 ++++--------------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/ios/Capacitor/Capacitor/CAPBridgeProtocol.swift b/ios/Capacitor/Capacitor/CAPBridgeProtocol.swift index f86b914f8e..24ee52a75d 100644 --- a/ios/Capacitor/Capacitor/CAPBridgeProtocol.swift +++ b/ios/Capacitor/Capacitor/CAPBridgeProtocol.swift @@ -81,7 +81,9 @@ import WebKit // MARK: - View Presentation func showAlertWith(title: String, message: String, buttonTitle: String) + @available(*, deprecated, message: "Use self?.bridge?.viewController?.present") func presentVC(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)?) + @available(*, deprecated, message: "Use self?.bridge?.viewController?.dismiss") func dismissVC(animated flag: Bool, completion: (() -> Void)?) } diff --git a/ios/Capacitor/Capacitor/CapacitorBridge.swift b/ios/Capacitor/Capacitor/CapacitorBridge.swift index 8b0026ad98..7b8b9b99dc 100644 --- a/ios/Capacitor/Capacitor/CapacitorBridge.swift +++ b/ios/Capacitor/Capacitor/CapacitorBridge.swift @@ -93,8 +93,9 @@ 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_" @@ -747,22 +748,10 @@ open class CapacitorBridge: NSObject, CAPBridgeProtocol { } @objc open func presentVC(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) { - if viewControllerToPresent.modalPresentationStyle == .popover { - self.viewController?.present(viewControllerToPresent, animated: flag, completion: completion) - } else { - self.tmpWindow = UIWindow.init(frame: UIScreen.main.bounds) - self.tmpWindow?.rootViewController = TmpViewController.init() - self.tmpWindow?.makeKeyAndVisible() - self.tmpWindow?.rootViewController?.present(viewControllerToPresent, animated: flag, completion: completion) - } + self.viewController?.present(viewControllerToPresent, animated: flag, completion: completion) } @objc open func dismissVC(animated flag: Bool, completion: (() -> Void)? = nil) { - if self.tmpWindow == nil { - self.viewController?.dismiss(animated: flag, completion: completion) - } else { - self.tmpWindow?.rootViewController?.dismiss(animated: flag, completion: completion) - self.tmpWindow = nil - } + self.viewController?.dismiss(animated: flag, completion: completion) } } From 7d001ac4c58757fba922ea50f5bf5233ce217490 Mon Sep 17 00:00:00 2001 From: Max Nowack Date: Tue, 17 Feb 2026 18:49:21 +0100 Subject: [PATCH 21/42] fix(docs): fix typo in CapApp-SPM README (#8348) Co-authored-by: Mark Anderson Co-authored-by: Mark Anderson --- ios-spm-template/App/CapApp-SPM/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios-spm-template/App/CapApp-SPM/README.md b/ios-spm-template/App/CapApp-SPM/README.md index 5e22a2f8a0..03964db900 100644 --- a/ios-spm-template/App/CapApp-SPM/README.md +++ b/ios-spm-template/App/CapApp-SPM/README.md @@ -1,5 +1,5 @@ # CapApp-SPM -This SPM is used to host SPM dependencies for you Capacitor project +This package is used to host SPM dependencies for your Capacitor project Do not modify the contents of it or there may be unintended consequences. From bd29b9913a9279de26fc21c6cb0b93b8f5e5433a Mon Sep 17 00:00:00 2001 From: Thomas Heigl Date: Wed, 25 Feb 2026 10:22:26 +0100 Subject: [PATCH 22/42] fix(android): Add missing null checks in BridgeActivity (#8185) Co-authored-by: Pedro Bilro --- .../main/java/com/getcapacitor/BridgeActivity.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java b/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java index c3779a5488..bfd532c4d2 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java +++ b/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java @@ -66,7 +66,9 @@ public Bridge getBridge() { @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - bridge.saveInstanceState(outState); + if (bridge != null) { + bridge.saveInstanceState(outState); + } } @Override @@ -82,8 +84,10 @@ public void onStart() { @Override public void onRestart() { super.onRestart(); - this.bridge.onRestart(); - Logger.debug("App restarted"); + if (this.bridge != null) { + this.bridge.onRestart(); + Logger.debug("App restarted"); + } } @Override @@ -131,7 +135,9 @@ public void onDestroy() { @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); - this.bridge.onDetachedFromWindow(); + if (this.bridge != null) { + this.bridge.onDetachedFromWindow(); + } } /** From 5e82c89f1bff6d0e9ccea2554007aacb920d4c58 Mon Sep 17 00:00:00 2001 From: Laurent Date: Thu, 26 Feb 2026 07:50:32 -0600 Subject: [PATCH 23/42] fix(android): Concurrent Range Requests for assets (#8357) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Stein Jakob Nordbø Co-authored-by: Pedro Bilro --- .../com/getcapacitor/WebViewLocalServer.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index a044bfbe6d..d7f641f3d5 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -128,9 +128,22 @@ public String getReasonPhrase() { return reasonPhrase; } + /** + * @deprecated This method may return incorrect headers in concurrent range requests. + *

+ * Use {@link #buildDefaultResponseHeaders()} instead, which returns a copy of the map. + *

+ * This method will be removed in a future major version of Capacitor. + *

+ */ + @Deprecated(forRemoval = true) // adjust version as appropriate public Map getResponseHeaders() { return responseHeaders; } + + public Map buildDefaultResponseHeaders() { + return new HashMap<>(responseHeaders); + } } WebViewLocalServer(Context context, Bridge bridge, JSInjector jsInjector, ArrayList authorities, boolean html5mode) { @@ -329,7 +342,7 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH if (request.getRequestHeaders().get("Range") != null) { InputStream responseStream = new LollipopLazyInputStream(handler, request); String mimeType = getMimeType(path, responseStream); - Map tempResponseHeaders = handler.getResponseHeaders(); + Map tempResponseHeaders = handler.buildDefaultResponseHeaders(); int statusCode = 206; try { int totalRange = responseStream.available(); @@ -337,6 +350,13 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH String[] parts = rangeString.split("="); String[] streamParts = parts[1].split("-"); String fromRange = streamParts[0]; + int bytesToSkip; + try { + bytesToSkip = Integer.parseInt(fromRange); + if (bytesToSkip > 0) { + responseStream.skip(bytesToSkip); + } + } catch (NumberFormatException ignored) {} int range = totalRange - 1; if (streamParts.length > 1) { range = Integer.parseInt(streamParts[1]); @@ -365,7 +385,7 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH handler.getEncoding(), statusCode, handler.getReasonPhrase(), - handler.getResponseHeaders(), + handler.buildDefaultResponseHeaders(), responseStream ); } @@ -376,7 +396,7 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH handler.getEncoding(), handler.getStatusCode(), handler.getReasonPhrase(), - handler.getResponseHeaders(), + handler.buildDefaultResponseHeaders(), null ); } @@ -411,7 +431,7 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH handler.getEncoding(), statusCode, handler.getReasonPhrase(), - handler.getResponseHeaders(), + handler.buildDefaultResponseHeaders(), responseStream ); } @@ -442,7 +462,7 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH handler.getEncoding(), statusCode, handler.getReasonPhrase(), - handler.getResponseHeaders(), + handler.buildDefaultResponseHeaders(), responseStream ); } @@ -517,7 +537,7 @@ private WebResourceResponse handleProxyRequest(WebResourceRequest request, PathH handler.getEncoding(), handler.getStatusCode(), handler.getReasonPhrase(), - handler.getResponseHeaders(), + handler.buildDefaultResponseHeaders(), responseStream ); } From 782b9d9c26dcf1282b918996becb0224c0baca1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=91=D0=BA?= Date: Thu, 26 Feb 2026 19:25:05 +0300 Subject: [PATCH 24/42] fix(cli): Don't overwrite config.server section with `--live-reload` (#7528) Co-authored-by: Pedro Bilro Co-authored-by: jcesarmobile --- cli/src/util/livereload.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/cli/src/util/livereload.ts b/cli/src/util/livereload.ts index c3b15ee9fa..f53670716f 100644 --- a/cli/src/util/livereload.ts +++ b/cli/src/util/livereload.ts @@ -163,6 +163,7 @@ class CapLiveReload { this.configJsonToRevertTo.platformPath = capConfigPath; const url = `http://${options.host}:${options.port}`; configJson.server = { + ...configJson.server, url, }; writeJSONSync(capConfigPath, configJson, { spaces: '\t' }); From 5db81e68c67652e9d2b29d7ad30629b423d2ad30 Mon Sep 17 00:00:00 2001 From: Ellis Shang <40737228+Shellishack@users.noreply.github.com> Date: Mon, 2 Mar 2026 19:47:57 +0800 Subject: [PATCH 25/42] feat(cli): Add --https option for --live-reload (#8194) Co-authored-by: Pedro Bilro --- cli/src/index.ts | 3 +++ cli/src/tasks/run.ts | 7 +++++-- cli/src/util/livereload.ts | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index 7cbbe7679e..ed7558fc0e 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -253,6 +253,7 @@ export function runProgram(config: Config): void { .option('--host ', 'Host used for live reload') .option('--port ', 'Port used for live reload') .option('--configuration ', 'Configuration name of the iOS Scheme') + .option('--https', 'Use https:// instead of http:// for the live reload server') .action( wrapAction( telemetryAction( @@ -273,6 +274,7 @@ export function runProgram(config: Config): void { host, port, configuration, + https, }, ) => { const { runCommand } = await import('./tasks/run'); @@ -290,6 +292,7 @@ export function runProgram(config: Config): void { host, port, configuration, + https, }); }, ), diff --git a/cli/src/tasks/run.ts b/cli/src/tasks/run.ts index 97413cb098..2abdb9cd2c 100644 --- a/cli/src/tasks/run.ts +++ b/cli/src/tasks/run.ts @@ -34,6 +34,7 @@ export interface RunCommandOptions { host?: string; port?: string; configuration?: string; + https?: boolean; } export async function runCommand( @@ -42,7 +43,9 @@ export async function runCommand( options: RunCommandOptions, ): Promise { options.host = options.host ?? CapLiveReloadHelper.getIpAddress() ?? 'localhost'; - options.port = options.port ?? '3000'; + if (!options.https && !options.port) { + options.port = '3000'; + } if (selectedPlatformName && !(await isValidPlatform(selectedPlatformName))) { const platformDir = resolvePlatform(config, selectedPlatformName); if (platformDir) { @@ -108,7 +111,7 @@ export async function runCommand( }) .then(() => process.exit()); logger.info( - `App running with live reload listing for: http://${options.host}:${options.port}. Press Ctrl+C to quit.`, + `App running with live reload listing for: ${options.https ? 'https' : 'http'}://${options.host}${options.port ? `:${options.port}` : ''}. Press Ctrl+C to quit.`, ); await sleepForever(); } diff --git a/cli/src/util/livereload.ts b/cli/src/util/livereload.ts index f53670716f..34d008a6ce 100644 --- a/cli/src/util/livereload.ts +++ b/cli/src/util/livereload.ts @@ -161,7 +161,7 @@ class CapLiveReload { const configJson = readJSONSync(capConfigPath); this.configJsonToRevertTo.json = JSON.stringify(configJson, null, 2); this.configJsonToRevertTo.platformPath = capConfigPath; - const url = `http://${options.host}:${options.port}`; + const url = `${options.https ? 'https' : 'http'}://${options.host}${options.port ? `:${options.port}` : ''}`; configJson.server = { ...configJson.server, url, From 3109d22547253ed44293777c60652f14cf83e416 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Mon, 2 Mar 2026 11:26:04 -0600 Subject: [PATCH 26/42] fix(android): invalid http range seeking (#8369) Closes https://github.com/ionic-team/capacitor/issues/8367 Fixes regression introduced by https://github.com/ionic-team/capacitor/issues/8357 --- .../src/main/java/com/getcapacitor/WebViewLocalServer.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index d7f641f3d5..2dd345fb3d 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -350,13 +350,6 @@ private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathH String[] parts = rangeString.split("="); String[] streamParts = parts[1].split("-"); String fromRange = streamParts[0]; - int bytesToSkip; - try { - bytesToSkip = Integer.parseInt(fromRange); - if (bytesToSkip > 0) { - responseStream.skip(bytesToSkip); - } - } catch (NumberFormatException ignored) {} int range = totalRange - 1; if (streamParts.length > 1) { range = Integer.parseInt(streamParts[1]); From ae0e2ddccb2904ee4b3d47d4be1f7556ac7000a1 Mon Sep 17 00:00:00 2001 From: Brandon Wees Date: Tue, 3 Mar 2026 06:59:16 -0600 Subject: [PATCH 27/42] fix(android): handle lowercase range header (#8368) --- .../src/main/java/com/getcapacitor/WebViewLocalServer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java index 2dd345fb3d..a39483de91 100755 --- a/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java +++ b/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -339,14 +339,16 @@ private WebResourceResponse handleCapacitorHttpRequest(WebResourceRequest reques private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathHandler handler) { String path = request.getUrl().getPath(); - if (request.getRequestHeaders().get("Range") != null) { + Map requestHeaders = request.getRequestHeaders(); + String rangeString = requestHeaders.get("Range") != null ? requestHeaders.get("Range") : requestHeaders.get("range"); + + if (rangeString != null) { InputStream responseStream = new LollipopLazyInputStream(handler, request); String mimeType = getMimeType(path, responseStream); Map tempResponseHeaders = handler.buildDefaultResponseHeaders(); int statusCode = 206; try { int totalRange = responseStream.available(); - String rangeString = request.getRequestHeaders().get("Range"); String[] parts = rangeString.split("="); String[] streamParts = parts[1].split("-"); String fromRange = streamParts[0]; From 379101c92fec86b416e3068f03069e3fca5b70cb Mon Sep 17 00:00:00 2001 From: Pedro Bilro Date: Tue, 3 Mar 2026 16:06:51 +0000 Subject: [PATCH 28/42] docs(cli): Better descriptions for live-reload parameters (#8373) --- cli/src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/src/index.ts b/cli/src/index.ts index ed7558fc0e..fb70e1039b 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -249,11 +249,11 @@ export function runProgram(config: Config): void { ) .option('--no-sync', `do not run ${c.input('sync')}`) .option('--forwardPorts ', 'Automatically run "adb reverse" for better live-reloading support') - .option('-l, --live-reload', 'Enable Live Reload') - .option('--host ', 'Host used for live reload') - .option('--port ', 'Port used for live reload') + .option('-l, --live-reload', 'Set live-reload URL via CLI (uses defaults, overrides server.url config)') + .option('--host ', 'Configure host for live-reload URL (used with --live-reload)') + .option('--port ', 'Configure port for live-reload URL (used with --live-reload)') .option('--configuration ', 'Configuration name of the iOS Scheme') - .option('--https', 'Use https:// instead of http:// for the live reload server') + .option('--https', 'Use https:// instead of http:// for live-reload URL (used with --live-reload)') .action( wrapAction( telemetryAction( From 09770f7d2dc8d566bb377f9968355090f20918b6 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of OS-pedrogustavobilro)" Date: Fri, 6 Mar 2026 09:25:52 +0000 Subject: [PATCH 29/42] Release 8.2.0 --- CHANGELOG.md | 18 ++++++++++++++++++ android/CHANGELOG.md | 9 +++++++++ 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 e6762d0fe7..5c1caf9b95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) + +### Bug Fixes + +- **android:** Add missing null checks in BridgeActivity ([#8185](https://github.com/ionic-team/capacitor/issues/8185)) ([bd29b99](https://github.com/ionic-team/capacitor/commit/bd29b9913a9279de26fc21c6cb0b93b8f5e5433a)) +- **android:** Concurrent Range Requests for assets ([#8357](https://github.com/ionic-team/capacitor/issues/8357)) ([5e82c89](https://github.com/ionic-team/capacitor/commit/5e82c89f1bff6d0e9ccea2554007aacb920d4c58)) +- **android:** handle lowercase range header ([#8368](https://github.com/ionic-team/capacitor/issues/8368)) ([ae0e2dd](https://github.com/ionic-team/capacitor/commit/ae0e2ddccb2904ee4b3d47d4be1f7556ac7000a1)) +- **android:** invalid http range seeking ([#8369](https://github.com/ionic-team/capacitor/issues/8369)) ([3109d22](https://github.com/ionic-team/capacitor/commit/3109d22547253ed44293777c60652f14cf83e416)) +- **cli:** Allow to run update on non macOS ([#8344](https://github.com/ionic-team/capacitor/issues/8344)) ([a441280](https://github.com/ionic-team/capacitor/commit/a441280d7c6b310ca516d6fb2736c09525987774)) +- **cli:** Don't overwrite config.server section with `--live-reload` ([#7528](https://github.com/ionic-team/capacitor/issues/7528)) ([782b9d9](https://github.com/ionic-team/capacitor/commit/782b9d9c26dcf1282b918996becb0224c0baca1d)) +- **cli:** use 8.0.0 as default Capacitor SPM dependency version ([#8341](https://github.com/ionic-team/capacitor/issues/8341)) ([a55dc5e](https://github.com/ionic-team/capacitor/commit/a55dc5ee4dfeab861cde1e11c9063aefea91006b)) +- **docs:** fix typo in CapApp-SPM README ([#8348](https://github.com/ionic-team/capacitor/issues/8348)) ([7d001ac](https://github.com/ionic-team/capacitor/commit/7d001ac4c58757fba922ea50f5bf5233ce217490)) +- **ios:** remove tmpWindow usages on presentVC/dismissVC ([#8338](https://github.com/ionic-team/capacitor/issues/8338)) ([fc9647f](https://github.com/ionic-team/capacitor/commit/fc9647f26f08ff64f53b32c79fb19f153e3b0a24)) + +### Features + +- **cli:** Add --https option for --live-reload ([#8194](https://github.com/ionic-team/capacitor/issues/8194)) ([5db81e6](https://github.com/ionic-team/capacitor/commit/5db81e68c67652e9d2b29d7ad30629b423d2ad30)) + # [8.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index e3baa5dfd2..4f598252ac 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) + +### Bug Fixes + +- **android:** Add missing null checks in BridgeActivity ([#8185](https://github.com/ionic-team/capacitor/issues/8185)) ([bd29b99](https://github.com/ionic-team/capacitor/commit/bd29b9913a9279de26fc21c6cb0b93b8f5e5433a)) +- **android:** Concurrent Range Requests for assets ([#8357](https://github.com/ionic-team/capacitor/issues/8357)) ([5e82c89](https://github.com/ionic-team/capacitor/commit/5e82c89f1bff6d0e9ccea2554007aacb920d4c58)) +- **android:** handle lowercase range header ([#8368](https://github.com/ionic-team/capacitor/issues/8368)) ([ae0e2dd](https://github.com/ionic-team/capacitor/commit/ae0e2ddccb2904ee4b3d47d4be1f7556ac7000a1)) +- **android:** invalid http range seeking ([#8369](https://github.com/ionic-team/capacitor/issues/8369)) ([3109d22](https://github.com/ionic-team/capacitor/commit/3109d22547253ed44293777c60652f14cf83e416)) + # [8.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) ### Reverts diff --git a/android/package.json b/android/package.json index 6be24c6899..9555484901 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.1.0", + "version": "8.2.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.1.0" + "@capacitor/core": "^8.2.0" }, "publishConfig": { "access": "public" diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index c809b17a45..d7d656945e 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.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) + +### Bug Fixes + +- **cli:** Allow to run update on non macOS ([#8344](https://github.com/ionic-team/capacitor/issues/8344)) ([a441280](https://github.com/ionic-team/capacitor/commit/a441280d7c6b310ca516d6fb2736c09525987774)) +- **cli:** Don't overwrite config.server section with `--live-reload` ([#7528](https://github.com/ionic-team/capacitor/issues/7528)) ([782b9d9](https://github.com/ionic-team/capacitor/commit/782b9d9c26dcf1282b918996becb0224c0baca1d)) + +### Features + +- **cli:** Add --https option for --live-reload ([#8194](https://github.com/ionic-team/capacitor/issues/8194)) ([5db81e6](https://github.com/ionic-team/capacitor/commit/5db81e68c67652e9d2b29d7ad30629b423d2ad30)) + # [8.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) ### Features diff --git a/cli/package.json b/cli/package.json index adccb1dd2a..d488db7dbc 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.1.0", + "version": "8.2.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 efe9480527..73039f4cf2 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.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) + +**Note:** Version bump only for package @capacitor/core + # [8.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) ### Bug Fixes diff --git a/core/package.json b/core/package.json index 74b7fc185c..98e5b1b7e0 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.1.0", + "version": "8.2.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 8e99f8109f..c5b3b26045 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.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) + +### Bug Fixes + +- **ios:** remove tmpWindow usages on presentVC/dismissVC ([#8338](https://github.com/ionic-team/capacitor/issues/8338)) ([fc9647f](https://github.com/ionic-team/capacitor/commit/fc9647f26f08ff64f53b32c79fb19f153e3b0a24)) + # [8.1.0](https://github.com/ionic-team/capacitor/compare/8.0.2...8.1.0) (2026-02-11) ### Reverts diff --git a/ios/package.json b/ios/package.json index a9daadec86..86e5c661d6 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.1.0", + "version": "8.2.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.1.0" + "@capacitor/core": "^8.2.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index b297e3ef13..1b708a45da 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.1.0", + "version": "8.2.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From 8dddd0bb47e77f16a9378ea17b43a8b74e245c67 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 13 Mar 2026 09:54:59 +0100 Subject: [PATCH 30/42] chore(ci): close issues after 7 days (#8385) --- .github/workflows/needs-reply.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/needs-reply.yml b/.github/workflows/needs-reply.yml index 40d823c739..c4fd4a7444 100644 --- a/.github/workflows/needs-reply.yml +++ b/.github/workflows/needs-reply.yml @@ -13,7 +13,7 @@ jobs: with: repo-token: ${{ secrets.BOT_TOKEN }} issue-label: 'needs reply' - days-before-close: 15 + days-before-close: 7 close-message: | It looks like this issue didn't get the information it needed, so I'll close it for now. If I made a mistake, sorry! I am just a bot. From 003099aef246adfd76d890074d46b1484951824b Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Mon, 16 Mar 2026 17:46:06 +0100 Subject: [PATCH 31/42] fix(http): handle URL objects on fetch (#8386) --- android/capacitor/src/main/assets/native-bridge.js | 4 ++++ core/native-bridge.ts | 3 +++ ios/Capacitor/Capacitor/assets/native-bridge.js | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/android/capacitor/src/main/assets/native-bridge.js b/android/capacitor/src/main/assets/native-bridge.js index 40daf2a484..f5e7cc4403 100644 --- a/android/capacitor/src/main/assets/native-bridge.js +++ b/android/capacitor/src/main/assets/native-bridge.js @@ -505,6 +505,10 @@ var nativeBridge = (function (exports) { if (typeof resource === 'string') { return await win.CapacitorWebFetch(createProxyUrl(resource, win), options); } + else if (resource instanceof URL) { + const modifiedURL = new URL(createProxyUrl(resource.toString(), win)); + return await win.CapacitorWebFetch(modifiedURL, options); + } else if (resource instanceof Request) { const modifiedRequest = new Request(createProxyUrl(resource.url, win), resource); return await win.CapacitorWebFetch(modifiedRequest, options); diff --git a/core/native-bridge.ts b/core/native-bridge.ts index f988399be8..4fc028f379 100644 --- a/core/native-bridge.ts +++ b/core/native-bridge.ts @@ -532,6 +532,9 @@ const initBridge = (w: any): void => { if (typeof resource === 'string') { return await win.CapacitorWebFetch(createProxyUrl(resource, win), options); + } else if (resource instanceof URL) { + const modifiedURL = new URL(createProxyUrl(resource.toString(), win)); + return await win.CapacitorWebFetch(modifiedURL, options); } else if (resource instanceof Request) { const modifiedRequest = new Request(createProxyUrl(resource.url, win), resource); return await win.CapacitorWebFetch(modifiedRequest, options); diff --git a/ios/Capacitor/Capacitor/assets/native-bridge.js b/ios/Capacitor/Capacitor/assets/native-bridge.js index 40daf2a484..f5e7cc4403 100644 --- a/ios/Capacitor/Capacitor/assets/native-bridge.js +++ b/ios/Capacitor/Capacitor/assets/native-bridge.js @@ -505,6 +505,10 @@ var nativeBridge = (function (exports) { if (typeof resource === 'string') { return await win.CapacitorWebFetch(createProxyUrl(resource, win), options); } + else if (resource instanceof URL) { + const modifiedURL = new URL(createProxyUrl(resource.toString(), win)); + return await win.CapacitorWebFetch(modifiedURL, options); + } else if (resource instanceof Request) { const modifiedRequest = new Request(createProxyUrl(resource.url, win), resource); return await win.CapacitorWebFetch(modifiedRequest, options); From 4e99598a2a57ee97e82be1aaa09492744622fa60 Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Mon, 16 Mar 2026 16:38:42 -0500 Subject: [PATCH 32/42] fix(SystemBars): use native safe area insets on Android (#8384) --- .../com/getcapacitor/plugin/SystemBars.java | 96 +++++++++++++------ cli/src/declarations.ts | 2 +- core/system-bars.md | 2 +- 3 files changed, 67 insertions(+), 33 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 3f04adf976..c84923ca8b 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -7,7 +7,6 @@ import android.os.Build; import android.util.TypedValue; import android.view.View; -import android.view.ViewGroup; import android.view.Window; import android.webkit.JavascriptInterface; import android.webkit.WebView; @@ -36,6 +35,11 @@ public class SystemBars extends Plugin { static final String INSETS_HANDLING_CSS = "css"; static final String INSETS_HANDLING_DISABLE = "disable"; + // https://issues.chromium.org/issues/40699457 + private static final int WEBVIEW_VERSION_WITH_SAFE_AREA_FIX = 140; + // https://issues.chromium.org/issues/457682720 + 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]"); @@ -94,7 +98,7 @@ private void initSystemBars() { } initWindowInsetsListener(); - initSafeAreaInsets(); + initSafeAreaCSSVariables(); getBridge().executeOnMainThread(() -> { setStyle(style, ""); @@ -157,7 +161,7 @@ private Insets calcSafeAreaInsets(WindowInsetsCompat insets) { return Insets.of(safeArea.left, safeArea.top, safeArea.right, safeArea.bottom); } - private void initSafeAreaInsets() { + private void initSafeAreaCSSVariables() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { View v = (View) this.getBridge().getWebView().getParent(); WindowInsetsCompat insets = ViewCompat.getRootWindowInsets(v); @@ -169,41 +173,57 @@ private void initSafeAreaInsets() { } private void initWindowInsetsListener() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && insetHandlingEnabled) { - ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { - boolean hasBrokenWebViewVersion = getWebViewMajorVersion() <= 139; + ViewCompat.setOnApplyWindowInsetsListener((View) getBridge().getWebView().getParent(), (v, insets) -> { + boolean shouldPassthroughInsets = getWebViewMajorVersion() >= WEBVIEW_VERSION_WITH_SAFE_AREA_FIX && hasViewportCover; + + Insets systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout()); + Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); + boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); - if (hasViewportCover) { + if (shouldPassthroughInsets) { + // 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); } - if (hasBrokenWebViewVersion) { - if (hasViewportCover && v.hasWindowFocus() && v.isShown()) { - boolean keyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime()); - if (keyboardVisible) { - Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); - setViewMargins(v, Insets.of(0, 0, 0, imeInsets.bottom)); - } else { - setViewMargins(v, Insets.NONE); - } - - return WindowInsetsCompat.CONSUMED; - } - } + return new WindowInsetsCompat.Builder(insets) + .setInsets( + WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.displayCutout(), + Insets.of( + systemBarsInsets.left, + systemBarsInsets.top, + systemBarsInsets.right, + getBottomInset(systemBarsInsets, keyboardVisible) + ) + ) + .build(); + } - return insets; - }); - } - } + // We need to correct for a possible shown IME + v.setPadding( + systemBarsInsets.left, + systemBarsInsets.top, + systemBarsInsets.right, + keyboardVisible ? imeInsets.bottom : systemBarsInsets.bottom + ); + + // Returning `WindowInsetsCompat.CONSUMED` breaks recalculation of safe area insets + // So we have to explicitly set insets to `0` + // See: https://issues.chromium.org/issues/461332423 + WindowInsetsCompat newInsets = new WindowInsetsCompat.Builder(insets) + .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); + } - private void setViewMargins(View v, Insets insets) { - ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); - mlp.leftMargin = insets.left; - mlp.bottomMargin = insets.bottom; - mlp.rightMargin = insets.right; - mlp.topMargin = insets.top; - v.setLayoutParams(mlp); + return newInsets; + }); } private void injectSafeAreaCSS(int top, int right, int bottom, int left) { @@ -305,4 +325,18 @@ private Integer getWebViewMajorVersion() { return 0; } + + private int getBottomInset(Insets systemBarsInsets, boolean keyboardVisible) { + if (getWebViewMajorVersion() < WEBVIEW_VERSION_WITH_SAFE_AREA_KEYBOARD_FIX) { + // This is a workaround for webview versions that have a bug + // that causes the bottom inset to be incorrect if the IME is visible + // See: https://issues.chromium.org/issues/457682720 + + if (keyboardVisible) { + return 0; + } + } + + return systemBarsInsets.bottom; + } } diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 6612eec777..5eacf5e654 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -713,7 +713,7 @@ export interface PluginsConfig { * * `css` = Injects CSS variables (`--safe-area-inset-*`) containing correct safe area inset values into the webview. * - * `disable` = Disable all inset handling. + * `disable` = Disable CSS variables injection. * * @default "css" */ diff --git a/core/system-bars.md b/core/system-bars.md index c7654063bc..67275077af 100644 --- a/core/system-bars.md +++ b/core/system-bars.md @@ -73,7 +73,7 @@ const setStatusBarAnimation = async () => { ## Configuration | Prop | Type | Description | Default | | ------------- | -------------------- | ------------------------------------------------------------------------- | ------------------ | -| **`insetsHandling`** | string | Specifies how to handle problematic insets on Android. This option is only supported on Android.
`css` = Injects CSS variables (`--safe-area-inset-*`) containing correct safe area inset values into the webview.
`disable` = Disable all inset handling. | css | +| **`insetsHandling`** | string | Specifies how to handle problematic insets on Android. This option is only supported on Android.
`css` = Injects CSS variables (`--safe-area-inset-*`) containing correct safe area inset values into the webview.
`disable` = Disable CSS variables injection. | css | | **`style`** | string | The style of the text and icons of the system bars. | DEFAULT | | **`hidden`** | boolean | Hide the system bars on start. | false | | **`animation`** | string | The type of status bar animation used when showing or hiding. This option is only supported on iOS. | FADE | From 14e4af2d7c8a2ca4ff8495f899126cc645b43d77 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 17 Mar 2026 12:30:17 +0100 Subject: [PATCH 33/42] chore: change needs reproduction bot message (#8390) --- .github/ionic-issue-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ionic-issue-bot.yml b/.github/ionic-issue-bot.yml index fef86a40f0..7adf8c4573 100644 --- a/.github/ionic-issue-bot.yml +++ b/.github/ionic-issue-bot.yml @@ -20,7 +20,7 @@ comment: message: > This issue needs more information before it can be addressed. In particular, the reporter needs to provide a minimal sample app that demonstrates the issue. - If no sample app is provided within 15 days, the issue will be closed. + If no sample app is provided within 7 days, the issue will be closed. Please see the Contributing Guide for [how to create a Sample App](https://github.com/ionic-team/capacitor/blob/HEAD/CONTRIBUTING.md#creating-a-code-reproduction). From afb80f2fecb4bf85dbebe25e815de2a5564264d6 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Wed, 18 Mar 2026 18:53:47 +0100 Subject: [PATCH 34/42] fix(ios): make getArray accesible on Objective-C plugins (#8392) --- ios/Capacitor/Capacitor/CAPBridgedJSTypes.h | 1 + ios/Capacitor/Capacitor/CAPBridgedJSTypes.m | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/ios/Capacitor/Capacitor/CAPBridgedJSTypes.h b/ios/Capacitor/Capacitor/CAPBridgedJSTypes.h index 516c8648b8..67f8a9501d 100644 --- a/ios/Capacitor/Capacitor/CAPBridgedJSTypes.h +++ b/ios/Capacitor/Capacitor/CAPBridgedJSTypes.h @@ -10,6 +10,7 @@ - (NSString * _Nullable)getString:(NSString * _Nonnull)key defaultValue:(NSString * _Nullable)defaultValue; - (NSDate * _Nullable)getDate:(NSString * _Nonnull)key defaultValue:(NSDate * _Nullable)defaultValue; - (NSDictionary * _Nullable)getObject:(NSString * _Nonnull)key defaultValue:(NSDictionary * _Nullable)defaultValue; +- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; - (NSNumber * _Nullable)getNumber:(NSString * _Nonnull)key defaultValue:(NSNumber * _Nullable)defaultValue; - (BOOL)getBool:(NSString * _Nonnull)key defaultValue:(BOOL)defaultValue; @end diff --git a/ios/Capacitor/Capacitor/CAPBridgedJSTypes.m b/ios/Capacitor/Capacitor/CAPBridgedJSTypes.m index fb6da4586f..c8ec07da7f 100644 --- a/ios/Capacitor/Capacitor/CAPBridgedJSTypes.m +++ b/ios/Capacitor/Capacitor/CAPBridgedJSTypes.m @@ -29,6 +29,14 @@ - (NSDictionary * _Nullable)getObject:(NSString * _Nonnull)key defaultValue:(NSD return defaultValue; } +- (NSArray * _Nullable)getArray:(NSString * _Nonnull)key defaultValue:(NSArray * _Nullable)defaultValue; { + id value = [[self dictionaryRepresentation] objectForKey:key]; + if (value != nil && [value isKindOfClass:[NSArray class]]) { + return value; + } + return defaultValue; +} + - (NSNumber * _Nullable)getNumber:(NSString * _Nonnull)key defaultValue:(NSNumber * _Nullable)defaultValue { id value = [[self dictionaryRepresentation] objectForKey:key]; if (value != nil && [value isKindOfClass:[NSNumber class]]) { From a9f218179b60555d86b44bf2b33354da3e64e98c Mon Sep 17 00:00:00 2001 From: Joey Pender Date: Thu, 19 Mar 2026 10:09:56 -0500 Subject: [PATCH 35/42] fix(android): correctly parsing `server.url` when they include paths (#8391) Co-authored-by: Pedro Bilro --- android/capacitor/src/main/java/com/getcapacitor/Bridge.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java index 2a72a4304a..de1bad88ba 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/Bridge.java +++ b/android/capacitor/src/main/java/com/getcapacitor/Bridge.java @@ -628,11 +628,11 @@ private void initWebView() { try { URL appUrlObject = new URL(appUrlConfig); authorities.add(appUrlObject.getAuthority()); + localUrl = appUrlObject.getProtocol() + "://" + appUrlObject.getAuthority(); } catch (Exception ex) { Logger.error("Provided server url is invalid: " + ex.getMessage()); return; } - localUrl = appUrlConfig; appUrl = appUrlConfig; } else { appUrl = localUrl; From d2ee84f8186909b142b418c02fc19f79d3c6a6ed Mon Sep 17 00:00:00 2001 From: Pedro Bilro Date: Mon, 23 Mar 2026 09:56:33 +0000 Subject: [PATCH 36/42] feat(cli): Experimental config for swift-tools-version in SPM apps (#8372) --- cli/src/declarations.ts | 36 ++++++++++++++++++++++++++++++++++++ cli/src/ios/common.ts | 6 ++++++ cli/src/util/spm.ts | 20 +++++++++++++++++++- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 5eacf5e654..9afc560897 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -509,6 +509,42 @@ export interface CapacitorConfig { }; }; + experimental?: { + /** + * Experimental iOS-specific configuration. + * + * These options may change or be removed in future versions. + * + * @since 8.2.0 + */ + ios?: { + /** + * Swift Package Manager (SPM) specific configuration. + * + * @since 8.2.0 + */ + spm?: { + /** + * Swift tools version to use in Package.swift header. + * + * Defines the minimum version of the Swift compiler version required to build your app. + * For more information check the [swift documentation](https://docs.swift.org/swiftpm/documentation/packagemanagerdocs/settingswifttoolsversion/) + * + * Warning: Capacitor does not officially support Swift 6 yet. + * Setting this property to 6.0 or higher may cause issues. + * If you need to set this property to 6.0 or higher, make sure to throughrouly test your iOS app. + * + * This setting may graduate to `ios.spm.swiftToolsVersion` in a future major release. + * + * @since 8.2.0 + * @default '5.9' + * @example '6.1' + */ + swiftToolsVersion?: string; + }; + }; + }; + server?: { /** * Configure the local hostname of the device. diff --git a/cli/src/ios/common.ts b/cli/src/ios/common.ts index 312c13dad2..7ac2831e03 100644 --- a/cli/src/ios/common.ts +++ b/cli/src/ios/common.ts @@ -11,6 +11,7 @@ import type { Config } from '../definitions'; import { logger } from '../log'; import { PluginType, getPluginPlatform } from '../plugin'; import type { Plugin } from '../plugin'; +import { checkSwiftToolsVersion } from '../util/spm'; import { isInstalled, runCommand } from '../util/subprocess'; export async function checkIOSPackage(config: Config): Promise { @@ -32,6 +33,11 @@ export async function getCommonChecks(config: Config): Promise checks.push(() => checkBundler(config)); } else if ((await config.ios.packageManager) === 'Cocoapods') { checks.push(() => checkCocoaPods(config)); + } else if ((await config.ios.packageManager) === 'SPM') { + const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion; + if (swiftToolsVersion) { + checks.push(() => checkSwiftToolsVersion(config, swiftToolsVersion)); + } } return checks; } diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 30e51cf1a4..5deb4b3b87 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -98,8 +98,9 @@ export async function removeCocoapodsFiles(config: Config): Promise { export async function generatePackageText(config: Config, plugins: Plugin[]): Promise { const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); const iosVersion = getMajoriOSVersion(config); + const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9'; - let packageSwiftText = `// swift-tools-version: 5.9 + let packageSwiftText = `// swift-tools-version: ${swiftToolsVersion} import PackageDescription // DO NOT MODIFY THIS FILE - managed by Capacitor CLI commands @@ -188,6 +189,23 @@ export async function addInfoPlistDebugIfNeeded(config: Config): Promise { } } +export async function checkSwiftToolsVersion(config: Config, version: string | undefined): Promise { + if (!version) { + return null; + } + + const swiftToolsVersionRegex = /^[0-9]+\.[0-9]+(\.[0-9]+)?$/; + + if (!swiftToolsVersionRegex.test(version)) { + return ( + `Invalid Swift tools version: "${version}".\n` + + `The Swift tools version must be in major.minor or major.minor.patch format (e.g., "5.9", "6.0", "5.9.2").` + ); + } + + return null; +} + // Private Functions async function pluginsWithPackageSwift(plugins: Plugin[]): Promise { From 69476ab9c0b47911a14d2482cab53a877a5ae784 Mon Sep 17 00:00:00 2001 From: Terence Honles Date: Tue, 24 Mar 2026 12:42:19 +0100 Subject: [PATCH 37/42] fix(cli): inline CSS sourcemaps in addition to JS sourcemaps (#8377) Co-authored-by: jcesarmobile --- cli/src/tasks/sourcemaps.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/tasks/sourcemaps.ts b/cli/src/tasks/sourcemaps.ts index b460972f02..070cd5b3cb 100644 --- a/cli/src/tasks/sourcemaps.ts +++ b/cli/src/tasks/sourcemaps.ts @@ -12,7 +12,7 @@ function walkDirectory(dirPath: string) { walkDirectory(targetFile); } else { const mapFile = join(dirPath, `${file}.map`); - if (extname(file) === '.js' && existsSync(mapFile)) { + if ((extname(file) === '.js' || extname(file) === '.css') && existsSync(mapFile)) { const bufMap = readFileSync(mapFile).toString('base64'); const bufFile = readFileSync(targetFile, 'utf8'); const result = bufFile.replace( From f03cfbe7ad3fcf52a846ee0f71297123d21aa736 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 24 Mar 2026 13:46:47 +0100 Subject: [PATCH 38/42] chore: direct Feature Requests to canny (#8395) --- .github/ISSUE_TEMPLATE/config.yml | 3 ++ .github/ISSUE_TEMPLATE/feature-request.yml | 50 ---------------------- 2 files changed, 3 insertions(+), 50 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index b041f6e067..a2be826965 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ blank_issues_enabled: false contact_links: + - name: Feature Request + url: https://outsystems.canny.io/capacitor-feature-requests + about: Request a new feature - name: ⚙️ Request a new plugin url: https://github.com/capacitor-community/proposals about: Propose a new plugin or platform to the Capacitor community diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml deleted file mode 100644 index fc6d66e90a..0000000000 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Feature Request -description: Request a new feature -title: "[Feature]: " -labels: ["triage"] -body: - - type: markdown - attributes: - value: | - ## Thanks for your input on enhancements to Capacitor! - - type: input - id: Description - attributes: - label: Description - description: "A short description of your requested feature" - validations: - required: true - - type: checkboxes - id: platforms - attributes: - label: Platforms - description: "Check the platforms that will need this feature" - options: - - label: iOS - required: false - - label: Android - required: false - - label: Web - required: false - - type: textarea - id: requested-feature - attributes: - label: Request or proposed solution - description: "Describe the feature you are looking for in detail and any Preferred Solution you have" - placeholder: "This new thing would be great!" - validations: - required: true - - type: textarea - id: alternatives - attributes: - label: Alternatives - description: "Describe some alternatives, if any" - placeholder: "Some other ideas!" - validations: - required: false - - type: textarea - id: additional-info - attributes: - label: Additional Information - description: "Anything else we need to know to help? Include it here." - placeholder: "Tell us anything!" From 27e6aa89cf22e0b1a6d46710faed9aa8899600b0 Mon Sep 17 00:00:00 2001 From: Robin Genz Date: Tue, 24 Mar 2026 19:26:17 +0100 Subject: [PATCH 39/42] feat(cli): support SPM package traits in generated Package.swift (#8351) Co-authored-by: OS-pedrogustavobilro --- cli/src/declarations.ts | 20 ++++++++++++++++++- cli/src/ios/common.ts | 3 ++- cli/src/util/spm.ts | 43 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 3 deletions(-) diff --git a/cli/src/declarations.ts b/cli/src/declarations.ts index 9afc560897..6c8645406d 100644 --- a/cli/src/declarations.ts +++ b/cli/src/declarations.ts @@ -536,11 +536,29 @@ export interface CapacitorConfig { * * This setting may graduate to `ios.spm.swiftToolsVersion` in a future major release. * - * @since 8.2.0 + * @since 8.3.0 * @default '5.9' * @example '6.1' */ swiftToolsVersion?: string; + + /** + * Define package traits for SPM plugin dependencies. + * + * This requires explicitly setting experimental.ios.spm.swiftToolsVersion + * to '6.1' or higher. + * + * The key is the plugin ID (e.g. `@capacitor-firebase/analytics`) + * and the value is an array of trait names. + * + * Packages can have default traits. If you use this property, and + * want to preserve the defaults, include ".defaults" in the array. + * + * This setting may graduate to `ios.spm.packageTraits` in a future major release. + * + * @since 8.3.0 + */ + packageTraits?: { [pluginId: string]: string[] }; }; }; }; diff --git a/cli/src/ios/common.ts b/cli/src/ios/common.ts index 7ac2831e03..779dafd90f 100644 --- a/cli/src/ios/common.ts +++ b/cli/src/ios/common.ts @@ -11,7 +11,7 @@ import type { Config } from '../definitions'; import { logger } from '../log'; import { PluginType, getPluginPlatform } from '../plugin'; import type { Plugin } from '../plugin'; -import { checkSwiftToolsVersion } from '../util/spm'; +import { checkPackageTraitsRequirements, checkSwiftToolsVersion } from '../util/spm'; import { isInstalled, runCommand } from '../util/subprocess'; export async function checkIOSPackage(config: Config): Promise { @@ -38,6 +38,7 @@ export async function getCommonChecks(config: Config): Promise if (swiftToolsVersion) { checks.push(() => checkSwiftToolsVersion(config, swiftToolsVersion)); } + checks.push(() => checkPackageTraitsRequirements(config)); } return checks; } diff --git a/cli/src/util/spm.ts b/cli/src/util/spm.ts index 5deb4b3b87..3e2e515293 100644 --- a/cli/src/util/spm.ts +++ b/cli/src/util/spm.ts @@ -98,6 +98,7 @@ export async function removeCocoapodsFiles(config: Config): Promise { export async function generatePackageText(config: Config, plugins: Plugin[]): Promise { const iosPlatformVersion = await getCapacitorPackageVersion(config, config.ios.name); const iosVersion = getMajoriOSVersion(config); + const packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits ?? {}; const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion ?? '5.9'; let packageSwiftText = `// swift-tools-version: ${swiftToolsVersion} @@ -120,7 +121,16 @@ 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); - packageSwiftText += `,\n .package(name: "${plugin.ios?.name}", path: "${relPath}")`; + const traits = packageTraits[plugin.id]; + const traitsSuffix = traits?.length + ? `, traits: [${traits + .map((t) => { + // Any trait is written with quotes, with the exception of .defaults + return /^\.?defaults?$/i.test(t) ? '.defaults' : `"${t}"`; + }) + .join(', ')}]` + : ''; + packageSwiftText += `,\n .package(name: "${plugin.ios?.name}", path: "${relPath}"${traitsSuffix})`; } } @@ -206,6 +216,37 @@ export async function checkSwiftToolsVersion(config: Config, version: string | u return null; } +export async function checkPackageTraitsRequirements(config: Config): Promise { + const packageTraits = config.app.extConfig.experimental?.ios?.spm?.packageTraits; + const swiftToolsVersion = config.app.extConfig.experimental?.ios?.spm?.swiftToolsVersion; + + const hasPackageTraits = packageTraits && Object.keys(packageTraits).some((key) => packageTraits[key]?.length > 0); + + if (!hasPackageTraits) { + return null; + } + + if (!swiftToolsVersion) { + return ( + `Package traits require an explicit Swift tools version of 6.1 or higher.\n` + + `Set experimental.ios.spm.swiftToolsVersion to '6.1' or higher in your Capacitor configuration.` + ); + } + + const versionParts = swiftToolsVersion.split('.').map((part) => parseInt(part, 10)); + const major = versionParts[0] || 0; + const minor = versionParts[1] || 0; + + if (major < 6 || (major === 6 && minor < 1)) { + return ( + `Package traits require Swift tools version 6.1 or higher, but "${swiftToolsVersion}" was specified.\n` + + `Update experimental.ios.spm.swiftToolsVersion to '6.1' or higher in your Capacitor configuration.` + ); + } + + return null; +} + // Private Functions async function pluginsWithPackageSwift(plugins: Plugin[]): Promise { From 39f084a5ccd38e77dfaad70bc76bef30c56d1189 Mon Sep 17 00:00:00 2001 From: "Github Workflow (on behalf of jcesarmobile)" Date: Wed, 25 Mar 2026 17:03:42 +0000 Subject: [PATCH 40/42] Release 8.3.0 --- CHANGELOG.md | 15 +++++++++++++++ android/CHANGELOG.md | 8 ++++++++ android/package.json | 4 ++-- cli/CHANGELOG.md | 12 ++++++++++++ cli/package.json | 2 +- core/CHANGELOG.md | 7 +++++++ core/package.json | 2 +- ios/CHANGELOG.md | 7 +++++++ ios/package.json | 4 ++-- lerna.json | 2 +- 10 files changed, 56 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c1caf9b95..6c66245e24 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.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) + +### Bug Fixes + +- **android:** correctly parsing `server.url` when they include paths ([#8391](https://github.com/ionic-team/capacitor/issues/8391)) ([a9f2181](https://github.com/ionic-team/capacitor/commit/a9f218179b60555d86b44bf2b33354da3e64e98c)) +- **cli:** inline CSS sourcemaps in addition to JS sourcemaps ([#8377](https://github.com/ionic-team/capacitor/issues/8377)) ([69476ab](https://github.com/ionic-team/capacitor/commit/69476ab9c0b47911a14d2482cab53a877a5ae784)) +- **http:** handle URL objects on fetch ([#8386](https://github.com/ionic-team/capacitor/issues/8386)) ([003099a](https://github.com/ionic-team/capacitor/commit/003099aef246adfd76d890074d46b1484951824b)) +- **ios:** make getArray accesible on Objective-C plugins ([#8392](https://github.com/ionic-team/capacitor/issues/8392)) ([afb80f2](https://github.com/ionic-team/capacitor/commit/afb80f2fecb4bf85dbebe25e815de2a5564264d6)) +- **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/ionic-team/capacitor/issues/8384)) ([4e99598](https://github.com/ionic-team/capacitor/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) + +### Features + +- **cli:** Experimental config for swift-tools-version in SPM apps ([#8372](https://github.com/ionic-team/capacitor/issues/8372)) ([d2ee84f](https://github.com/ionic-team/capacitor/commit/d2ee84f8186909b142b418c02fc19f79d3c6a6ed)) +- **cli:** support SPM package traits in generated Package.swift ([#8351](https://github.com/ionic-team/capacitor/issues/8351)) ([27e6aa8](https://github.com/ionic-team/capacitor/commit/27e6aa89cf22e0b1a6d46710faed9aa8899600b0)) + # [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) ### Bug Fixes diff --git a/android/CHANGELOG.md b/android/CHANGELOG.md index 4f598252ac..9568dc0ee8 100644 --- a/android/CHANGELOG.md +++ b/android/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [8.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) + +### Bug Fixes + +- **android:** correctly parsing `server.url` when they include paths ([#8391](https://github.com/ionic-team/capacitor/issues/8391)) ([a9f2181](https://github.com/ionic-team/capacitor/commit/a9f218179b60555d86b44bf2b33354da3e64e98c)) +- **http:** handle URL objects on fetch ([#8386](https://github.com/ionic-team/capacitor/issues/8386)) ([003099a](https://github.com/ionic-team/capacitor/commit/003099aef246adfd76d890074d46b1484951824b)) +- **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/ionic-team/capacitor/issues/8384)) ([4e99598](https://github.com/ionic-team/capacitor/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) + # [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) ### Bug Fixes diff --git a/android/package.json b/android/package.json index 9555484901..5de9dab264 100644 --- a/android/package.json +++ b/android/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/android", - "version": "8.2.0", + "version": "8.3.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.2.0" + "@capacitor/core": "^8.3.0" }, "publishConfig": { "access": "public" diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index d7d656945e..054b88531d 100644 --- a/cli/CHANGELOG.md +++ b/cli/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.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) + +### Bug Fixes + +- **cli:** inline CSS sourcemaps in addition to JS sourcemaps ([#8377](https://github.com/ionic-team/capacitor/issues/8377)) ([69476ab](https://github.com/ionic-team/capacitor/commit/69476ab9c0b47911a14d2482cab53a877a5ae784)) +- **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/ionic-team/capacitor/issues/8384)) ([4e99598](https://github.com/ionic-team/capacitor/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) + +### Features + +- **cli:** Experimental config for swift-tools-version in SPM apps ([#8372](https://github.com/ionic-team/capacitor/issues/8372)) ([d2ee84f](https://github.com/ionic-team/capacitor/commit/d2ee84f8186909b142b418c02fc19f79d3c6a6ed)) +- **cli:** support SPM package traits in generated Package.swift ([#8351](https://github.com/ionic-team/capacitor/issues/8351)) ([27e6aa8](https://github.com/ionic-team/capacitor/commit/27e6aa89cf22e0b1a6d46710faed9aa8899600b0)) + # [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) ### Bug Fixes diff --git a/cli/package.json b/cli/package.json index d488db7dbc..d6afeaaad5 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/cli", - "version": "8.2.0", + "version": "8.3.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 73039f4cf2..9eb236148d 100644 --- a/core/CHANGELOG.md +++ b/core/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.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) + +### Bug Fixes + +- **http:** handle URL objects on fetch ([#8386](https://github.com/ionic-team/capacitor/issues/8386)) ([003099a](https://github.com/ionic-team/capacitor/commit/003099aef246adfd76d890074d46b1484951824b)) +- **SystemBars:** use native safe area insets on Android ([#8384](https://github.com/ionic-team/capacitor/issues/8384)) ([4e99598](https://github.com/ionic-team/capacitor/commit/4e99598a2a57ee97e82be1aaa09492744622fa60)) + # [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) **Note:** Version bump only for package @capacitor/core diff --git a/core/package.json b/core/package.json index 98e5b1b7e0..3e00751219 100644 --- a/core/package.json +++ b/core/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/core", - "version": "8.2.0", + "version": "8.3.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 c5b3b26045..a37fe723fd 100644 --- a/ios/CHANGELOG.md +++ b/ios/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.3.0](https://github.com/ionic-team/capacitor/compare/8.2.0...8.3.0) (2026-03-25) + +### Bug Fixes + +- **http:** handle URL objects on fetch ([#8386](https://github.com/ionic-team/capacitor/issues/8386)) ([003099a](https://github.com/ionic-team/capacitor/commit/003099aef246adfd76d890074d46b1484951824b)) +- **ios:** make getArray accesible on Objective-C plugins ([#8392](https://github.com/ionic-team/capacitor/issues/8392)) ([afb80f2](https://github.com/ionic-team/capacitor/commit/afb80f2fecb4bf85dbebe25e815de2a5564264d6)) + # [8.2.0](https://github.com/ionic-team/capacitor/compare/8.1.0...8.2.0) (2026-03-06) ### Bug Fixes diff --git a/ios/package.json b/ios/package.json index 86e5c661d6..9baf3480dd 100644 --- a/ios/package.json +++ b/ios/package.json @@ -1,6 +1,6 @@ { "name": "@capacitor/ios", - "version": "8.2.0", + "version": "8.3.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.2.0" + "@capacitor/core": "^8.3.0" }, "publishConfig": { "access": "public" diff --git a/lerna.json b/lerna.json index 1b708a45da..62f7f5ab47 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,6 @@ "tagVersionPrefix": "" } }, - "version": "8.2.0", + "version": "8.3.0", "$schema": "node_modules/lerna/schemas/lerna-schema.json" } From acb64ab92a37ff53701cde453558e272e2e11eb6 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Fri, 27 Mar 2026 18:34:32 +0100 Subject: [PATCH 41/42] fix(cli): check CAPACITOR_COCOAPODS_PATH in determinePackageManager (#8407) --- cli/src/config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/src/config.ts b/cli/src/config.ts index b7e2735181..4e71fb01d1 100644 --- a/cli/src/config.ts +++ b/cli/src/config.ts @@ -434,6 +434,10 @@ async function determinePackageManager( return 'SPM'; } + if (process.env.CAPACITOR_COCOAPODS_PATH) { + return 'Cocoapods'; + } + let gemfilePath = ''; if (await pathExists(resolve(rootDir, 'Gemfile'))) { gemfilePath = resolve(rootDir, 'Gemfile'); From 3d1f8d1b61480187375f5cd4de7ba999db007542 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Tue, 31 Mar 2026 12:26:26 +0200 Subject: [PATCH 42/42] fix(system-bars): use separate current styles (#8409) --- .../main/java/com/getcapacitor/plugin/SystemBars.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 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 c84923ca8b..fbfb6b5e21 100644 --- a/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java +++ b/android/capacitor/src/main/java/com/getcapacitor/plugin/SystemBars.java @@ -56,7 +56,8 @@ function capacitorSystemBarsCheckMetaViewport() { private boolean insetHandlingEnabled = true; private boolean hasViewportCover = false; - private String currentStyle = STYLE_DEFAULT; + private String currentStatusBarStyle = STYLE_DEFAULT; + private String currentGestureBarStyle = STYLE_DEFAULT; @Override public void load() { @@ -85,7 +86,8 @@ public void onPageCommitVisible(WebView view, String url) { protected void handleOnConfigurationChanged(Configuration newConfig) { super.handleOnConfigurationChanged(newConfig); - setStyle(currentStyle, ""); + setStyle(currentGestureBarStyle, BAR_GESTURE_BAR); + setStyle(currentStatusBarStyle, BAR_STATUS_BAR); } private void initSystemBars() { @@ -259,8 +261,6 @@ private void injectSafeAreaCSS(int top, int right, int bottom, int left) { } private void setStyle(String style, String bar) { - currentStyle = style; - if (style.equals(STYLE_DEFAULT)) { style = getStyleForTheme(); } @@ -268,10 +268,12 @@ private void setStyle(String style, String bar) { Window window = getActivity().getWindow(); WindowInsetsControllerCompat windowInsetsControllerCompat = WindowCompat.getInsetsController(window, window.getDecorView()); if (bar.isEmpty() || bar.equals(BAR_STATUS_BAR)) { + currentStatusBarStyle = style; windowInsetsControllerCompat.setAppearanceLightStatusBars(!style.equals(STYLE_DARK)); } if (bar.isEmpty() || bar.equals(BAR_GESTURE_BAR)) { + currentGestureBarStyle = style; windowInsetsControllerCompat.setAppearanceLightNavigationBars(!style.equals(STYLE_DARK)); }