BridgeUtil.ets 2.66 KB
import webview from '@ohos.web.webview';
import { ResourceManager } from './ResourceManager';

export class BridgeUtil {
  static readonly YY_OVERRIDE_SCHEMA = "yy://";
  static readonly YY_RETURN_DATA = BridgeUtil.YY_OVERRIDE_SCHEMA + "return/";
  static readonly YY_FETCH_QUEUE = BridgeUtil.YY_RETURN_DATA + "_fetchQueue/";
  static readonly EMPTY_STR = "";
  static readonly UNDERLINE_STR = "_";
  static readonly SPLIT_MARK = "/";
  static readonly CALLBACK_ID_FORMAT = "JAVA_CB_%s";
  static readonly JS_HANDLE_MESSAGE_FROM_JAVA = "javascript:WebViewJavascriptBridge._handleMessageFromNative('%s');";
  static readonly JS_FETCH_QUEUE_FROM_JAVA = "javascript:WebViewJavascriptBridge._fetchQueue();";
  static readonly JAVASCRIPT_STR = "javascript:";

  // 例子 javascript:WebViewJavascriptBridge._fetchQueue(); --> _fetchQueue
  static parseFunctionName(jsUrl: string): string {
    return jsUrl.replace("javascript:WebViewJavascriptBridge.", "").replace("();", "");
  }

  static getDataFromReturnUrl(url: string): string {
    if (url.startsWith(BridgeUtil.YY_FETCH_QUEUE)) {
      // return = [{"responseId":"JAVA_CB_2_3957","responseData":"Javascript Says Right back aka!"}]
      return url.replace(BridgeUtil.YY_FETCH_QUEUE, BridgeUtil.EMPTY_STR);
    }
    // temp = _fetchQueue/[{"responseId":"JAVA_CB_2_3957","responseData":"Javascript Says Right back aka!"}]
    let temp = url.replace(BridgeUtil.YY_RETURN_DATA, BridgeUtil.EMPTY_STR);
    let functionAndData = temp.split(BridgeUtil.SPLIT_MARK);
    if (functionAndData.length < 2) {
      return ""
    }
    let result = ""
    functionAndData.forEach((value) => {
      result = result + value
    });
    return result

  }

  /**
   * TODO
   */
  static releaseWebView() {

  }

  // 获取到传递信息的方法
  // url = yy://return/_fetchQueue/[{"responseId":"JAVA_CB_1_360","responseData":"Javascript Says Right back aka!"}]
  static getFunctionFromReturnUrl(url: string): string {
    let temp = url.replace(BridgeUtil.YY_RETURN_DATA, BridgeUtil.EMPTY_STR);
    let functionAndData = temp.split(BridgeUtil.SPLIT_MARK);
    if (functionAndData.length >= 1) {
      // functionAndData[0] = _fetchQueue
      return functionAndData[0];
    }
    return ""
  }

  /**
   * 这里只是加载lib包中assets中的 WebViewJavascriptBridge.js
   * @param controller
   * @param path 路径
   */
  static webViewLoadLocalJs(context: Context, controller: webview.WebviewController) {
    ResourceManager.getResourcesText(context, "WebViewJavascriptBridge.js").then((str) => {
      //执行js注入
      controller.runJavaScriptExt('javascript:' + str).then((msg) => {
        console.log("Js注入结果:" + msg.getString());
      })
    })
  }

}