跳转到内容

平台设置

大多数平台添加 webview_all 后即可使用,但部分引擎需要运行时组件、权限或 runner 修改。

最低 SDK 需要 API 24。根据页面能力添加系统权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

如果 WebView 表单控件需要 Material Components 风格,请让应用主题兼容 Material Components。文件选择、拍照、录音等流程还需要应用自己处理 Android 运行时权限。

最低 iOS 13.0。页面需要访问摄像头、麦克风或定位时,在 Info.plist 添加说明:

<key>NSCameraUsageDescription</key>
<string>Allow pages to use the camera after approval.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Allow pages to use the microphone after approval.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Allow pages to request location.</string>

App-Bound Domains 需要宿主应用配置域名,并用 WebKitWebViewControllerCreationParams(limitsNavigationsToAppBoundDomains: true) 创建控制器。

最低 macOS 10.15。沙盒应用如需联网,需要启用 outgoing network entitlement:

<key>com.apple.security.network.client</key>
<true/>

macOS 与 iOS 共用 webview_flutter_wkwebview,但部分 UIKit 风格的属性在 macOS 上没有实现。详见iOS 和 macOS

Windows 使用 WebView2,目标机器必须安装 Microsoft Edge WebView2 Runtime。

final version = await WindowsWebViewController.getWebViewVersion();
if (version == null) {
// 提示用户安装 WebView2 Runtime。
}

需要自定义用户数据目录或浏览器路径时,在创建 controller 前初始化环境:

await WindowsWebViewController.initializeEnvironment(
userDataPath: 'C:\\Users\\Public\\MyApp\\WebView2',
);

需要 WebKitGTK 4.1。Ubuntu 系发行版可安装:

Terminal window
sudo apt install libwebkit2gtk-4.1-dev

Linux平台需要修改代码使得 WebViewWidget 能在 GtkOverlay 正确加载。

编辑您项目里的 linux/runner/my_application.cc 即可:

  1. 在靠前的位置添加函数:
static void first_frame_cb(MyApplication* self, FlView* view) {
gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view)));
}
  1. 找到以下代码:
g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments(
project, self->dart_entrypoint_arguments);
gtk_widget_show(GTK_WIDGET(window));
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));

替换为:

g_autoptr(FlDartProject) project = fl_dart_project_new();
fl_dart_project_set_dart_entrypoint_arguments(
project, self->dart_entrypoint_arguments);
FlView* view = fl_view_new(project);
gtk_widget_show(GTK_WIDGET(view));
GtkWidget* overlay = gtk_overlay_new();
gtk_widget_show(overlay);
gtk_container_add(GTK_CONTAINER(overlay), GTK_WIDGET(view));
gtk_container_add(GTK_CONTAINER(window), overlay);
g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), self);
gtk_widget_realize(GTK_WIDGET(view));
fl_register_plugins(FL_PLUGIN_REGISTRY(view));

使用 OHOS Flutter SDK,目标 OHOS API 12+。Web 内容权限由 onPermissionRequest 回调处理,但宿主应用仍然需要声明并获取对应系统权限。

Web 实现是 HTML iframe,必须遵守浏览器安全边界:

  • 不能读取用户机器上的任意本地文件。
  • 不能向跨域 iframe 执行 JavaScript。
  • 不能拦截 TLS 证书错误决策。
  • Cookie 受 document.cookie 和浏览器隐私策略限制。