Cordova-iOS同时生成UIWebView与WKWebView,如何仅启用WKWebView?
Cordova-iOS 6.2.0 强制使用WKWebView失败问题
问题现象
使用cordova-ios 6.2.0开发WebView项目,调试时发现运行时生成的是UIWebView实例而非WKWebView,但项目中无任何UIWebView直接引用:
- 头文件已声明WKWebView属性:
@property (nonatomic, strong) IBOutlet WKWebView* webView; - 尝试通过代码手动初始化WKWebView,结果同时出现两种WebView实例:
- (void)createViews { // We create the views in code for primarily for ease of upgrades and not requiring an external .xib to be included CGRect webViewBounds = self.view.bounds; WKUserContentController* userContentController = [[WKUserContentController alloc] init]; WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init]; NSString *userAgent = configuration.applicationNameForUserAgent; configuration.applicationNameForUserAgent = userAgent; configuration.userContentController = userContentController; configuration.processPool = [[CDVWebViewProcessPoolFactory sharedFactory] sharedProcessPool]; self.webView = [[WKWebView alloc] initWithFrame:webViewBounds configuration:configuration]; [self.view addSubview:self.webView]; [self.view sendSubviewToBack:self.webView]; self.webView.navigationDelegate = self; self.webView.backgroundColor = [UIColor whiteColor]; } - 即使使用最简初始化代码,运行时依然是UIWebView:
- (void)setupWebView { self.webView = [[WKWebView alloc] initWithFrame: CGRectZero]; self.webView.navigationDelegate = self; [self.view addSubview:self.webView]; [self.view sendSubviewToBack:self.webView]; }
当前config.xml配置
<content src="index.html" /> <plugin name="cordova-sqlite-storage" spec="git+https://github.com/litehelpers/Cordova-sqlite-storage.git" /> <plugin name="cordova-plugin-splashscreen" spec="^6.0.0" /> <plugin name="cordova-plugin-statusbar" spec="^3.0.0" /> <plugin name="cordova-plugin-keyboard" spec="^1.2.0" /> <plugin name="cordova-plugin-inappbrowser" spec="^5.0.0" /> <plugin name="cordova-plugin-ionic-webview" /> <platform name="ios"> <preference name="WKWebViewOnly" value="true" /> <feature name="CDVWKWebViewEngine"> <param name="ios-package" value="CDVWKWebViewEngine" /> </feature> <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" /> </platform> <feature name="CDVWKWebViewEngine"> <param name="ios-package" value="CDVWKWebViewEngine" /> </feature> <feature name="NetworkStatus"> <param name="ios-package" value="CDVConnection" /> </feature> <feature name="LocalStorage"> <param name="ios-package" value="CDVLocalStorage" /> </feature> <feature name="SplashScreen"> <param name="ios-package" value="CDVSplashScreen" /> <param name="onload" value="true" /> </feature> <feature name="InAppBrowser"> <param name="ios-package" value="CDVInAppBrowser" /> </feature> <feature name="AppAvailability"> <param name="ios-package" value="AppAvailability" /> </feature> <feature name="Battery"> <param name="ios-package" value="CDVBattery" /> </feature> <feature name="Camera"> <param name="ios-package" value="CDVCamera" /> </feature> <preference name="CameraUsesGeolocation" value="false" /> <feature name="Console"> <param name="ios-package" value="CDVLogger" /> </feature> <feature name="Device"> <param name="ios-package" value="CDVDevice" /> </feature> <feature name="Accelerometer"> <param name="ios-package" value="CDVAccelerometer" /> </feature> <feature name="Compass"> <param name="ios-package" value="CDVCompass" /> </feature> <feature name="Notification"> <param name="ios-package" value="CDVNotification" /> </feature> <feature name="File"> <param name="ios-package" value="CDVFile" /> <param name="onload" value="true" /> </feature> <feature name="FileTransfer"> <param name="ios-package" value="CDVFileTransfer" /> </feature> <feature name="Geolocation"> <param name="ios-package" value="CDVLocation" /> </feature> <feature name="Media"> <param name="ios-package" value="CDVSound" /> </feature> <feature name="Capture"> <param name="ios-package" value="CDVCapture" /> </feature> <preference name="ScrollEnabled" value="true" /> <preference name="show-splash-screen-spinner" value="true" /> <preference name="AutoHideSplashScreen" value="true" /> <preference name="Splashscreen" value="screen" /> <preference name="SplashScreenDelay" value="4000" /> <preference name="AutoHideSplashScreen" value="true" /> <preference name="ShowSplashScreenSpinner" value="true" /> <preference name="fullscreen" value="false" /> <preference name="WebViewBounce" value="false" /> <preference name="Orientation" value="portrait" /> <preference name="AllowInlineMediaPlayback" value="false" /> <preference name="BackupWebStorage" value="cloud" /> <preference name="DisallowOverscroll" value="true" /> <preference name="EnableViewportScale" value="false" /> <preference name="KeyboardDisplayRequiresUserAction" value="true" /> <preference name="MediaTypesRequiringUserActionForPlayback" value="false" /> <preference name="SuppressesIncrementalRendering" value="false" /> <preference name="TopActivityIndicator" value="gray" /> <preference name="GapBetweenPages" value="0" /> <preference name="PageLength" value="0" /> <preference name="PaginationBreakingMode" value="page" /> <preference name="PaginationMode" value="unpaginated" /> <preference name="StatusBarOverlaysWebView" value="false" /> <preference name="StatusBarBackgroundColor" value="black" /> <preference name="android-minSdkVersion" value="23" /> <preference name="android-targetSdkVersion" value="31" /> <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" /> //IOS CORS <preference name="NativeXHRLogging" value="none" /> <preference name="AllowUntrustedCerts" value="true" /> <preference name="InterceptRemoteRequests" value="secureOnly" /> <preference name="allowFileAccessFromFileURLs" value="true" /> <preference name="allowUniversalAccessFromFileURLs" value="true" /> //Android CORS <preference name="AndroidInsecureFileModeEnabled" value="true" />
解决方案
1. 移除冲突插件并确保WKWebView引擎正确安装
- 卸载
cordova-plugin-ionic-webview,cordova-ios 6.x已内置WKWebView支持,该插件会导致冲突:cordova plugin remove cordova-plugin-ionic-webview - 确认
cordova-plugin-wkwebview-engine已安装(cordova-ios 6.x默认包含,可手动安装确保):cordova plugin add cordova-plugin-wkwebview-engine
2. 清理config.xml冗余配置
- 移除platform外重复的
<feature name="CDVWKWebViewEngine">和<preference name="CordovaWebViewEngine">,只保留iOS平台内的配置:<platform name="ios"> <preference name="WKWebViewOnly" value="true" /> <feature name="CDVWKWebViewEngine"> <param name="ios-package" value="CDVWKWebViewEngine" /> </feature> <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" /> </platform> - 替换非法注释:XML不支持
//格式注释,将//IOS CORS改为<!-- IOS CORS -->,//Android CORS改为<!-- Android CORS -->
3. 修复代码初始化逻辑
- 避免手动创建WebView与Cordova自动生成的实例冲突,如需手动创建,先清理原有WebView:
// 在createViews方法开头添加清理逻辑 for (UIView *subview in self.view.subviews) { if ([subview isKindOfClass:[UIWebView class]] || [subview isKindOfClass:[WKWebView class]]) { [subview removeFromSuperview]; } }
4. 清理缓存并重建项目
- 移除并重新添加iOS平台:
cordova platform remove ios cordova platform add ios@6.2.0 - 在Xcode中执行
Product -> Clean Build Folder清理构建缓存,再重新运行项目
内容的提问来源于stack exchange,提问作者bigLearner
相关产品推荐
相关产品推荐

