后端菜鸡开发钉钉小程序使用web-view传token到Vue遇到的坑

  • Post author:
  • Post category:vue


起始因为公司要做一个小程序到钉钉上,需要传输文件,无奈钉钉小程序的文档上面只告诉我怎么打开发送图片,我要传的是excel。

找了半天找不到打开文件夹的方法,就只有个上传文件的方法。。(懂的都懂)

只能使用web-view来解决了(开始踩雷)

遇到的问题:

1.官方案例的传值:

在这里插入图片描述

<web-view id="web-view-1" src="https://open.dingtalk.com/mobile" onMessage="test"></web-view>

这里就是所在钉钉小程序的弄个页面,使用这个标签,就可以打开一个指定网页

onMessage里的内容是js页面接收web-view数据的方法名

接下来写js中的方法

Page({
  webViewContext:'',
  data: {
    message : {
      token: ''
    }
  },
  onLoad(options) {
    // console.log(options.data)
    this.webViewContext = dd.createWebViewContext('web-view-1'); 
    this.setData({
      message:{
        token: app.token
      }
    })
    // console.log(app.token
  },
  test(e){
    console.log(e)
    this.webViewContext.postMessage({'sendToWebView': this.data.message});
  }
});


(示例代码中,是没有加webViewContext: ’ ‘这个声明的,也是因为没有加,导致我测试时只能接收到网页给小程序传递的信息,无法从小程序传递信息给网页)


钉钉文档中提示说要web-view要接一个html5的页面,但是我是用的一个

Vue页面

,所以我把它的js代码引用在了index.html中(我.菜鸡行为)

<!-- html -->
<script type="text/javascript" src="https://appx/web-view.min.js"></script>
// 如该H5页面需要同时在非钉钉客户端内使用,为避免该请求404,可参考以下写法
// 请尽量在html头部执行以下脚本
<script>
  if (navigator.userAgent.toLowerCase().indexOf('dingtalk') > -1) {
    document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>');
  }

// javascript
<script type="text/javascript" src="https://appx/web-view.min.js"></script>
<script>
  if (navigator.userAgent.toLowerCase().indexOf('dingtalk') > -1) {
    document.writeln('<script src="https://appx/web-view.min.js"' + '>' + '<' + '/' + 'script>')
  }
  // javascript
  // dd.navigateTo({url: '/Pages/home/index'})
  let token = '0'
  // 网页向小程序 postMessage 消息
  dd.postMessage({name: token})


  // 接收来自小程序的消息。
  window.dd.onMessage = function (e) {
    if (token === '0') {
      // window.dd.postMessage({name: e})
      window.sessionStorage.setItem('msg', JSON.stringify(e))
      token = e
      window.eventBus.$emit('msg', e)
    }
    // {'sendToWebView': '1'}

  }
</script>

小程序和web-view的通信顺序在钉钉文档里没有写清楚,但是在支付宝小程序中,写明白了,

先是小程序接收到网页发送过来的信息,然后再小程序给网页发送信息


注释的

window.dd.postMessage({name: e})

就是为了验证网页是否拿到传递过来的值

2.传值问题

在index中拿到值之后,如何把token拿过去,这件事情用了我挺久时间,在index中使用

window.eventBus.$emit('msg', e)

再在main.js中注册

//  ========注册全局事件总线
window.eventBus = new Vue()

接下来在上传文件的页面获取

 window.eventBus.$off('msg') // 关闭上一次的监听
        window.eventBus.$on('msg', (res) => {
          thiz.msg.token = res.sendToWebView.token
        })

在模拟器上顺顺利利的运行了一遍,

我以为这样就万事大吉了、、、、

结果!!!

我放到真机上模拟,怎么都拿不到值,我就通过测试发现,eventBus根本无法执行,我就得尝试其他方法,然后我使用sessionStorage

  window.sessionStorage.setItem('msg', JSON.stringify(e))

接收

this.msg.token = msg.sendToWebView.token

结果。。。模拟器接收不到值(项目没用到vuex,我也不咋会)

我又重试了其他几种方法,都是模拟器没值,我第二天早上一想,是不是模拟器接收不到,真机能接收到,我就从新把sessionStorage写上去,手机运行了一遍,

拿到值了

,TMD,泪目,这什么玩意啊,模拟器跟真机还是相反的,你拿不到我拿的到,你拿得到我拿不到,最后写下这一记录,钉钉小程序文档是真的XX!



版权声明:本文为milo_milo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。