Javascript 和 C# 之间的 Xamarin iOS 通信 [英] Xamarin iOS communication between Javascript and c#

查看:18
本文介绍了Javascript 和 C# 之间的 Xamarin iOS 通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

webView.ShouldStartLoad = myHandler;bool myHandler (UIWebView webView, NSUrlRequest 请求, UIWebViewNavigationType navType){}

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

window.location.href = "myapp://action?par1=abc&par2=def";

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

从 C# 调用 JavaScript

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

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

JavaScript 端我有一个警报,但没有显示该警报

function TestShow(){alert("你好!我是一个提示框!!");}

解决方案

您可以继续使用 UIWebView 并解析 NSUrlRequest 以查看它是否是您要查找的调用.然后相应地返回真/假.

更好的选择是使用 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);}}

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

 var userController = new WKUserContentController();userController.AddScriptMessageHandler(this, "myapp");

3) 使用控制器创建配置

 var config = new WKWebViewConfiguration{用户内容控制器 = 用户控制器};

4) 使用配置创建 WKWebView

var webView = new WKWebView(new CGRect(10, 100, 500, 500), config);

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

 <html><head><meta charset = "utf-8"/></head><body><button onclick="callCsharp()">点击</button>"<script type="text/javascript">函数 callCsharp(){

<块引用>

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

 }</script></body></html>";

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

public class UniversalView : UIView, IWKScriptMessageHandler, IWKNavigationDelegate{[导出("webView:didFinishNavigation:")]public void DidFinishNavigation(WKWebView webView, WKNavigation navigation){webView.EvaluateJavaScript("callCsharp()", (result, error) =>{if (error != null) Console.WriteLine(error);});}

将其分配给您创建的 WKWebView:

 var webView = new WKWebView(new CGRect(10, 100, 500, 500), config){WeakNavigationDelegate = 这个};

We are implementing an app where we have communication between Javascript and c#. Our UIWebView has a button to invoke some native functionality. On a UIWebView i have an handler on ShouldStartLoad.

webView.ShouldStartLoad = myHandler; 
bool myHandler (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navType)
{
}

This gets called everytime page loads. Indeed, i would like to only call it from an event from WebView such as on a button click. From Javascript i have

window.location.href = "myapp://action?par1=abc&par2=def";

How to call a particular function from custom url?

Calling JavaScript from c#

I am trying to call back JavaScript from c# but it is not calling TestShow() function

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

JavaScript side i have a Alert but it is not showing that alert

function TestShow()
{
    alert("Hello! I am an alert box!!");
}

解决方案

You can either continue using UIWebView and parse the NSUrlRequest to see if it is the call you're looking for. Then return true/false accordingly.

A better option would be to use WKWebView and create a custom message handler. Something like this:

1) Implement IWKScriptMessageHandler (tested on the default UIView created by Xamarin UIViewController)

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

2) Create user controller with a handler for "myapp" (this = the IWKScriptMessageHandler)

        var userController = new WKUserContentController();
        userController.AddScriptMessageHandler(this, "myapp");

3) Create a config with the controller

        var config = new WKWebViewConfiguration
        {
            UserContentController = userController
        };

4) Create the WKWebView with the config

var webView = new WKWebView(new CGRect(10, 100, 500, 500), config);

5) Call "myapp" from your JS code

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

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

                 }</script></body></html>";

EDIT: In regards to evaluating JS from C# you need to be sure the HTML page has finished loading or otherwise the call will result in an error. You can handle navigation events by implementing 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);
        });
    }

Assign it to the WKWebView you created:

        var webView = new WKWebView(new CGRect(10, 100, 500, 500), config)
        {
            WeakNavigationDelegate = this
        };

这篇关于Javascript 和 C# 之间的 Xamarin iOS 通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆