Обмен данными между webview и приложением
Привет,
мы разработали приложение для размещения HTML5-приложений в компоненте WebView. Приложение разработано в Xamarin, но работает только на Android.
Мы внедрили WeViewRenderer:
public class HybridWebViewRenderer_Droid : ViewRenderer<HybridWebView, Android.Webkit.WebView> { protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e) { base.OnElementChanged(e); if (Control == null) { var webView = new MyWebView(Forms.Context); SetNativeControl(webView); } Control.SetWebViewClient(new MyWebViewClient(this)); Control.SetWebChromeClient(new MyWebChromeClient()); Control.AddJavascriptInterface(new JSBridge(), "jsBridge"); } }
С веб-видом, как:
public sealed class MyWebView : Android.Webkit.WebView { private const string STR_JS_FIND_FUNCTION_FRAME_BCDRECEIVER = "javascript:if(true==Object.getOwnPropertyNames(this).toString().includes('OnBarcodeReceived')) OnBarcodeReceived('{0}'); else alert('{1}');"; private static BarcodeReceivedHandler _barcodeReceivedEvent; ..... public MyWebView(Context context) : base(context) { Settings.JavaScriptEnabled = true; Settings.DomStorageEnabled = true; Settings.LoadWithOverviewMode = true; Settings.UseWideViewPort = true; Settings.BuiltInZoomControls = false; Settings.DisplayZoomControls = false; Settings.SetPluginState(WebSettings.PluginState.On); Settings.AllowContentAccess = true; Settings.CacheMode = CacheModes.NoCache; Settings.SetAppCacheEnabled(false); Focusable = true; FocusableInTouchMode = true; RequestFocus(FocusSearchDirection.Down); _barcodeReceivedEvent = ScanReceived; } ....... private void ScanReceived(IBarcodeDataPackage bdp) { try { string para = bdp.ToJSON(); string js = string.Format(STR_JS_FIND_FUNCTION_FRAME_BCDRECEIVER, para, "Diese Seite verabeitet keine Barcodes!"); Device.BeginInvokeOnMainThread(() => { if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Kitkat) { EvaluateJavascript(js, null); } else { LoadUrl(js); } }); } catch(System.Exception ex) { } } }
Метод ScanReceived вызывается, когда намерение получено от встроенного сканера штрих-кодов (промышленного устройства).
В части JavaScrip этого приложения реализован такой метод:
function OnBarcodeReceived(value){ var bc = JSON.parse(value); if(null==bc){ alert("Parameter kann nicht interpretiert werden!"); return; } var data = bc.Data; if((null==data)||(""==data)){ alert("Barcodestruktur ohne Daten!"); return; } document.getElementById('CodeType').innerHTML = bc.BarcodeType; document.getElementById('ScanValue').innerHTML = data; }
Это прекрасно работало с Chrome v70.0.3538.110, но под Crome 84.0.4147.125
вызов EvaluatJavascript или LoadUrl будет переезжен, и nothi9ng произойдет.
Есть ли еще один компонент, который я могу использовать, который интерпретирует HTML5 без системного HTML-движка по умолчанию?
Или же система может быть сконфигурирована / запрограммирована для работы с фактической версией?
Приложение HTML5 поставляется из локального каталога. Нет никакого публичного доступа или связи с сервером.
Что я уже пробовал:
В производительном коде мы используем журнал, который показывает, что код c# работает как ожидалось и без ошибок. Просто вызов EvaluateJavascript больше не влияет на Javascript