当前位置:   article > 正文

小程序嵌套H5_微信小程序嵌套h5

微信小程序嵌套h5

微信小程序中内嵌H5页面是一种常见的需求,因为H5页面具有灵活性和跨平台性,可以弥补小程序原生代码的不足。

微信小程序自带的 web-view 组件相当于 HTML页面中的 iframe ,方便我们在微信小程序中打开一个 H5 页面;从微信小程序基础库1.6.4开始,我们就可以在小程序内放置一个<web-view>组件来链接我们的HTML页面了。

web-view使用前提:业务域名

由于个人类型的小程序暂不支持使用。只有非个人类型小程序可以配置业务域名

1、扫码登录微信公众平台

2、开发管理 —— 开发设置 —— 业务域名 进行添加、修改;

3、配置完业务域名后,还需要下载校验文件(步骤2中第四张图的红色框部分),并将校验文件放置在域名根目录下(让后端去操作)。这一步相当于是让对方授权你能打开他的网页,比如要在你的小程序中打开百度,就需要百度去把这个校验文件放到他的域名根目录下得到他的授权;

4、设置业务域名时,报检查校验怎见石板,可以参考业务域名设置--校验文件检查失败自查指引 微信开放社区进行自查。

web-view链接打不开问题
  • 打不开某个外部网页链接:

  • 检查是否配置了小程序的业务域名,注意外部网页内再次 iframe 内嵌的其他域名也需要配置

    • 检查是否为 https 协议,不支持http协议,不支持 IP 地址

    • 打不开公众号文章:检查小程序是否已关联该公众号

  • 外部网页链接、公众号文章链接在开发工具、体验版上可以打开,正式版上不行:

    • 检查开发工具上是否开启了 “ 不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书 ” 选项,开发工具上开启这个选项,不用配置业务域名或关联小程序也能打开链接,在开发工具上将该选项关掉,也就打不开了,该选项位置如下图;体验版上能打开是因为打开了 “ 开发调试 ”,关闭开发调试后,同样也是打不开。

web-view的基本使用

官方web-view组件使用:web-view | 微信开放文档

每个页面只能有一个 web-view组件,并且 web-view组件将默认展示在最高层级

index.wxml

  1. <view class="page-body">
  2.   <web-view src="{{webUrl}}"></web-view>
  3. </view>

index.js

  1. data: {
  2.    webUrl: app.globalData.BASE_URL + "contacts"
  3. },
H5页面和小程序跳转及传参
web-view提供的跳转接口

跳转基本流程
  • 在小程序中新建一个web-view组件,指定URL为要嵌入的H5页面的链接。

  • 在H5页面中添加微信小程序JS SDK的引入,在H5页面中可以通过JS SDK调用小程序API。

  • 在小程序中设置跨域请求的安全域名,H5页面需要在此安全域名下。

  • 在需要向小程序传递参数的H5页面

H5 跳转回小程序

在内嵌网页中跳回小程序,需引入JS-SDK

  1. //安装插件
  2. npm i -S weixin-js-sdk
  3. //引入
  4. import wx from 'weixin-js-sdk'

在需要返回小程序的H5页面使用下面代码:

  1. wx.miniProgram.navigateTo({
  2.  url: "/pages/index", //小程序地址
  3. });

注意:

  • web-view 网页与小程序之间不支持除 JSSDK 提供的接口之外的通信;

  • 在 iOS 中,若存在JSSDK接口调用无响应的情况,可在 web-view 的 src 后面加个#wechat_redirect解决;

  • 避免在链接中带有中文字符,在 iOS 中会有打开白屏的问题,建议加一下 encodeURIComponent;

小程序和H5之间传参

小程序和H5之间互相跳转,如果需要传递参数的话可以通过 url 路径拼接的方式来传递参数

小程序向H5传参:

  • 微信小程序向H5传参

  1.   /**
  2.   * 页面的初始数据
  3.   */
  4.  data: {
  5.    webUrl: app.globalData.BASE_URL +'eventDetail'
  6. },  
  7.  /**
  8.   * 生命周期函数--监听页面加载
  9.   */
  10.  onLoad(options) {
  11.    let queryString = 'id=1&name=anna'
  12.    this.setData({
  13.      webUrl: this.data.webUrl + '?' + queryString
  14.   })
  15. },
  • H5接收参数

  1. created() {
  2.    this.detailData = this.$route.query
  3. },

H5向小程序传参:

  • H5向小程序传递参数

  1. linkPath(route) {
  2.        if (route.query) {
  3.          url = url + '?params=' + JSON.stringify(route.query)
  4.       }
  5.        wx.miniProgram.redirectTo({
  6.          url, //小程序地址
  7.       })
  8. }
  • 小程序接收参数

  1.  var util = require('../../../utils/util')
  2.  /**
  3.   * 生命周期函数--监听页面加载
  4.   */
  5.  onLoad(options) {
  6.    const params  = JSON.parse( options.params )
  7.    let queryString = util.queryUrl(params)
  8. },

utile.js

  1. const queryUrl = params => {
  2. let queryString = Object.keys(params)
  3. .map(function (key) {
  4. return key + '=' + encodeURIComponent(params[key])
  5. })
  6. .join('&')
  7. return queryString
  8. }
  9. const formatNumber = n => {
  10. n = n.toString()
  11. return n[1] ? n : `0${n}`
  12. }
  13. module.exports = {
  14. formatTime,
  15. queryUrl
  16. }
JSON数据处理

在传递参数过程中,使用了json处理参数可能会报 Unexpected token % in JSON at position 0这类报错问题,问题原因就是里面有特殊符号,需要对json数据做处理

  1. 转换string类型时 用encodeURIComponent编码包一下
  2. url = url + '?params=' + encodeURIComponent(JSON.stringify(route.query))
  3. 转换成原来的类型decodeURIComponent先解码回来再转换回来
  4. const params = JSON.parse( decodeURIComponent( options.params ) )
自定义导航名

web-view页面的标题取决于H5嵌入页面的title标题,该组件不支持自定义组件导航栏

可以通过修改title标题修改导航栏标题

  1. mounted() {
  2. document.title = '通讯录'
  3. },

注意:在微信开发者工具上可能会出现仅在第一次进入h5生效,进入h5后再改title的话并不能修改成功,由于微信开发者工具上不稳定,在上传后真机是可以的。

判断是否是微信环境

当有差异化功能时就可以通过微信sdk的接口进行当前是否小程序/公众号的判断,然后进行webview新页面的开发。

微信小程序提供了两种判断方法

  • wx.miniProgram.getEnv:获取当前环境

  1. / 判断是否是小程序端
  2. isMiniPrograms() {
  3. var isMiniprogram = false;
  4. // 判断是否是小程序打开
  5. wx.miniProgram.getEnv(res => {
  6. console.log(res.miniprogram)
  7. if (res.miniprogram) {
  8. //在小程序中
  9. isMiniprogram = true;
  10. }
  11. });
  12. return isMiniprogram;
  13. }
  • 在网页内可通过window.__wxjs_environment变量判断是否在小程序环境,建议在WeixinJSBridgeReady回调中使用

  1. const isWx =
  2. window.__wxjs_environment === 'miniprogram' || /miniProgram/i.test(navigator.userAgent.toLowerCase())
相关注意事项
  • 打开的域名没有在小程序管理后台设置业务域名(注意是业务域名,不是服务器域名)

  • 打开的页面必须为https服务

  • 打开的页面302过去的地址也必须设置过业务域名

  • web-view空白问题,请升级微信客户端到 6.5.16

  • 页面可以包含iframe,但是iframe的地址必须为业务域名

  • web-view不支持支付能力,web-view的API能力见web-view的文档说明

  • 开发者自己检查自己的https服务是否正常,测试方法:普通浏览器打开对应的地址

  • 如果web-view使用了公众号授权的服务,开发者工具提示网页开发者的问题,请见:概述 | 微信开放文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/389504
推荐阅读
相关标签
  

闽ICP备14008679号