# 10. hybrid

# 1. Android 与 IOS 双向通讯对比-相同点

  • 都是通过 WebView 来完成网页的加载
  • 都是通过想 window 注入对象的方式来提供可被 web 端调用的方法

  • 都可以直接调用 web 端挂载到 window 对象下的方法

# 2. Android 与 IOS 双向通讯对比-不同点

  • 注入对象不同:Android 可提供注入对象名。IOS 固定为 webkit
  • js 调用 Native 方式不同:面向 Android 可直接获取注入对象,调用方法。面向 IOS 为相对固定的写法

    window.webkit.messageHandlers.functionName.postMessage(argument)

// web调用Android方法
function useAndroidFunction(string) {
  window.AndroidJSBridge.androidTestFunction1(string)
}

// web 调用IOS方法,写法固定
function useIOSFunction(args) {
  // window.webkit.messageHandlers.方法名.postMessage(参数)
  window.webkit.messageHandlers.iosTestFuction.postMessage(args)
}

// web提供给native调用的方法要挂载window下面
window.webProvideFunction = function(args) {
  // some logic
  return 'this is web provide function'
}
  • 传递数据格式不同:面向 Android 只能接受基本数据类型数据。面向 IOS 可以接收任意类型数据。
  • 返回值不同:面向 Android 可以直接接收返回值,面向 IOS 没有办法直接获取返回值,因此只能通过回调再调用 web 绑定在 window 下 提供的方法。
// android 返回值
let result = window.AndroidJSBridge.androidTestFunction1(string)

# 3. 判断是 Android 还是 IOS 端

function isAndroid() {
  if (window.androidJSBridge) {
    return true
  } else if (window.webkit) {
    return false
  }
}

# 4. 判断是否是 iphoneX

const isIphoneX = () => {
  if (typeof window !== 'undefined' && window) {
    return /iphone/gi.test(window.navigator.userAgent) && window.screen.height >= 812
  }
  return false
}

window.isIphoneX = isIphoneX()

# 5. IOS 的一些兼容问题

html,body{
  /_ IOS 下的滑动卡顿问题 _/
  -webkit-overflow-scrolling: touch;
  /_ IOS 下点击取消默认高亮效果 _/
  -webkit-tap-highlight-color:rgba(0,0,0,0)
}