'Http and Https calls not working after Cordova upgrade
I built an app by using Cordova and it's in production for more than years. Recently few days back I upgraded my Cordova version from 9.x to 10.x. After upgrade, Http and Https calls are not working. I am using Axios to make API calls.
After I did research on this issue I found some solutions to add cordova-plugin-wkwebview-file-xhr. I did but no luck. I placed my config.xml file for the reference.
Getting the following error while making API calls
nativeXHR: Invalid url scheme null
It would be appreciated if anyone can help?
<widget xmlns="http://www.w3.org/ns/widgets"
xmlns:gap="http://phonegap.com/ns/1.0" id="##appId##" ios-CFBundleVersion="101" version="##version##"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>##appName##</name>
<description>##appDescription##</description>
<author href="" email=""></author>
<plugin name="cordova-plugin-whitelist" spec="1.3.0" />
<plugin name="cordova-plugin-file" spec="4.0.0"/>
<plugin name="cordova-plugin-file-opener2" spec="2.2.1"/>
<plugin name="cordova-plugin-browser" spec="1.0.1"/>
<plugin name="cordova-plugin-3dtouch" spec="1.3.5"/>
<plugin name="cordova-plugin-touch-id" spec="3.3.1" />
<plugin name="cordova-plugin-android-fingerprint-auth" spec="1.5.0" />
<plugin name="cordova-plugin-secure-storage-echo" spec="5.0.0"/>
<plugin name="cordova-plugin-device" spec="1.1.3" />
<plugin name="cordova-plugin-inappbrowser" spec="4.0.0" />
<plugin name="cordova-plugin-network-information" spec="1.3.0" />
<plugin name="cordova-plugin-splashscreen" spec="5.0.1" />
<plugin name="cordova-plugin-statusbar" spec="2.4.1" />
<plugin name="cordova-plugin-nativestorage" spec="2.3.2" />
<plugin name="de.appplant.cordova.plugin.printer" spec="0.7.3" />
<plugin name="cordova-plugin-app-launcher" spec="0.4.0"/>
<plugin name="phonegap-plugin-push" spec="2.3.0">
<param name="SENDER_ID" value="819721619677" />
</plugin>
<plugin name="cordova-plugin-camera" spec="2.4.1">
<variable name="CAMERA_USAGE_DESCRIPTION" value="App would like to access the camera." />
<variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="App would like to access the library." />
</plugin>
<plugin name="cordova-plugin-dialogs" spec="1.3.4"/>
<plugin name="cordova-plugin-request-location-accuracy" spec="2.2.3" />
<plugin name="cordova-plugin-geolocation" spec="2.4.3" />
<plugin name="@grandhi/cordova-diagnostic-plugin" spec="1.0.1"/>
<plugin name="cordova-android-support-gradle-release">
<variable name="ANDROID_SUPPORT_VERSION" value="28.0.0"/>
</plugin>
<plugin name="cordova-plugin-apprate" spec="1.4.0" />
<plugin name="phonegap-plugin-media-stream" spec="1.2.1" />
<plugin name="cordova-plugin-tts" spec="0.2.3" />
<plugin name="cordova-plugin-wkwebview-file-xhr" spec="3.0.0" />
<preference name="cordova.plugins.diagnostic.modules" value="LOCATION" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="1500" />
<preference name="SplashShowOnlyFirstTime" value="false" />
<preference name="orientation" value="default"/>
<preference name="fullscreen" value="false"/>
<preference name="target-device" value="universal"/>
<preference name="webviewbounce" value="false"/>
<preference name="UIWebViewBounce" value="false"/>
<preference name="prerendered-icon" value="true"/>
<preference name="stay-in-webview" value="true"/>
<preference name="ios-statusbarstyle" value="default"/>
<preference name="detect-data-types" value="true"/>
<preference name="exit-on-suspend" value="false"/>
<preference name="auto-hide-splash-screen" value="true"/>
<preference name="FadeSplashScreen" value="false" />
<preference name="FadeSplashScreenDuration" value="0" />
<preference name="ShowSplashScreenSpinner" value="false" />
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="EnableViewportScale" value="true"/>
<preference name="MediaPlaybackRequiresUserAction" value="false"/>
<preference name="AllowInlineMediaPlayback" value="false"/>
<preference name="BackupWebStorage" value="cloud"/>
<preference name="TopActivityIndicator" value="gray"/>
<preference name="KeyboardDisplayRequiresUserAction" value="true"/>
<preference name="HideKeyboardFormAccessoryBar" value="false"/>
<preference name="SuppressesIncrementalRendering" value="false"/>
<preference name="android-minSdkVersion" value="22"/>
<preference name="android-installLocation" value="internalOnly"/>
<preference name="ErrorUrl" value=""/>
<preference name="BackgroundColor" value="0x000000"/>
<preference name="KeepRunning" value="true"/>
<preference name="LoadingDialog" value=","/>
<preference name="LoadUrlTimeoutValue" value="20000"/>
<preference name="disable-cursor" value="false"/>
<preference name="StatusBarOverlaysWebView" value="false" />
<preference name="StatusBarBackgroundColor" value="#000000" />
<preference name="StatusBarStyle" value="lightcontent" />
<preference name="UIWebViewDecelerationSpeed" value="fast" />
<preference name="android-build-tool" value="gradle" />
<preference name="android-targetSdkVersion" value="28" />
<gap:platform name="ios"/>
<gap:platform name="android"/>
<icon src="images/ios/icons/icon-29.png" gap:platform="ios" width="29" height="29"/>
<icon src="images/ios/icons/icon-40.png" gap:platform="ios" width="40" height="40"/>
<icon src="images/ios/icons/icon-48.png" gap:platform="ios" width="48" height="48"/>
<icon src="images/ios/icons/icon-50.png" gap:platform="ios" width="50" height="50"/>
<icon src="images/ios/icons/icon-57.png" gap:platform="ios" width="57" height="57"/>
<icon src="images/ios/icons/icon-58.png" gap:platform="ios" width="58" height="58"/>
<icon src="images/ios/icons/icon-60.png" gap:platform="ios" width="60" height="60"/>
<icon src="images/ios/icons/icon-64.png" gap:platform="ios" width="64" height="64"/>
<icon src="images/ios/icons/icon-72.png" gap:platform="ios" width="72" height="72"/>
<icon src="images/ios/icons/icon-76.png" gap:platform="ios" width="76" height="76"/>
<icon src="images/ios/icons/icon-80.png" gap:platform="ios" width="80" height="80"/>
<icon src="images/ios/icons/icon-87.png" gap:platform="ios" width="87" height="87"/>
<icon src="images/ios/icons/icon-100.png" gap:platform="ios" width="100" height="100"/>
<icon src="images/ios/icons/icon-114.png" gap:platform="ios" width="114" height="114"/>
<icon src="images/ios/icons/icon-120.png" gap:platform="ios" width="120" height="120"/>
<icon src="images/ios/icons/icon-144.png" gap:platform="ios" width="144" height="144"/>
<icon src="images/ios/icons/icon-152.png" gap:platform="ios" width="152" height="152"/>
<icon src="images/ios/icons/icon-167.png" gap:platform="ios" width="167" height="167"/>
<icon src="images/ios/icons/icon-320.png" gap:platform="ios" width="320" height="320"/>
<icon src="images/ios/icons/icon-1024.png" gap:platform="ios" width="1024" height="1024"/>
<icon src="images/android/icons/ldpi.png" gap:platform="android" gap:density="ldpi"/>
<icon src="images/android/icons/mdpi.png" gap:platform="android" gap:density="mdpi"/>
<icon src="images/android/icons/hdpi.png" gap:platform="android" gap:density="hdpi"/>
<icon src="images/android/icons/xhdpi.png" gap:platform="android" gap:density="xhdpi"/>
<icon src="images/android/icons/xxhdpi.png" gap:platform="android" gap:density="xxhdpi"/>
<icon src="images/android/icons/xxxhdpi.png" gap:platform="android" gap:density="xxxhdpi"/>
<icon src="images/icon-64.png"/>
<splash src="images/ios/splash/Default@2x~universal~anyany.png" />
<gap:splash src="images/android/splash/splash200x320.png" gap:platform="android" gap:density="ldpi"/>
<gap:splash src="images/android/splash/splash320x480.png" gap:platform="android" gap:density="mdpi"/>
<gap:splash src="images/android/splash/splash480x800.png" gap:platform="android" gap:density="hdpi"/>
<gap:splash src="images/android/splash/splash720x1280.png" gap:platform="android" gap:density="xhdpi"/>
<gap:splash src="images/android/splash/splash960x1600.png" gap:platform="android" gap:density="xxhdpi"/>
<gap:splash src="images/android/splash/splash1280x1920.png" gap:platform="android" gap:density="xxxhdpi"/>
<gap:splash src="images/android/splash/splash320x200.png" gap:platform="android" gap:density="ldpi"/>
<gap:splash src="images/android/splash/splash480x320.png" gap:platform="android" gap:density="mdpi"/>
<gap:splash src="images/android/splash/splash800x480.png" gap:platform="android" gap:density="hdpi"/>
<gap:splash src="images/android/splash/splash1280x720.png" gap:platform="android" gap:density="xhdpi"/>
<gap:splash src="images/android/splash/splash1600x960.png" gap:platform="android" gap:density="xxhdpi"/>
<gap:splash src="images/android/splash/splash1920x1280.png" gap:platform="android" gap:density="xxxhdpi"/>
<gap:splash src="splash.png"/>
<access origin='*' minimum-tls-version='TLSv1.1' requires-forward-secrecy='true' requires-certificate-transparency='true' />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />
<platform name="android">
<allow-intent href="market:*" />
<resource-file src="google-services.json" target="app/google-services.json" />
<preference name="DisallowOverscroll" value="true"/>
<config-file parent="/manifest/application" target="AndroidManifest.xml"
xmlns:android="http://schemas.android.com/apk/res/android">
<provider android:authorities="${applicationId}.opener.provider" android:exported="false" android:grantUriPermissions="true" android:name="io.github.pwlin.cordova.plugins.fileopener2.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/opener_paths" />
</provider>
</config-file>
<config-file parent="/manifest/application" target="AndroidManifest.xml">
<activity android:name="com.adobe.phonegap.push.PushHandlerActivity" android:exported="true" android:permission="${applicationId}.permission.PushHandlerActivity"/>
</config-file>
<config-file parent="/manifest/application" target="AndroidManifest.xml">
<service android:name="com.adobe.phonegap.push.FCMService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
</config-file>
<icon src="images/android/icons/ldpi.png" density="ldpi"/>
<icon src="images/android/icons/mdpi.png" density="mdpi"/>
<icon src="images/android/icons/hdpi.png" density="hdpi"/>
<icon src="images/android/icons/xhdpi.png" density="xhdpi"/>
<icon src="images/android/icons/xxhdpi.png" density="xxhdpi"/>
<icon src="images/android/icons/xxxhdpi.png" density="xxxhdpi"/>
<splash src="images/android/splash/splash200x320.png" density="port-ldpi"/>
<splash src="images/android/splash/splash320x480.png" density="port-mdpi"/>
<splash src="images/android/splash/splash480x800.png" density="port-hdpi"/>
<splash src="images/android/splash/splash720x1280.png" density="port-xhdpi"/>
<splash src="images/android/splash/splash960x1600.png" density="port-xxhdpi"/>
<splash src="images/android/splash/splash1280x1920.png" density="port-xxxhdpi"/>
<splash src="images/android/splash/splash320x200.png" platform="android" density="land-ldpi"/>
<splash src="images/android/splash/splash480x320.png" platform="android" density="land-mdpi"/>
<splash src="images/android/splash/splash800x480.png" platform="android" density="land-hdpi"/>
<splash src="images/android/splash/splash1280x720.png" platform="android" density="land-xhdpi"/>
<splash src="images/android/splash/splash1600x960.png" platform="android" density="land-xxhdpi"/>
<splash src="images/android/splash/splash1920x1280.png" platform="android" density="land-xxxhdpi"/>
<edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<preference name="DisallowOverscroll" value="true"/>
<preference name="KeychainAccessibility" value="WhenUnlocked"/>
<preference name="InterceptRemoteRequests" value="all" />
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
<edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="merge">
<string>This app uses the camera to upload your profile photo and take pictures of attachments.</string>
</edit-config>
<!-- NSAllowsArbitraryLoads -->
<icon src="images/ios/icons/icon-29.png" width="29" height="29"/>
<icon src="images/ios/icons/icon-40.png" width="40" height="40"/>
<icon src="images/ios/icons/icon-48.png" width="48" height="48"/>
<icon src="images/ios/icons/icon-50.png" width="50" height="50"/>
<icon src="images/ios/icons/icon-57.png" width="57" height="57"/>
<icon src="images/ios/icons/icon-58.png" width="58" height="58"/>
<icon src="images/ios/icons/icon-60.png" width="60" height="60"/>
<icon src="images/ios/icons/icon-64.png" width="64" height="64"/>
<icon src="images/ios/icons/icon-72.png" width="72" height="72"/>
<icon src="images/ios/icons/icon-76.png" width="76" height="76"/>
<icon src="images/ios/icons/icon-80.png" width="80" height="80"/>
<icon src="images/ios/icons/icon-87.png" width="87" height="87"/>
<icon src="images/ios/icons/icon-100.png" width="100" height="100"/>
<icon src="images/ios/icons/icon-114.png" width="114" height="114"/>
<icon src="images/ios/icons/icon-120.png" width="120" height="120"/>
<icon src="images/ios/icons/icon-144.png" width="144" height="144"/>
<icon src="images/ios/icons/icon-152.png" width="152" height="152"/>
<icon src="images/ios/icons/icon-167.png" width="167" height="167"/>
<icon src="images/ios/icons/icon-320.png" width="320" height="320"/>
<icon src="images/ios/icons/icon-1024.png" width="1024" height="1024"/>
<splash src="images/ios/splash/Default@2x~universal~anyany.png" />
<config-file parent="NSBluetoothAlwaysUsageDescription" platform="ios" target="*-Info.plist">
<string>This app requires constant Bluetooth access to function properly</string>
</config-file>
<edit-config target="NSMicrophoneUsageDescription" file="*-Info.plist" mode="merge">
<string>need microphone access to record sounds</string>
</edit-config>
<edit-config target="NSLocationWhenInUseUsageDescription" file="*-Info.plist" mode="merge">
<string>This app requires your location to clock in or out.</string>
</edit-config>
<feature name="CDVWKWebViewEngine">
<param name="ios-package" value="CDVWKWebViewEngine" />
</feature>
</platform>
</widget>```
Solution 1:[1]
@subbu I faced the same problem of "nativeXHR: Invalid url scheme null", but I realized that the cause of the problem was not in the HTTP or https scheme. I noticed that this result only happens when there were some characters in the URL that was not correctly encoded (for example, blank space).
The solve this issue I just add the line below in the CDVWKWebViewFileXhr.m:
// it must be located before the line 375
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
So the final code would look like:
(...)
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlString];
(...)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 |