【问题标题】:JavascriptInterface in Xamarin.Android is obsolete and cant invoke C# from JavascriptXamarin.Android 中的 JavascriptInterface 已过时,无法从 Javascript 调用 C#
【发布时间】:2019-11-06 23:04:53
【问题描述】:

几个月前,我有一个自定义 Xamarin.Android 渲染器,用于基于示例代码的 web 视图 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview

Javascript 代码完美地调用了我的 C# 代码,但是最近在最新更新之后,WebView 控件不再能够调用 C# 操作, (更准确地说,如果我的目标是 Android 9.0(API 级别 28)或更高版本) 使用 API 级别 27 仍然可以正常工作

经过更多调查,我发现编译器在 [JavascriptInterface] 已过时发出警告! https://docs.microsoft.com/en-us/dotnet/api/android.webkit.javascriptinterface?view=xamarin-android-sdk-9 他们建议改用(IJavascriptInterface)

这里是要审查的代码

[JavascriptInterface]
[Export ("invokeAction")]
public void InvokeAction (string data)
{
    HybridWebViewRenderer hybridRenderer;
    if (hybridWebViewRenderer != null && hybridWebViewRenderer.TryGetTarget (out hybridRenderer))
    {
        hybridRenderer.Element.InvokeAction (data);
    }
}

有谁知道如何正确地实现这个来解决这个问题并让 Javascript 再次调用我的 C# 代码。

【问题讨论】:

  • 错误 CS0653:无法应用属性类“IJavascriptInterface”,因为它是抽象的 (CS0653) (CustomRenderer.Droid)
  • docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/… 中的示例 HTML 在 Android 9 及更高版本上存在问题 - <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script> 实际上应该是 <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>。 https很重要,否则Android会拒绝加载jquery,导致javascript失效。当我的所有渲染器实际上都已经正常工作时,我花了半天时间才发现这是真正的问题。

标签: xamarin xamarin.android custom-renderer


【解决方案1】:

它仍然可以在我的 Xamarin.Android 项目中使用 [JavascriptInterface]

这是我的示例的一部分:

var webview = FindViewById<WebView>(Resource.Id.webView1);
WebSettings settings = webview.Settings;
settings.JavaScriptEnabled = true;
// load the javascript interface method to call the foreground method
webView.AddJavascriptInterface(new MyJSInterface(this), "CSharp");
webview.SetWebViewClient(new WebViewClient());

MyJSInterface 类:

class MyJSInterface : Java.Lang.Object
{
  Context context;

 public MyJSInterface (Context context)
  {
    this.context = context;
  }

 [JavascriptInterface]
 [Export]
 public void ShowToast (string msg)
  {
    Toast.MakeText(context, msg, ToastLength.Short).Show();
  }
}

在 html 中:

<button type="button" onClick="CSharp.ShowToast ('Call C#')">Call C#</button>

您可以参考https://stackoverflow.com/a/54069075/10768653

【讨论】:

  • 感谢您的回复;更准确地说,它适用于 Android 8.1(API 级别 27)或更低版本。但如果您尝试针对 Android 9(API 级别 28)或更高版本,它将无法工作
  • 我用 Android 9 测试它。它在我的 Xamarin.Android 项目中工作,我稍后将在 Xamarin.Forms 项目中测试,并告诉你结果。
  • 谢谢,我正在使用 Xamarin.Forms (4.3.0.947036)
  • @Abdula 我在 Xamarin.Forms 项目中测试它,上面的代码也可以工作
  • @Abdul 别担心,正如IJavascriptInterface 所说。允许向 JavaScript 公开方法的注解。[JavascriptInterface] 是注解
猜你喜欢
  • 1970-01-01
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
相关资源
最近更新 更多