jsBridge.js 5.26 KB
function judgTerminal() {
    const u = navigator.userAgent
    const isXiaomi = u.indexOf('XiaoMi') > -1 // 小米手机
    const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1 // 其它安卓
    const isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/) // ios
    if (isAndroid) {
      return 1
    } else if (isIOS) {
      if (isXiaomi) {
        return 1
      } else {
        return 2
      }
    }
  }
  
  function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
      return callback(window.WebViewJavascriptBridge)
    }
    if (window.WVJBCallbacks) {
      return window.WVJBCallbacks.push(callback)
    }
    window.WVJBCallbacks = [callback]
    const WVJBIframe = document.createElement('iframe')
    WVJBIframe.style.display = 'none'
    WVJBIframe.src = 'https://__bridge_loaded__'
    document.documentElement.appendChild(WVJBIframe)
    setTimeout(function () {
      document.documentElement.removeChild(WVJBIframe)
    }, 0)
  }
  
  function connectWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge && window.WebViewJavascriptBridge.inited) {
      callback(window.WebViewJavascriptBridge)
    } else {
      document.addEventListener(
        'WebViewJavascriptBridgeReady',
        function () {
          callback(window.WebViewJavascriptBridge)
        },
        false,
      )
    }
  }
  // let timer = null
    document.addEventListener('DOMContentLoaded', () => {
      console.log('中文端 DOMContentLoaded 加载完成')
      // console.log('注册事件')
      // 初始化注册事件,解决安卓报错问题
      if (judgTerminal() === 1) {
        connectWebViewJavascriptBridge(function (bridge) {
          console.log('注册事件')
          bridge.registerHandler(
            'jsCall_receiveAppData',
            function (data, responseCallback) {
              if (responseCallback) responseCallback(data)
            },
          )
  
          bridge.registerHandler(
            'jsCall_appNotifyEvent',
            function (data, responseCallback) {
              try {
                console.log('android123', data)
                if (responseCallback) responseCallback(data)
                console.log('window.appNotifyEvent1', window.appNotifyEvent)
              } catch (error) {
                if (responseCallback) responseCallback(data)
                if (window.appNotifyEvent) window.appNotifyEvent(data)
                console.error('android123', error)
              }
            },
          )
          bridge.registerHandler(
            'jsCall_appNetworkStatusChangedEvent',
            function (data, responseCallback) {
              if (responseCallback) responseCallback(data)
            },
          )
        })
      } else {
        setupWebViewJavascriptBridge(function (bridge) {
          bridge.registerHandler(
            'jsCall_receiveAppData',
            function (data, responseCallback) {
              if (responseCallback) responseCallback(data)
            },
          )
          bridge.registerHandler(
            'jsCall_appNotifyEvent',
            function (data, responseCallback) {
              console.log('ios', data)
              if (responseCallback) responseCallback(data)
            },
          )
          bridge.registerHandler(
            'jsCall_appNetworkStatusChangedEvent',
            function (data, responseCallback) {
              if (responseCallback) responseCallback(data)
            },
          )
        })
      }
    })
  
  window.JSBrigde = function (name, params = {}, callback, inited = false) {
    console.log("WebViewJavascriptBridge", window.WebViewJavascriptBridge, name)
    if (!window.WebViewJavascriptBridge) return
    if (judgTerminal() === 1) {
      if (inited) {
        connectWebViewJavascriptBridge(function (bridge) {
          bridge.callHandler(
            name,
            params,
            function responseCallback(responseData) {
              console.log('JS received response1:', name, responseData)
              callback && callback(responseData)
            },
          )
        })
      } else {
        window.WebViewJavascriptBridge.callHandler(
          name,
          params,
          function (responseData) {
            console.log('JS received response2:', name, responseData)
            if (callback) callback(responseData)
          },
        )
      }
    } else {
      setupWebViewJavascriptBridge(function (bridge) {
        bridge.callHandler(name, params, function responseCallback(responseData) {
          console.log('JS received response:', name, responseData)
          callback && callback(responseData)
        })
      })
    }
  }

  function setPageDarkStyle() {
    const coverElements = document.querySelector('.dark_cover')
    coverElements.style.display = 'none'
    setTimeout(() => {
        try {
            window.JSBrigde(
                'jsCall_getAppPublicInfo',
                {},
                function (res) {
                    console.log('jsCall_getAppPublicInfo', res)
                    if (res) {
                        coverElements.style.display = (res.darkMode == 'dark') ? 'block' : 'none'
                    }
                }
            )
        } catch (error) {
            console.log('jsCall_getAppPublicInfo-error', error)
        }
    }, 50);
}