sroeper Ответов: 0

Обмен данными между 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

0 Ответов