Führen Sie in der nativen Xamarin.Forms Gawa-App die Anforderungsantwort von C # an die JavaScript-Aufgabe <T> aus

Es ist ein Memo, also ist es verschieden.

Szenario

--Xamarin.Forms + WebView (HTML, JavaScript SPA) Gawa native App

fließen

    1. [Formularseite] Aktion <TaskCompletionSource <bool >> OnRequestIsEnableBackKey {get; set;}
  1. [Formularseite] Erweitern Sie in WebViewEx (erweiterte Version von WebView) auch Task <bool> IsEnableBackKeyAsync (). Die Implementierung ist wie folgt.

public Task<bool> IsEnableBackKeyAsync()
{
    var comp = new TaskCompletionSource<bool>();

    if (OnRequestIsEnableBackKey != null)
    {
        OnRequestIsEnableBackKey.Invoke(comp);
    }
    else
    {
        comp.SetResult(false);
    }

    return comp.Task;
}
    1. [Android-Seite] Erstellen Sie MyWebViewRenderer, eine Erweiterung von WebViewRenderer.

Vier. Erstellen Sie einen JavaScriptHandler unter Verknüpfen von JavaScript mit WebView von Xamarin.Forms (mit iOS / Android) - Qiita. Übergeben Sie zusätzlich zu Control im Konstruktor "e.NewElement as WebViewEx". Der Name des Arguments lautet "WebViewEx Outer". Das zweite Argument von AddJavascriptInterface sollte "GawaApp" sein.

Fünf. Schreiben Sie den Code zum Empfangen von OnRequestIsEnableBackKey in den Konstruktor von JavaScriptHandler.

private TaskCompletionSource<bool> isEnableBackKeyComp = null;

public JavaScriptHandler(Android.Webkit.WebView webView, WebViewEx outer)
{
    outer.OnRequestIsEnableBackKey = comp => 
    {
        isEnableBackKeyComp = comp;

        //Fehler, wenn nicht vom Hauptthread aufgerufen
        webView.Post(() =>
        {
            webView.EvaluateJavascript("window.requestIsEnableBackKey()", null);
            // webView.LoadUrl("javascript:window.requestIsEnableBackKey();");← Das ist noch OK
        });
    };
}

Wenn bisher webViewEx.IsEnableBackKeyAsync () auf der Formularseite aufgerufen wird, wird die JavaScript-Funktion window.requestIsEnableBackKey () aufgerufen.

  1. Generieren Sie onResultCanExitApp in JavaScriptHandler. Diese Methode wird von der JavaScript-Seite über das Ergebnis informiert. wie folgt.
[Export]
[Android.Webkit.JavascriptInterface]
public void onResultIsEnableBackKey(bool value)
{
    isEnableBackKeyComp?.SetResult(value);
    isEnableBackKeyComp = null; // one shot
}

Das Aufrufen von GawaApp.onResultIsEnableBackKey (true oder false) auf der JavaScript-Seite ruft diese Methode zurück. Wenn Sie einen Wert auf isEnableBackKeyComp setzen, bei dem es sich um eine TaskCompletionSource handelt, wird das Ergebnis von wait webViewEx.IsEnableBackKeyAsync () auf der Forms-Seite zurückgegeben.

    1. Die JavaScript-Seite ist sicherlich so
window.requestIsEnableBackKey = () => {
  
  //Etwas verarbeiten

  GawaApp.onResultIsEnableBackKey(true or false);
}

Ich habe es zur Hälfte implementiert, aber ich habe es beendet, weil es problematisch war (ich dachte, dass unidirektional von JavaScript zu C # einfacher ist), also werde ich nur die Idee belassen.

Recommended Posts

Führen Sie in der nativen Xamarin.Forms Gawa-App die Anforderungsantwort von C # an die JavaScript-Aufgabe <T> aus
Ich habe versucht, Hello World (+ α) in C-Sprache aus JavaScript [Web Assembly] zu verschieben.
Ich habe versucht, innerhalb von 3 Monaten einen Antrag von unerfahren zu stellen