Die APP unseres Unternehmens ist eine typische hybride Entwicklungs-APP, die Front-End-Seiten einbettet. Um den gleichen Effekt wie die nativen Seiten zu erzielen, können die Front-End-Seiten nicht umhin, einige native Methoden aufzurufen. js aufrufende Methode Schauen wir uns an, wie
Wenn Sie dann eine native Methode aufrufen möchten, können Sie die folgende Funktion verwenden: Funktion native (Funktionsname, Argumente = {}, Rückruffunktion, Fehlerrückruffunktion) { // Überprüfen Sie, ob die Parameter gültig sind, wenn (args && typeof args === 'object' && Object.prototype.toString.call(args).toLowerCase() === '[object object]' && !args.length) { args = JSON.stringify(args); } anders { throw new Error('args entspricht nicht der Spezifikation'); } // Feststellen ob es sich um eine Mobiltelefonumgebung handelt if (getIsMobile()) { //Rufen Sie die Methode callHandler des Objekts window.WebViewJavascriptBridge auf window.WebViewJavascriptBridge.callHandler( Funktionsname, Argumente, (res) => { res = JSON.parse(res); wenn (res.code === 0) { gibt Rückruffunktion (res) zurück; } anders { gibt errorCallbackFunc(res) zurück; } } ); } } Geben Sie einfach den Methodennamen, die Parameter und den aufzurufenden Rückruf ein. Zuerst werden die Parameter überprüft und dann die Methode Darüber hinaus können Rückrufe für native Aufrufe bereitgestellt werden:
Schauen wir uns als Nächstes an, was Android Die Datei // Variable definieren var messagingIframe; var sendMessageQueue = [];// Warteschlange zum Senden von Nachrichten var receiveMessageQueue = [];// Warteschlange zum Empfangen von Nachrichten var messageHandlers = {};// Nachrichtenhandler var CUSTOM_PROTOCOL_SCHEME = 'yy';// Benutzerdefiniertes Protokoll var QUEUE_HAS_MESSAGE = '__QUEUE_MESSAGE__/'; var responseCallbacks = {}; // Antwort-Rückruf var uniqueId = 1; Ich habe es einfach entsprechend dem Variablennamen übersetzt und die spezifische Verwendung wird als Nächstes analysiert. Als nächstes wird das var WebViewJavascriptBridge = Fenster.WebViewJavascriptBridge = { init: init, senden: senden, registerHandler: registerHandler, callHandler: callHandler, _fetchQueue: _fetchQueue, _handleMessageFromNative: _handleMessageFromNative }; Sie können sehen, dass es sich um ein gewöhnliches Objekt handelt, an das einige Methoden angehängt sind. Ich werde mir die spezifischen Methoden jetzt nicht ansehen und weiter unten fortfahren: var doc = Dokument; _createQueueReadyIframe(doc); Die Methode Funktion _createQueueReadyIframe (Dokument) { MessagingIframe = doc.createElement('iframe'); MessagingIframe.style.display = "keine"; doc.documentElement.appendChild(messagingIframe); } Diese Methode ist sehr einfach. Erstellen Sie einfach ein verstecktes // Erstellen Sie ein Ereignisobjekt vom Typ „Events“ (grundlegendes Ereignismodul). var readyEvent = doc.createEvent('Events'); // Definieren Sie den Ereignisnamen als WebViewJavascriptBridgeReady readyEvent.initEvent('WebViewJavascriptBridgeReady'); //Lösen Sie das Ereignis durch documentdoc.dispatchEvent(readyEvent) aus. Hier wird ein benutzerdefiniertes Ereignis definiert und direkt gesendet. Andere Stellen können auf dieses Ereignis genauso hören wie auf native Ereignisse: document.addEventListener( "WebViewJavascriptBridgeReady", Funktion () { Konsole.log(Fenster.WebViewJavascriptBridge) }, FALSCH ); Der Zweck hier besteht meines Wissens darin, dass, wenn die Die selbstausführende Funktion endet hier. Als nächstes schauen wir uns die anfängliche Funktion init (messageHandler) { wenn (WebViewJavascriptBridge._messageHandler) { throw new Error('WebViewJavascriptBridge.init zweimal aufgerufen'); } // Beim Aufruf von init werden keine Parameter übergeben, daher messageHandler=undefined WebViewJavascriptBridge._messageHandler = NachrichtenHandler; // Derzeit ist „receiveMessageQueue“ nur ein leeres Array, var „receiveMessages“ = „receiveMessageQueue“; receiveMessageQueue = null; für (var i = 0; i < empfangeneNachrichten.Länge; i++) { _dispatchMessageFromNative(empfangeneNachrichten[i]); } } Aus Initialisierungsperspektive scheint diese Funktion CallHandler (HandlerName, Daten, AntwortCallback) { _doSend({ handlerName: handlerName, Daten: Daten }, Antwortrückruf); } Nach der Verarbeitung der Parameter wird die Methode Funktion _doSend (Nachricht, Antwort-Callback) { // Wenn ein Rückruf bereitgestellt wird if (responseCallback) { // Eine eindeutige Callback-ID generieren var callbackId = 'cb_' + (uniqueId++) + '_' + neues Date().getTime(); // Der Rückruf wird im responseCallbacks-Objekt mit der ID responseCallbacks[callbackId] = responseCallback gespeichert. // Fügen Sie der an die native Nachricht zu sendenden Nachricht die Rückruf-ID hinzu message.callbackId = callbackId; } //Nachricht zur Nachrichtenwarteschlange hinzufügen sendMessageQueue.push(message); messagingIframe.src = BENUTZERDEFINIERTES PROTOKOLL_SCHEME + '://' + QUEUE_HAS_MESSAGE; } Diese Methode generiert beim Aufruf der nativen Methode zunächst eine eindeutige { Handlername, Daten, Rückruf-ID } Fügen Sie dann die Funktion _fetchQueue () { // Konvertieren Sie die Nachrichtenwarteschlange, die wir senden möchten, in eine Zeichenfolge var messageQueueString = JSON.stringify(sendMessageQueue); // Nachrichtenwarteschlange löschen sendMessageQueue = []; // Android kann die zurückgegebenen Daten nicht direkt lesen und kommuniziert daher weiterhin über die Quelle des Iframes mit Java: messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://return/_fetchQueue/' + encodeURIComponent(messageQueueString); } Nachdem Android Funktion _handleMessageFromNative (messageJSON) { // Gemäß der Logik der vorherigen Init-Methode wissen wir, dass receiveMessageQueue auf null gesetzt wird, also gehen wir zum else-Zweig if (receiveMessageQueue) { : receiveMessageQueue.push(messageJSON); } anders { _dispatchMessageFromNative(messageJSON); } } Sehen Sie sich an, was die Methode Funktion _dispatchMessageFromNative (messageJSON) { setzeTimeout(Funktion () { // Die ursprünglich zurückgesendete Nachricht ist vom Typ String und wurde in JSON konvertiert. var Nachricht = JSON.parse(messageJSON); var Antwortrückruf; // Der Java-Aufruf ist abgeschlossen und die zurückgesendete Antwort-ID ist die Callback-ID, die wir zuvor gesendet haben. wenn (Nachricht.Antwort-ID) { // Holen Sie die mit der ID verknüpfte Rückrufmethode aus dem ResponseCallbacks-Objekt responseCallback = responseCallbacks[message.responseId]; wenn (!responseCallback) { zurückkehren; } // Rückruf ausführen, js ruft die Android-Methode auf und empfängt erfolgreich die Nachricht responseCallback(message.responseData); lösche responseCallbacks[message.responseId]; } anders { // ... } }); } Funktion _dispatchMessageFromNative (messageJSON) { setzeTimeout(Funktion () { wenn (Nachricht.Antwort-ID) { // ... } anders { // So wie die Nachricht, die wir an den Native senden, eine ID haben kann, kann auch die Nachricht, die der Native an uns sendet, eine ID haben, und der Native intern wird dieser ID auch einen Rückruf zuordnen, wenn (message.callbackId) { var callbackResponseId = Nachricht.callbackId; //Wenn das Frontend dem nativen Gerät antworten muss, sollte es die zuvor vom nativen Gerät gesendete ID enthalten, damit das native Gerät den entsprechenden Rückruf über die ID finden und ausführen kann. responseCallback = function (responseData) { _doSend({ Antwort-ID: Rückruf-Antwort-ID, Antwortdaten: Antwortdaten }); }; } // Wir haben keinen Standard-_messageHandler festgelegt, daher ist er undefiniert var Handler = WebViewJavascriptBridge._messageHandler; // Die gesendete Nachricht enthält nativ den Namen der Verarbeitungsmethode if (message.handlerName) { // Über den Methodennamen ermitteln, ob im messageHandlers-Objekt eine entsprechende Verarbeitungsmethode vorhanden ist handler = messageHandlers[message.handlerName]; } versuchen { //Führen Sie die Verarbeitungsmethode handler(message.data, responseCallback) aus. } Fang (Ausnahme) { if (Typ der Konsole !== 'undefiniert') { console.log('WebViewJavascriptBridge: WARNUNG: JavaScript-Handler hat ausgelöst.', Meldung, Ausnahme); } } } }); } Wenn wir beispielsweise das native Return-Tastenereignis abhören möchten, registrieren wir es zuerst über die Methode des Fenster.WebViewJavascriptBridge.registerHandler('onBackPressed', () => { // Tu etwas... }) Funktion registerHandler (HandlerName, Handler) { messageHandlers[handlerName] = handler; } Es ist ganz einfach. Wir speichern den Ereignisnamen und die Methode, die wir überwachen möchten, im Objekt { Handlername: „onBackPressed“ } Auf diese Weise können wir die Funktion finden, die wir über An diesem Punkt ist die Logik der gegenseitigen Aufrufe zwischen 1.js ruft native Generieren Sie eine eindeutige 2. Nativer Aufruf von js Zuerst muss das Frontend die zu überwachenden Ereignisse im Voraus registrieren, den Ereignisnamen und den Rückruf speichern, und dann ruft der Native zu einem bestimmten Zeitpunkt die angegebene Methode Wie Sie sehen, ist die Logik sowohl auf ios var CUSTOM_PROTOCOL_SCHEME_IOS = "https"; var QUEUE_HAS_MESSAGE_IOS = '__wvjb_queue_message__'; Wenn var BRIDGE_LOADED_IOS = "__bridge_loaded__"; Funktion _createQueueReadyIframe (Dokument) { MessagingIframe = doc.createElement('iframe'); MessagingIframe.style.display = "keine"; wenn (istIphone()) { // Dies sollte die Brücke sein, die iOS zuerst laden muss messagingIframe.src = CUSTOM_PROTOCOL_SCHEME_IOS + '://' + BRIDGE_LOADED_IOS; } doc.documentElement.appendChild(messagingIframe); } Wenn Funktion _fetchQueue () { var messageQueueString = JSON.stringify(sendMessageQueue); sendMessageQueue = []; return messageQueueString; // Direkt zurückkehren, ohne über Iframe zu gehen } Alles andere ist gleich. Zusammenfassen Dieser Artikel analysiert den Quellcode von Dies ist das Ende dieses Artikels über das Erlernen des Betriebsmechanismus von jsBridge in einem Artikel. Weitere relevante Inhalte zum Betriebsmechanismus von jsBridge finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
>>: Zusammenfassung gängiger Befehle für den Einstieg in die MySQL-Datenbankgrundlagen
Reagieren Sie auf mehrere Arten, um den Wert des ...
Offizielle Dokumentation: JSON-Funktionen Name Be...
1. Konstruktion 1. Bereiten Sie die Datei htpassw...
Gängige Methoden zur Begrenzung der Eingabe 1. Um ...
Tatsächlich ist dieses Problem bereits aufgetreten...
Als ich die CPP-Datei zum ersten Mal mit G++ komp...
Ich stelle hauptsächlich vor, wie man im WeChat-A...
Ergebnisse erzielen Implementierungscode html <...
Inhaltsverzeichnis 1. Einführung in PXC 1.1 Einfü...
Indextypen in MySQL Im Allgemeinen können sie in ...
Inhaltsverzeichnis Vorwort 1. Eine Zeichenfolge t...
MySQL 8.0 für Windows v8.0.11 offizielle kostenlo...
In diesem Artikelbeispiel wird der spezifische Co...
Kürzlich ist beim Starten von MySQL ein Fehler au...
Ein Docker-Container startet beim Start beispiels...