在WebView和主机应用程序之间传递数据

时间:2016-09-20 01:56:11

标签: c# xamarin webview xamarin.forms

我开始开发连接到网络项目的移动应用程序,让患者记下他们的出血情况。在网络上,用户可以点击并选择几个人物上的某些地方。有一些选择的人看起来像这样

enter image description here

我真的不认为使用标准控件(?)很容易实现,所以我认为最容易使用WebView来托管处理选择的代码片段。< / p>

要设置位置,例如当用户想要编辑旧的流血时,我可以按照Xamarin指南来了解如何从C#调用JS,但是,返回值是无效的。我无法找到如何从Xamarin.Forms.WebView获取数据的方法。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

这在很大程度上取决于您尝试定位的平台和平台版本。

如果你真的想使用WebView,你可以查看我认为类似的XLabs Hybrid WebView

除了XLabs&#39;方法,您可以使用UIWebView.EvaluateJavascript()方法从iOS渲染器轻松获取字符串,然后您可以在Xamarin Android WebChromClient.OnJsAlert渲染器(link)中覆盖WebView,我已经成功使用了Android 4.1。

类似的东西(让我知道如果某些东西不起作用或丢失,我输入并删除了额外的代码,因此可能会出现小问题)......

Xamarin表单代码:

public class SomethingWebView : WebView { }

带有UIWebViewDelegate的iOS WebView渲染器:

[assembly: Xamarin.Forms.ExportRenderer(typeof(SomethingWebView), typeof(Your.Droid.Namespace.SomethingWebViewRenderer))]

namespace Your.Droid.Namespace.Renderer {

public class SomethingWebViewRenderer : WebViewRenderer {

    protected override void OnElementChanged(VisualElementChangedEventArgs e) {
        base.OnElementChanged(e);

        if(e.OldElement == null) {
            Delegate = new SomethingWebViewDelegate();
        }
    }
}

internal class SomethingWebViewDelegate : UIWebViewDelegate {

    public override void LoadingFinished(UIWebView webView) {
        string something = webView.EvaluateJavascript("(function() { return 'something'; })()");
    }
}
}

带有WebViewClientWebChromeClient的Android WebView渲染器:

[assembly: Xamarin.Forms.ExportRenderer(typeof(SomethingWebView), typeof(Your.iOS.Namespace.SomethingWebViewRenderer))]

namespace Your.iOS.Namespace.Renderer {

public class SomethingWebViewRenderer : WebViewRenderer {

    protected override void OnElementChanged(ElementChangedEventArgs<WebView> e) {

        base.OnElementChanged(e);

        if(e.OldElement == null) {

            Control.Settings.JavaScriptEnabled = true;

            Control.SetWebViewClient(new SomethingWebViewClient());

            Control.SetWebChromeClient(new SomethingWebChromeClient());
        }
    }
}

internal class SomethingWebViewClient : WebViewClient {

    public override void OnPageFinished(Android.Webkit.WebView view, string url) {
        base.OnPageFinished(view, url);

        view.LoadUrl("javascript:{(function() { window.alert('something'); })()};");
    }
}

public class SomethingWebChromeClient : WebChromeClient {

    public override bool OnJsAlert(Android.Webkit.WebView view, string url, string message, JsResult result) {

        if(message.StartsWith("something") { //This is where you would look for your magic string, anything starting with your magic string is what you would extract and/or act on
            //Do something....

            result.Cancel(); //This cancels the JS alert (there are other talked about methods of doing this but this works for me)
            return true; //This tells the WebView "we got this"
        }

        return base.OnJsAlert(view, url, message, result); //Let the WebView handle this since we did not find out special string
    }
}
}

最后,我看到的另一个方法是使用JavaScript将页面重定向到新的URL,然后在用于告诉WebView是否应该继续使用重定向的事件中,您拉出WebView&# 39;当前的URL,如果找到你的魔法字符串,你会做一些事情。这可能会很有效,除了URL只能长度为255个字符,因此它不能满足我的需求。