当社のアプリは、フロントエンド ページを埋め込んだ典型的なハイブリッド開発アプリです。ネイティブ ページと同じ効果を実現するには、フロントエンド ページからネイティブ メソッドを呼び出す必要があります。jsBridge js 呼び出しメソッド
ネイティブ メソッドを呼び出す場合は、次の関数を使用できます。 関数ネイティブ (funcName, args = {}, callbackFunc, errorCallbackFunc) { // パラメータが有効かどうかを確認します if (args && typeof args === 'object' && Object.prototype.toString.call(args).toLowerCase() === '[object object]' && !args.length) { args = JSON.stringify(args); } それ以外 { throw new Error('args は仕様に準拠していません'); } // 携帯電話環境かどうかを判定する if (getIsMobile()) { //window.WebViewJavascriptBridgeオブジェクトのcallHandlerメソッドを呼び出す window.WebViewJavascriptBridge.callHandler( 関数名、 引数、 (res) => { 文字列を JSON に変換します。 (res.code === 0)の場合{ callbackFunc(res) を返します。 } それ以外 { errorCallbackFunc(res) を返します。 } } ); } } メソッド名、パラメータ、および呼び出されるコールバックを渡すだけです。最初にパラメータを検証し、次に さらに、ネイティブ呼び出しに対してコールバックを提供することもできます。
次に、 アンドロイド
// 変数 varmessagingIframe を定義します。 var sendMessageQueue = [];// メッセージを送信するためのキュー var receivedMessageQueue = [];// メッセージを受信するためのキュー var messageHandlers = {};// メッセージ ハンドラー var CUSTOM_PROTOCOL_SCHEME = 'yy';// カスタム プロトコル var QUEUE_HAS_MESSAGE = '__QUEUE_MESSAGE__/'; var responseCallbacks = {}; // レスポンスコールバック var uniqueId = 1; 変数名に従って単純に翻訳しましたが、具体的な使用方法は次に分析します。次に、 var WebViewJavascriptBridge = window.WebViewJavascriptBridge = { 初期化: 初期化、 送信: 送信、 レジスタハンドラ: レジスタハンドラ、 コールハンドラ: コールハンドラ、 _fetchQueue: _fetchQueue、 _handleMessageFromNative: _handleMessageFromNative }; これは、いくつかのメソッドがマウントされた通常のオブジェクトであることがわかります。ここでは特定のメソッドについては説明しません。以下に続けます。 var doc = ドキュメント; _createQueueReadyIframe(doc); 関数 _createQueueReadyIframe (ドキュメント) { メッセージングIframe = doc.createElement('iframe'); メッセージングIframe.style.display = 'なし'; doc.documentElement.appendChild(メッセージングIframe); } この方法は非常に簡単で、隠し // Events タイプのイベント オブジェクトを作成します (基本イベント モジュール) var readyEvent = doc.createEvent('Events'); // イベント名をWebViewJavascriptBridgeReadyとして定義します readyEvent.initEvent('WebViewJavascriptBridgeReady'); //documentdoc.dispatchEvent(readyEvent); を通じてイベントをトリガーします。 ここでカスタム イベントが定義され、直接ディスパッチされます。他の場所でも、ネイティブ イベントをリッスンするのと同じように、このイベントをリッスンできます。 ドキュメント.addEventListener() 'WebViewJavascriptBridgeReady'、 関数 () { コンソールログ(window.WebViewJavascriptBridge) }, 間違い ); ここでの目的は、私が理解している限りでは、 自己実行関数はここで終了します。次に、初期の 関数 init (messageHandler) { (WebViewJavascriptBridge._messageHandler) の場合 { 新しいエラーをスローします('WebViewJavascriptBridge.init が 2 回呼び出されました'); } // init が呼び出されたときにパラメータが渡されないため、messageHandler=undefined WebViewJavascriptBridge._messageHandler = messageHandler; // 現在、receiveMessageQueue は単なる空の配列です var receivedMessages = receivedMessageQueue; 受信メッセージキュー = null; (var i = 0; i < receivedMessages.length; i++) の場合 { _dispatchMessageFromNative(受信したメッセージ[i]); } } 初期化の観点から見ると、この 関数 callHandler (ハンドラ名、データ、レスポンスコールバック) { _doSend({ ハンドラー名: ハンドラー名、 データ: データ }, レスポンスコールバック); } パラメータを処理した後、 関数_doSend(メッセージ、レスポンスコールバック){ // コールバックが提供されている場合 if (responseCallback) { // 一意のコールバックIDを生成する var callbackId = 'cb_' + (uniqueId++) + '_' + 新しい Date().getTime(); // コールバックは、ID によって responseCallbacks オブジェクトに保存されます。 responseCallbacks[callbackId] = responseCallback; // ネイティブに送信するメッセージにコールバック ID を追加します。message.callbackId = callbackId; } //メッセージをメッセージキューに追加します sendMessageQueue.push(message); メッセージングIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE; } このメソッドは、ネイティブ メソッドを呼び出すときに、まずコールバック関数の一意の { ハンドラー名、 データ、 コールバックID } 次に、最初に定義した 関数_fetchQueue(){ // 送信するメッセージ キューを文字列に変換します。var messageQueueString = JSON.stringify(sendMessageQueue); // メッセージキューをクリアします。 sendMessageQueue = []; // Android は返されたデータを直接読み取ることができないため、iframe の src を介して Java と通信します。messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://return/_fetchQueue/' + encodeURIComponent(messageQueueString); } Android は 関数_handleMessageFromNative(messageJSON) { // 前の init メソッドのロジックによれば、receiveMessageQueue は null に設定されるため、else ブランチに進みます if (receiveMessageQueue) { メッセージキューを受信します。push(messageJSON); } それ以外 { _dispatchMessageFromNative(メッセージJSON); } } 関数_dispatchMessageFromNative(messageJSON) { setTimeout(関数() { // 返送された元のメッセージは文字列型で、JSON に変換されます var message = JSON.parse(messageJSON); var レスポンスコールバック; // Java 呼び出しが完了し、返された responseId は、前に送信した callbackId です。 if (メッセージ.レスポンスID) { // responseCallbacks オブジェクトから ID に関連付けられたコールバック メソッドを取得します。 responseCallback = responseCallbacks[message.responseId]; if (!レスポンスコールバック) { 戻る; } // コールバックを実行し、js が Android メソッドを呼び出してメッセージを正常に受信します。 responseCallback(message.responseData); responseCallbacks[message.responseId]を削除します。 } それ以外 { // ... } }); } 関数_dispatchMessageFromNative(messageJSON) { setTimeout(関数() { if (メッセージ.レスポンスID) { // ... } それ以外 { // ネイティブに送信するメッセージに ID があるように、ネイティブから送信されるメッセージにも ID があり、ネイティブ内部ではこの ID にコールバックを関連付けます if (message.callbackId) { var コールバックレスポンスID = message.callbackID; //フロントエンドがネイティブデバイスに応答する必要がある場合は、ネイティブデバイスが ID を通じて対応するコールバックを見つけて実行できるように、ネイティブデバイスによって事前に送信された ID を含める必要があります。responseCallback = function (responseData) { _doSend({ レスポンスID: コールバックレスポンスID、 レスポンスデータ: レスポンスデータ }); }; } // デフォルトの _messageHandler を設定していないため、未定義です var ハンドラー = WebViewJavascriptBridge._messageHandler; // ネイティブに送信されるメッセージには処理メソッドの名前が含まれます if (message.handlerName) { // メソッド名を使用して、messageHandlers オブジェクト内に対応する処理メソッドがあるかどうかを確認します。handler = messageHandlers[message.handlerName]; } 試す { //処理メソッドを実行します。handler(message.data, responseCallback); } キャッチ(例外){ if (typeof コンソール !== 'undefined') { console.log('WebViewJavascriptBridge: 警告: JavaScript ハンドラーが例外をスローしました。', message, exception); } } } }); } たとえば、ネイティブのリターン キー イベントをリッスンする場合は、まず window.WebViewJavascriptBridge.registerHandler('onBackPressed', () => { // 何かをする... }) 関数registerHandler(ハンドラ名、ハンドラ) { messageHandlers[ハンドラー名] = ハンドラー; } とても簡単です。監視するイベント名とメソッドを { ハンドラー名: 'onBackPressed' } このようにして、 この時点で、Android 環境における 1.jsはネイティブを呼び出す一意の 2. ネイティブコールjsまず、フロントエンドは監視するイベントを事前に登録し、イベント名とコールバックを保存する必要があります。その後、ネイティブは特定の時間に ご覧のとおり、 iOS版
var CUSTOM_PROTOCOL_SCHEME_IOS = 'https'; var QUEUE_HAS_MESSAGE_IOS = '__wvjb_queue_message__'; 次に、 var BRIDGE_LOADED_IOS = '__bridge_loaded__'; 関数 _createQueueReadyIframe (ドキュメント) { メッセージングIframe = doc.createElement('iframe'); メッセージングIframe.style.display = 'なし'; if (isIphone()) { // これは iOS が最初にロードする必要があるブリッジです : メッセージングIframe.src = CUSTOM_PROTOCOL_SCHEME_IOS + '://' + BRIDGE_LOADED_IOS; } doc.documentElement.appendChild(メッセージングIframe); } 次に、 関数_fetchQueue(){ var messageQueueString = JSON.stringify(sendMessageQueue); 送信メッセージキュー = []; return messageQueueString; // iframeを経由せず直接返す } その他はすべて同じです。 要約するこの記事は、 jsBridgeの動作の仕組みを1つの記事で学ぶこの記事はこれで終わりです。jsBridgeの動作の仕組みに関するより関連性の高いコンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQLデータベースのマスタースレーブ同期の実際のプロセスの詳細な説明
>>: MySQL データベースの基礎を始めるための一般的なコマンドの概要
フロントエンドとバックエンドを完全に分離する場合、Vue プロジェクトでトークン検証を実装する一般的...
目次道具:ログインシナリオ:練習する:シナリオ1: 思考と実践シナリオ2: 思考と実践要約する道具:...
目次序文sudo書き込み権限を追加するgit 2.9.0をインストールopenssl 1.1.1l ...
一昨日、本番環境でGROUP_CONCAT関数を使用して選択したデータが切り捨てられ、最大長が102...
序文DBA として、仕事中に MySQL マスターとスレーブの同期遅延の問題に遭遇することがよくあり...
序文効率的なSQL文の書き方は、Explain実行計画の分析と切り離せません。実行計画とは何か、効率...
1. ベクターマップベクター グラフィックスは直線と曲線を使用してグラフィックスを表します。これらの...
Mac を返却して以来、元のラップトップは使用されていません。このラップトップの構成は非常に良好で...
(I)ウェブページのカラーマッチングの基本概念(1)白黒の言葉は永遠のテーマです。誰もそれを悪く言う...
目次1. アニメーション機能の原理2. アニメーション関数のシンプルなカプセル化3. アニメーション...
この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...
私は最近、会社で統計レポートの開発に関わるプロジェクトに取り組んでいました。データの量が比較的多かっ...
最近、nginx-ingress-controller のアプリケーションについて説明した公開アカウ...
この記事は、Ubuntu 17.10 での Docker CE のインストールを記録するために使用さ...
Ubuntu 18.04.4 に MySQL をインストールするプロセスを見てみましょう。内容は次の...