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
相关产品推荐
相关产品推荐

