当社のアプリは、フロントエンド ページを埋め込んだ典型的なハイブリッド開発アプリです。ネイティブ ページと同じ効果を実現するには、フロントエンド ページからネイティブ メソッドを呼び出す必要があります。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 データベースの基礎を始めるための一般的なコマンドの概要
以前、フロントエンド技術グループに所属していたとき、グループのメンバーが面接中に問題に遭遇したと言っ...
1. リポジトリファイルを作成するmongodb の公式インストール ドキュメントを参照し、次のスク...
目次1. インラインスタイル2. インポート方法を使用する3.cssモジュールのエクスポート4. ス...
1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...
Web サーバーは、独立したドメイン名を持つ複数の Web サイトを構築できるほか、通信経路上のトラ...
目次コンポーネントの基本概念オブジェクトとコンポーネントの違い成分属性属性とプロパティ属性:財産:ク...
目次1. 親子コンポーネント通信2. クロスレベルコンポーネント通信1. レイヤーごとに値を渡す2....
前提: ストアド プロシージャは、毎日午後 10 時から午前 5 時まで 10 分ごとに実行されます...
1. Javascript は前のページ history.go(-1) に戻り、2 つのページを返し...
目次1 概念上の区別2 事例紹介3 クエリパフォーマンス4 アップデートのパフォーマンス4.1 記憶...
目次1. アプリケーションライフサイクル2. ページのライフサイクルコンポーネントライフサイクル要約...
MySQL 8 は、NoSQL、JSON などのサポートなど、まったく新しいエクスペリエンスをもたら...
必要なファイルをインストールする Yum インストール openssl-* -yデータベースインデッ...
目次1. プロジェクト要件次にコーディングを始める1. フロントエンドページを作成する(CSSスタイ...
1.アルパインイメージをダウンロードする [root@DockerBrian ~]# docker ...