javascript - Javascript 和 c# 之间的 Xamarin iOS 通信

标签 javascript c# xamarin.ios

我们正在实现一个应用程序,我们可以在其中进行 Javascript 和 C# 之间的通信。我们的 UIWebView 有一个按钮来调用一些 native 功能。在 UIWebView 上,我在 ShouldStartLoad 上有一个处理程序。

webView.ShouldStartLoad = myHandler; 
bool myHandler (UIWebView webView, NSUrlRequest request, 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("Hello! I am an alert box!!");
}

最佳答案

您可以继续使用 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”的处理程序创建用户 Controller (this = IWKScriptMessageHandler)

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

3) 使用 Controller 创建配置

        var config = new WKWebViewConfiguration
        {
            UserContentController = userController
        };

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()">Click</button>"
            <script type="text/javascript">
                function callCsharp(){ 

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

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

编辑:关于从 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);
        });
    }

将其分配给您创建的 WKWebView:

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

关于javascript - Javascript 和 c# 之间的 Xamarin iOS 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36559483/

相关文章:

c# - <identity impersonate ="true"/>的正确使用

ios - Xamarin 表单 IOS 项目调试不工作

visual-studio - 如何(实际上)在 MonoTouch 中重用现有的 .NET 库

javascript - 禁止/踢出命令在使用时崩溃

c# - 如何在 ASP.Net MVC 5 中跟踪匿名用户的事件?

javascript - 通过将自定义指令分配给 Controller 范围来动态加载自定义指令

c# - 如何使用 gRPC 工具生成代码

c# - Xamarin iOS 更改一些 map 图钉的颜色

javascript - 何时使用 jQuery-ui 插件 vs Backbone View?

javascript - ie7、ie8 和 firefox 3.6 中的脚本错误