You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:27:01