Plugin
@capacitor/geolocation
Plugin version
8.1.0
Capacitor version
@capacitor/core 8.3.1, @capacitor/ios 8.3.1
Platform
iOS
iOS version
iOS 26
Xcode version
Xcode 26.4.1
Current behavior
Geolocation.checkPermissions(), Geolocation.getCurrentPosition(), and Geolocation.watchPosition() calls from JS never produce a corresponding ⚡️ To Native -> Geolocation log line in the native console. The bridge message is silently dropped between the JS webkit.messageHandlers.bridge.postMessage() call and the native WebViewDelegationHandler.userContentController handler.
The JS-side promise hangs indefinitely until a hard timeout fires.
Expected behavior
Bridge messages from @capacitor/geolocation should reach the native handler the same way they do for @capacitor/app and our custom AppleSignInPlugin (a CAPPlugin we wrote in-project), both of which run on the same Capacitor bridge in the same project and bridge correctly.
Reproduction
I haven't been able to produce a minimal reproducer outside our project. The issue is consistent in our project across multiple clean builds, fresh installs, and DerivedData wipes.
What I've ruled out (with evidence)
- JS-side registration:
Capacitor.isPluginAvailable('Geolocation') returns true. 'Geolocation' is in Object.keys(Capacitor.Plugins).
- Native plugin loaded:
GeolocationPlugin.load() runs successfully in 2 ms (verified via NSLog probe).
- Plugin in bundle:
CapacitorGeolocation Pod installed and built. GeolocationPlugin Swift symbols present in compiled App.debug.dylib (verified via nm).
- Version skew: Single deduped
@capacitor/core@8.3.1 instance. No multiple cores in node_modules.
- packageClassList:
GeolocationPlugin is correctly listed in capacitor.config.json.
- Newer plugin version:
@capacitor/geolocation 8.2.0's GeolocationPlugin.swift is byte-for-byte identical to 8.1.0.
IONGLOCManagerWrapper init hang on iOS 26: Plugin's load() completes in 2 ms, ruling out a CoreLocation main-thread hang during plugin instantiation.
@capacitor/synapse: Loads cleanly, only adds proxy under CapacitorUtils.Synapse, doesn't intercept normal calls.
- Module resolution / build state: Multiple clean rebuilds with full DerivedData wipes — same behavior.
What is asymmetric
@capacitor/app and a custom AppleSignInPlugin (a CAPPlugin subclass we wrote in this project) both bridge correctly through the same WKWebView and same Capacitor 8.3.1 bridge in the same app. We see ⚡️ To Native -> App getLaunchUrl and ⚡️ To Native -> AppleSignIn signIn in the device console for those plugins. Only @capacitor/geolocation is silent.
Workaround
We bypassed the Capacitor plugin entirely on iOS by routing geolocation calls through navigator.geolocation (WKWebView's built-in API), which doesn't use the Capacitor bridge. Android continues using the Capacitor plugin (its bridge isn't affected). This is shipping in production for us. Happy to share the routing code if helpful.
Why this is worth investigating
This appears to be a bridge-routing issue specific to one plugin in a specific platform/Xcode/iOS combination. The asymmetry (other plugins work, this plugin doesn't, on the same bridge) suggests something in CapacitorGeolocation's registration or the bridge's per-plugin handling, not a general Capacitor-on-iOS-26 issue.
Logs / further detail
Full diagnostic chain available — happy to share native console output, plugin probe results, or anything else useful for triage.
Plugin
@capacitor/geolocation
Plugin version
8.1.0
Capacitor version
@capacitor/core 8.3.1, @capacitor/ios 8.3.1
Platform
iOS
iOS version
iOS 26
Xcode version
Xcode 26.4.1
Current behavior
Geolocation.checkPermissions(),Geolocation.getCurrentPosition(), andGeolocation.watchPosition()calls from JS never produce a corresponding⚡️ To Native -> Geolocationlog line in the native console. The bridge message is silently dropped between the JSwebkit.messageHandlers.bridge.postMessage()call and the nativeWebViewDelegationHandler.userContentControllerhandler.The JS-side promise hangs indefinitely until a hard timeout fires.
Expected behavior
Bridge messages from
@capacitor/geolocationshould reach the native handler the same way they do for@capacitor/appand our customAppleSignInPlugin(aCAPPluginwe wrote in-project), both of which run on the same Capacitor bridge in the same project and bridge correctly.Reproduction
I haven't been able to produce a minimal reproducer outside our project. The issue is consistent in our project across multiple clean builds, fresh installs, and DerivedData wipes.
What I've ruled out (with evidence)
Capacitor.isPluginAvailable('Geolocation')returnstrue.'Geolocation'is inObject.keys(Capacitor.Plugins).GeolocationPlugin.load()runs successfully in 2 ms (verified via NSLog probe).CapacitorGeolocationPod installed and built.GeolocationPluginSwift symbols present in compiledApp.debug.dylib(verified vianm).@capacitor/core@8.3.1instance. No multiple cores innode_modules.GeolocationPluginis correctly listed incapacitor.config.json.@capacitor/geolocation8.2.0'sGeolocationPlugin.swiftis byte-for-byte identical to 8.1.0.IONGLOCManagerWrapperinit hang on iOS 26: Plugin'sload()completes in 2 ms, ruling out a CoreLocation main-thread hang during plugin instantiation.@capacitor/synapse: Loads cleanly, only adds proxy underCapacitorUtils.Synapse, doesn't intercept normal calls.What is asymmetric
@capacitor/appand a customAppleSignInPlugin(aCAPPluginsubclass we wrote in this project) both bridge correctly through the same WKWebView and same Capacitor 8.3.1 bridge in the same app. We see⚡️ To Native -> App getLaunchUrland⚡️ To Native -> AppleSignIn signInin the device console for those plugins. Only@capacitor/geolocationis silent.Workaround
We bypassed the Capacitor plugin entirely on iOS by routing geolocation calls through
navigator.geolocation(WKWebView's built-in API), which doesn't use the Capacitor bridge. Android continues using the Capacitor plugin (its bridge isn't affected). This is shipping in production for us. Happy to share the routing code if helpful.Why this is worth investigating
This appears to be a bridge-routing issue specific to one plugin in a specific platform/Xcode/iOS combination. The asymmetry (other plugins work, this plugin doesn't, on the same bridge) suggests something in
CapacitorGeolocation's registration or the bridge's per-plugin handling, not a general Capacitor-on-iOS-26 issue.Logs / further detail
Full diagnostic chain available — happy to share native console output, plugin probe results, or anything else useful for triage.