我们正在实现一个应用程序,我们可以在其中进行 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/