我们正在实施一个应用程序,我们在Javascript和c#之间进行通信。我们的UIWebView有一个按钮来调用一些本机功能。在UIWebView上,我在ShouldStartLoad上有一个处理程序。
webView.ShouldStartLoad = myHandler;
bool myHandler (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navType)
{
}
每次页面加载时都会调用它。实际上,我只想从WebView的事件中调用它,例如点击按钮。 来自Javascript我有
window.location.href = "myapp://action?par1=abc&par2=def";
如何从自定义网址调用特定功能?
从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!!");
}
答案 0 :(得分: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);
}
}
2)使用“myapp”的处理程序创建用户控制器(this = IWKScriptMessageHandler)
var userController = new WKUserContentController();
userController.AddScriptMessageHandler(this, "myapp");
3)使用控制器创建配置
var config = new WKWebViewConfiguration
{
UserContentController = userController
};
4)使用config
创建WKWebViewvar 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( “动作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
};