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();
}
}
}
}