using System;
|
using Foundation;
|
using WebKit;
|
using System.Collections.Generic;
|
namespace Shared
|
{
|
/// <summary>
|
/// WebView
|
/// </summary>
|
public class WebView:View
|
{
|
public Action<Dictionary<string,string>> JSToNativeAction;
|
|
/// <summary>
|
/// DidFinishAction
|
/// </summary>
|
public Action DidFinishAction;
|
|
/// <summary>
|
/// WKWebView
|
/// </summary>
|
private InnerWKWebView uiWebView
|
{
|
get
|
{
|
return this.uiView as InnerWKWebView;
|
}
|
set
|
{
|
this.uiView = value;
|
}
|
}
|
|
/// <summary>
|
/// WebView
|
/// </summary>
|
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");
|
|
}
|
|
/// <summary>
|
/// 加载网页
|
/// </summary>
|
/// <param name="url"></param>
|
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 + "");
|
});
|
}
|
|
/// <summary>
|
/// 加载本地HTML
|
/// </summary>
|
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);
|
|
}
|
}
|
|
|
/// <summary>
|
/// 加载Html标签的富文本
|
/// </summary>
|
/// <param name="htmlStr"></param>
|
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<string, string> { };
|
|
foreach (var nsKey in nsDictionary.Keys)
|
{
|
var key = nsKey.ToString();
|
dictionary.Add(key, nsDictionary.ValueForKey(new NSString(key))?.ToString());
|
}
|
webView?.JSToNativeAction?.Invoke(dictionary);
|
}
|
}
|
}
|
|
|
|
/// <summary>
|
/// OnWKNavigationDelegate
|
/// </summary>
|
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();
|
}
|
}
|
}
|
}
|