wxr
2023-07-25 8309664bc53f72b0c808c339329cabcee87657c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
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();
            }
        }
    }
}