JavaScript

超轻量级php框架startmvc

vue实现与安卓、IOS交互的方法

更新时间:2020-08-03 10:00 作者:startmvc
方案背景IOS用的是jsBridge插件实现调用、传参、回调的安卓是在window挂载方法和挂载回调的I

方案背景

  • IOS用的是jsBridge插件实现调用、传参、回调的
  • 安卓是在window挂载方法和挂载回调的

IOS实现方案

调用原生方法封装如下


function setupWebViewJavascriptBridge (callback) {
 if (window.WebViewJavascriptBridge) {
 return callback(window.WebViewJavascriptBridge)
 }
 if (window.WVJBCallbacks) {
 return window.WVJBCallbacks.push(callback)
 }
 window.WVJBCallbacks = [callback]
 let WVJBIframe = document.createElement('iframe')
 WVJBIframe.style.display = 'none'
 WVJBIframe.src = 'https://__bridge_loaded__'
 document.documentElement.appendChild(WVJBIframe)
 setTimeout(() => {
 document.documentElement.removeChild(WVJBIframe)
 }, 0)
}
function callhandler (name, data, callback) {
 setupWebViewJavascriptBridge(function (bridge) {
 bridge.callHandler(name, data, callback)
 })
}

实际调用如下


callhandler(functionName: string, params: object, res => {})

注册方法给原生


registerhandler (name, callback) {
 // 安卓
 window[name] = res => {
 let data = JSON.parse(res)
 callback(data)
 }
 // IOS
 setupWebViewJavascriptBridge(function (bridge) {
 bridge.registerHandler(name, function (data, responseCallback) {
 callback(data, responseCallback)
 })
 })
}

安卓实现方案

调用原生方法


window.HTTP_TEST.functionName()

定义回调方法/注册方法给原生


window['functionName'] = res => {}

特殊说明

  1. 安卓在交互中的参数传递只能支持string类型,对象参数要转成string传递
  2. 因为安卓的回调方法名是固定的,同一方法同时请求两次以上时,有可能只得到一次回调。如果用随机数处理就会不断地在window上挂载新的函数,调用次数过多可能会出问题,所以目前是避免同时请求同一方法来解决的。如果有需求避免不了,那还是要用随机数解决。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。