App内嵌H5,H5调用App的方法

核心:通过WebViewJavascriptBridge建立一个桥梁

github仓库链接: https://github.com/marcuswestin/WebViewJavascriptBridge

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

用法:例如检测是否安装某款app

function checkAppPayIsInstalled(payMethod){
  let plat = getAppPlat()
  if(plat === 'ios'){
    return new Promise((resolve,reject)=> {
      setupWebViewJavascriptBridge(bridge => {
        if (payMethod === 'weixin') {
          //检测微信是否安装
          bridge.callHandler('isWXAppInstalled', '', responseData => {
            responseData?resolve(true):resolve(false)
          })
        } else {
          //检测支付宝是否安装
          bridge.callHandler('isAliPayAppInstalled', '', responseData => {
            responseData?resolve(true):resolve(false)
          })
        }
      })
    })
  }else {
    if(window.nativeBridge){
      return new Promise((resolve,reject)=> {
        if (payMethod === 'weixin') {
          //检测微信是否安装
          let result = window.nativeBridge.isWXAppInstalled();
          result?resolve(true):resolve(false)
        } else {
          //检测支付宝是否安装
          let result = window.nativeBridge.isAliPayAppInstalled();
          result?resolve(true):resolve(false)
        }
      })
    }
  }
}

App内嵌H5页面时,如果需要支持下载功能(如文件、图片或其他资源),通常有几种常见的方式实现这一目标。下面详细介绍如何做到这一点以及需要注意的问题。 --- ### 实现步骤 #### 方式一:触发原生应用的下载能力 许多App会拦截H5页面中的下载请求,并由其内部机制完成真正的下载任务。例如: - 当用户点击“下载”按钮时,可以在H5页面中设置一个指向待下载资源的`<a>`标签。 - App识别到该动作后,自动使用自身的下载管理器接管后续流程。 **HTML 示例** ```html <a id="downloadLink" href="https://example.com/resource.zip">点击下载</a> <script> document.getElementById('downloadLink').addEventListener('click', () => { alert("即将开始下载..."); }); </script> ``` 这种方式对开发者最为简单,但也高度依赖宿主APP的支持情况——部分轻量级封装壳可能不具备完整处理此类事件的能力。 --- #### 方式二:手动构造HTTP请求并通过JS控制流媒体传输过程 若第一种办法不可行,则考虑采用Ajax/XHR/Fetch等方式主动发起GET请求读取远程服务器上的内容然后保存至本地存储空间里形成最终产物。此方案适合那些希望完全掌控整个交互细节的应用程序环境之中实施运用。 **JavaScript (ES6+) 示例** ```javascript function downloadFile(url, fileName) { fetch(url) .then(response => response.blob()) .then(blob => { if(navigator.msSaveOrOpenBlob){ // IE兼容检测 navigator.msSaveOrOpenBlob(blob,fileName); } else{ const link =document.createElement('a'); link.href =window.URL.createObjectURL(blob); link.setAttribute('download',fileName); document.body.appendChild(link); link.click(); link.remove(); } }) .catch(err=>console.error(`Error occurred while trying to download file:${url}`,err)); } // 调用实例 const fileUrl ='http://example.org/sample.pdf'; const desiredFileName='my-sample-file.pdf'; downloadFile(fileUrl ,desiredFileName ); ``` 注意此处涉及到跨域资源共享(CORS)配置方面的要求;另外还需要留意各平台间对于某些特定类型的MIME接受程度可能存在差异之处等等因素影响实际效果呈现。 --- #### 特别说明 - iOS系统的限制 苹果设备上Safari浏览器禁止直接通过脚本生成并模拟点击锚点元素来进行文件导出的行为模式,因此针对这类特殊情况建议尽量引导提示访客前往专门设计好的标准入口处再执行相应操作即可解决大部分棘手难题啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值