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

Flutter中如何获取设备的Android WebView或iOS WKWebView版本?

获取Android系统WebView和iOS WKWebView版本(基于webview_flutter)

Android 系统WebView版本获取

webview_flutter在Android端依赖系统自带的WebView组件,要获取其版本,需通过MethodChannel调用Android原生代码实现:

1. Dart端代码

import 'package:flutter/services.dart';

class WebViewVersionUtil {
  static const MethodChannel _channel = MethodChannel('webview_version');

  static Future<String?> getAndroidWebViewVersion() async {
    try {
      return await _channel.invokeMethod<String>('getAndroidWebViewVersion');
    } on PlatformException catch (e) {
      print('获取Android WebView版本失败: ${e.message}');
      return null;
    }
  }
}

2. Android原生代码(Kotlin)

在MainActivity.kt中添加MethodChannel处理逻辑:

import android.webkit.WebView
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "webview_version"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getAndroidWebViewVersion") {
                // 优先通过WebView包信息获取版本,兼容大部分设备
                val webViewPackage = WebView.getCurrentWebViewPackage()
                val version = webViewPackage?.versionName ?: run {
                    //  fallback:从UserAgent解析版本
                    WebView(this).settings.userAgentString.split("Chrome/")[1].split(" ")[0]
                }
                result.success(version)
            } else {
                result.notImplemented()
            }
        }
    }
}

iOS WKWebView版本获取

iOS端webview_flutter使用WKWebView,推荐两种获取版本的方式:

方法1:通过WebView执行JavaScript解析UserAgent

import 'package:webview_flutter/webview_flutter.dart';

Future<String?> getIOSWKWebViewVersion(WebViewController controller) async {
  try {
    final userAgent = await controller.runJavascriptReturningResult("navigator.userAgent");
    // 匹配UserAgent中的AppleWebKit版本(与WKWebView版本对应)
    final regex = RegExp(r'AppleWebKit/(\d+\.\d+\.\d+)');
    final match = regex.firstMatch(userAgent);
    return match?.group(1);
  } catch (e) {
    print('获取iOS WKWebView版本失败: $e');
    return null;
  }
}

方法2:通过MethodChannel调用原生代码(Swift)

Dart端代码

复用之前的WebViewVersionUtil,新增方法:

static Future<String?> getIOSWKWebViewVersion() async {
  try {
    return await _channel.invokeMethod<String>('getIOSWKWebViewVersion');
  } on PlatformException catch (e) {
    print('获取iOS WKWebView版本失败: ${e.message}');
    return null;
  }
}

iOS原生代码(Swift)

在AppDelegate.swift中添加MethodChannel处理:

import UIKit
import Flutter
import WebKit

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    private let CHANNEL = "webview_version"

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { [weak self] call, result in
            guard let self = self else { return }
            if call.method == "getIOSWKWebViewVersion" {
                let webView = WKWebView()
                // 尝试直接获取WebKit版本
                if let webKitVersion = webView.value(forKey: "_webKitVersion") as? String {
                    result.success(webKitVersion)
                } else {
                    // fallback:从UserAgent解析
                    let userAgent = webView.configuration.defaultWebpagePreferences.userAgent ?? ""
                    let regex = try! NSRegularExpression(pattern: "AppleWebKit/(\\d+\\.\\d+\\.\\d+)")
                    if let match = regex.firstMatch(in: userAgent, range: NSRange(location: 0, length: userAgent.utf16.count)) {
                        let version = String(userAgent[Range(match.range(at: 1), in: userAgent)!])
                        result.success(version)
                    } else {
                        result.success("未知版本")
                    }
                }
            } else {
                result.notImplemented()
            }
        }
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

注意事项

  • Android端部分定制ROM可能修改WebView实现,建议同时保留包信息获取和UserAgent解析两种逻辑,提升兼容性。
  • iOS端WKWebView版本与系统版本强绑定,WebKit版本随iOS系统更新同步升级。

内容的提问来源于stack exchange,提问作者Ammar Mohamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:52:25