WebView2无AddWebAllowedObject方法,MAUI跨平台JS桥适配求助
.NET MAUI Windows WebView2 适配JS桥接方案
1. C#端对象暴露
使用WebView2的AddHostObjectToScript方法注册供JS调用的C#对象,需给类添加[ComVisible(true)]特性确保JS可访问:
[ComVisible(true)] public class NativeBridge { public string GetAppVersion() { return AppInfo.Current.VersionString; } public void ShowToast(string message) { // Windows端Toast实现逻辑 ToastNotificationManagerCompat.CreateToastNotifier().Show( new ToastNotification(ToastContentBuilderFactory.CreateToastContentBuilder() .AddText(message) .GetToastContent())); } } // WebView2初始化完成后注册对象 webView.CoreWebView2InitializationCompleted += (s, e) => { if (e.IsSuccess) { webView.CoreWebView2.AddHostObjectToScript("nativeBridge", new NativeBridge()); } };
2. 注入JS适配层
在网页加载前注入适配脚本,将WebView2的异步Promise调用转为同步形式,对齐原UWP/Android端的调用逻辑:
webView.CoreWebView2InitializationCompleted += (s, e) => { if (e.IsSuccess) { var bridgeAdapterScript = @" window.nativeBridge = { GetAppVersion: function() { return window.chrome.webview.hostObjects.sync.nativeBridge.GetAppVersion(); }, ShowToast: function(message) { window.chrome.webview.hostObjects.sync.nativeBridge.ShowToast(message); } }; "; webView.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(bridgeAdapterScript); } };
核心是利用chrome.webview.hostObjects.sync实现同步调用,原网页的nativeBridge.GetAppVersion()等调用逻辑无需修改,即可和Android/UWP端保持一致。
3. 适配注意事项
- C#方法尽量使用同步逻辑,若涉及异步操作,需在C#端处理完成后返回结果,避免JS端出现跨平台逻辑差异。
- 传递复杂类型时,可通过JSON序列化/反序列化统一处理,保证各平台数据交互格式一致。
- 若有特殊权限需求,可通过
CoreWebView2Settings调整WebView2的访问权限配置。
内容的提问来源于stack exchange,提问作者Gert Hermans
相关产品推荐
相关产品推荐

