using System; using Foundation; using WebKit; using System.Collections.Generic; namespace Shared { /// /// WebView /// public class WebView:View { public Action> JSToNativeAction; /// /// DidFinishAction /// public Action DidFinishAction; /// /// WKWebView /// private InnerWKWebView uiWebView { get { return this.uiView as InnerWKWebView; } set { this.uiView = value; } } /// /// WebView /// public WebView () { // 配置网页的配置文件 WKWebViewConfiguration configuration = new WKWebViewConfiguration { }; //默认布局,宽高为0的话会异常 var mFrame = new CoreGraphics.CGRect(base.X, base.Y, 10, 10); this.uiWebView = new InnerWKWebView(this, mFrame, configuration) { }; uiWebView.ScrollView.Bounces = false; //uiWebView.NavigationDelegate = new OnWKNavigationDelegate(this); configuration.UserContentController.AddScriptMessageHandler(this.uiWebView, "call"); } /// /// 加载网页 /// /// public void LoadRequest(string url) { uiWebView.LoadRequest ( Foundation.NSUrlRequest.FromUrl ( Foundation.NSUrl .FromString(url))); } public void CallJS(string js) { uiWebView.EvaluateJavaScript(js,(result, error) => { System.Console.WriteLine(error + ""); }); } /// /// 加载本地HTML /// public void LoadFileUrl(string url) { var urls = url.Split("?"); url = urls[0]; Console.WriteLine(url + "xxxxxxxxxxxxx"); string parameter = null; if (1 < urls.Length) { parameter = urls[1]; } if (url.EndsWith(".html")) { url = url.Substring(0, url.Length - ".html".Length); } var filePath = NSBundle.MainBundle.PathForResource(url, "html"); if (parameter == null) { var nsUrl = new NSUrl(filePath,false); uiWebView.LoadFileUrl(nsUrl, nsUrl); } else { var path = $"file://{filePath}?{parameter}"; //转成file路径,并且拼上参数 //var newPath = NSUrl..Encode(path); NSUrlComponents nSUrl = new NSUrlComponents(path); var nsUrl = nSUrl.Url;//NSUrl.FromString(newPath.ToString()); uiWebView.LoadFileUrl(nsUrl, nsUrl); } } /// /// 加载Html标签的富文本 /// /// public void LoadHTMLString(string htmlStr) { uiWebView.LoadHtmlString(htmlStr, null); } class InnerWKWebView : WKWebView, IWKScriptMessageHandler { [Weak] WebView webView; public InnerWKWebView(WebView webView, CoreGraphics.CGRect cGRect, WKWebViewConfiguration wKWebViewConfiguration) : base(cGRect, wKWebViewConfiguration) { this.webView = webView; } public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message) { if (message.Name == "call") { if (message.Body == null) { return; } var nsDictionary = (NSDictionary)message.Body; if (nsDictionary == null) { return; } var dictionary = new Dictionary { }; foreach (var nsKey in nsDictionary.Keys) { var key = nsKey.ToString(); dictionary.Add(key, nsDictionary.ValueForKey(new NSString(key))?.ToString()); } webView?.JSToNativeAction?.Invoke(dictionary); } } } /// /// OnWKNavigationDelegate /// class OnWKNavigationDelegate : WKNavigationDelegate { [Weak] WebView _WebView; public OnWKNavigationDelegate(WebView view) { _WebView = view; } public override void DidFinishNavigation(WKWebView webView, WKNavigation navigation) { HDLUtils.WriteLine("WKWebView DidFinishNavigation"); _WebView.DidFinishAction?.Invoke(); } } } }