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
Nachdem der Server, auf dem sich Docker befindet,...
Inhaltsverzeichnis 1. Einführung in Gojs 2. Gojs ...
brauchen: Identische Elemente eines Feldes zusamm...
1. Verwenden Sie den folgenden Befehl, um das SSH...
1. Prüfen Sie, ob Port 80 belegt ist. Normalerwei...
Der Dokumentmodus verfügt über die folgenden zwei ...
Inhaltsverzeichnis 1. Vorverarbeitung 2. Vorbehan...
Eine einfache Nummernschild-Eingabekomponente (vu...
Manchmal möchten wir nicht, dass der Inhalt unser...
Inhaltsverzeichnis Vorwort Was ist VueUse Einfach...
In diesem Artikel finden Sie das grafische Tutori...
Nachdem Sie Docker auf dem Linux-Server installie...
1. Quellcode entwerfen Code kopieren Der Code laut...
Inhaltsverzeichnis Hintergrund DHCP konfigurieren...
Inhaltsverzeichnis Der erste Der Zweite Native Js...