Xamarin与Javascript和c#之间的iOS通信

Use*_*382 1 javascript c# xamarin.ios

我们正在实现一个应用程序,我们在Javascript和c#之间进行通信.我们的UIWebView有一个按钮来调用一些本机功能.在UIWebView上,我在ShouldStartLoad上有一个处理程序.

webView.ShouldStartLoad = myHandler; 
bool myHandler (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navType)
{
}
Run Code Online (Sandbox Code Playgroud)

这会在每次页面加载时调用.实际上,我只想从WebView的事件中调用它,例如点击按钮.从Javascript我有

window.location.href = "myapp://action?par1=abc&par2=def";
Run Code Online (Sandbox Code Playgroud)

如何从自定义URL调用特定函数?

从c#调用JavaScript

我试图从c#回调JavaScript,但它没有调用TestShow()函数

 wkWebView.EvaluateJavaScript(string.Format("TestShow()"), (r, e) =>
    {
        Console.WriteLine("In EvaluateJavaScript");
        if (e != null) Console.WriteLine(e);
    });
Run Code Online (Sandbox Code Playgroud)

JavaScript方面我有一个警报,但它没有显示警报

function TestShow()
{
    alert("Hello! I am an alert box!!");
}
Run Code Online (Sandbox Code Playgroud)

SKa*_*all 5

您可以继续使用UIWebView并解析NSUrlRequest以查看它是否是您正在寻找的呼叫.然后相应地返回true/false.

更好的选择是使用WKWebView并创建自定义消息处理程序.像这样的东西:

1)实现IWKScriptMessageHandler(在Xamarin UIViewController创建的默认UIView上测试)

public class UniversalView : UIView, IWKScriptMessageHandler
{
    public void DidReceiveScriptMessage(WKUserContentController userContentController, WKScriptMessage message)
    {
        var msg = message.Body.ToString();
        System.Diagnostics.Debug.WriteLine(msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

2)使用"myapp"的处理程序创建用户控制器(this = IWKScriptMessageHandler)

        var userController = new WKUserContentController();
        userController.AddScriptMessageHandler(this, "myapp");
Run Code Online (Sandbox Code Playgroud)

3)使用控制器创建配置

        var config = new WKWebViewConfiguration
        {
            UserContentController = userController
        };
Run Code Online (Sandbox Code Playgroud)

4)使用config创建WKWebView

var webView = new WKWebView(new CGRect(10, 100, 500, 500), config);
Run Code Online (Sandbox Code Playgroud)

5)从JS代码中调用"myapp"

        <html><head><meta charset = "utf-8"/></head><body>
            <button onclick="callCsharp()">Click</button>"
            <script type="text/javascript">
                function callCsharp(){ 
Run Code Online (Sandbox Code Playgroud)

window.webkit.messageHandlers.myapp .postMessage("action?par1 = abc&par2 = def");

                 }</script></body></html>";
Run Code Online (Sandbox Code Playgroud)

编辑:关于从C#评估JS,您需要确保HTML页面已完成加载,否则调用将导致错误.您可以通过实现IWKNavigationDelegate来处理导航事件

public class UniversalView : UIView, IWKScriptMessageHandler, IWKNavigationDelegate
{

    [Export("webView:didFinishNavigation:")]
    public void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
    {
        webView.EvaluateJavaScript("callCsharp()", (result, error) =>
        {
            if (error != null) Console.WriteLine(error);
        });
    }
Run Code Online (Sandbox Code Playgroud)

将其分配给您创建的WKWebView:

        var webView = new WKWebView(new CGRect(10, 100, 500, 500), config)
        {
            WeakNavigationDelegate = this
        };
Run Code Online (Sandbox Code Playgroud)