zoukankan      html  css  js  c++  java
  • 微信浏览器内 h5 直接唤醒 app 之 微信开放标签 wx-open-launch-app

    以前微信浏览器内想要直接唤醒 app 要么接微信的应用宝要么你是腾讯的干儿子。
    而在微信在2020年5月分推出了“微信开放标签”功能
    wx-open-launch-app 用于微信浏览器内直接唤醒 app ,也可通过携带参数直接进入app相应的内页。
    现在不是干儿子,只要按照规定接入微信SDK就直接可以使用此功能。
     
     
    真机演示
    1、微信浏览器内 h5 网页
     
    2、点击后会弹出微信 Native 的弹层提示确认是否唤起 app
     
    3、成功唤起 app 并进入相应的页面
     
     
     
    一、适用环境
    微信版本要求为:7.0.12及以上。 系统版本要求为:iOS 10.3及以上、Android 5.0及以上
     
    二、接入微信JS-SDK
    按微信JS-SDK要求绑定安全域,并通过config接口注入权限验证配置
    接js-sdk可参见我加一篇博文
    https://www.cnblogs.com/willian/p/4254963.html
     
    wx.config({
        appId: '',
        debug: true,
        timestamp: '',
        nonceStr: '',
        signature: '',
        jsApiList: [
            'onMenuShareTimeline', // 分享给好友
            'onMenuShareAppMessage', // 分享到朋友圈
        ],
        openTagList: ['wx-open-launch-app’] // 获取开放标签权限
    });

    需要注意的点:
    3、wx.config 内列出使用到的 openTagList
     
    在微信开发者工具内打开你的网页测试如果显示
    {errMsg: "config:ok”}

    说明你已经接入JS-SDK成功了

    遗憾的是截至2020年7月13号为止,微信开发者工具还是无法支持微信开放标签的调试功能,只能在手机上调试并且是在加了微信安全域名的服务器环境下调试,着实麻烦

    三、在 VUE 项目内使用 wx-open-launch-app
    由于 wx-open-launch-app 这个标签在VUE项目编译时识别不了会报错,得在main.js文件内加上忽略报错的代码
    // 忽略自定义元素标签抛出的报错
    Vue.config.ignoredElements = [
        'wx-open-launch-app',
    ];
    
    new Vue({
    
        el: '#app',
    
        template: '<app/>',
    
        components: { app }
    })

    wx-open-launch-app 标签组件

    <wx-open-launch-app
        :id="id"
        class="launch-btn"
        :appid="appId"
        :extinfo="extinfoStr"
        >
        <script type="text/wxtag-template">
            <style>.btn {height: 96px;}</style>
            <div class="btn">打开app</div>
        </script>
    </wx-open-launch-app>

    注意
    1、标签内的原本的 <template> slot 需要替换成 <script type="text/wxtag-template”>
    2、经过测试发现标签内定义的样式真的很尴尬,且不受控制,所以我们直接将标签用 CSS 绝对定位并设透明度为 opacity: 0, 盖在了我们原本的设计图上
    3、透明度为 opacity: 0 的标签 <script type="text/wxtag-template"> 不能为空,否则宽高会被解析为0,也就是按钮根本点击不到
    4、标签内 appid 填写的是 微信开放平台(https://open.weixin.qq.com/)内客户端创建应用时的appid(非微信公众号)
    5、extinfo 内填的是传递给唤起 app 的数据,而我们发现微信7.0.15版本在ios上,有概率会接收数据失败,不知道是微信的问题还是我们IOS的写法问题
    6、在 VUE 的 mounted 生命周期回调函数内侦听开放标签的回调事件
    mounted(){
        var btn = document.getElementById(this.id)
        btn.addEventListener('launch', e => {
            // 在此处可设置粘贴板内数据,数据是传递给 app 的参数进,
            console.log('success');
        });
        btn.addEventListener('error', e => {
            // 在此处可设置粘贴板内数据,数据是传递给 app 的参数进,
            console.log('fail', e.detail);
            // 唤醒失败的情况下,可用于降级处理比如在此处跳转到应用宝
        });
    }

    7、如果微信版本低于7.0.12 开放标签是无法使用的,所以最好在开放标签外套一层 DIV 用于点击事件,在事件中断段微信版本号如果低于,则降级到应用宝之类的方案

    <div @click="launch">
        <wx-open-launch-app
            :id="id"
            class="launch-btn"
            :appid="appId"
            :extinfo="extinfoStr" 
          >
          <script type="text/wxtag-template">
            <style>.btn {height: 96px;}</style>
            <div class="btn">打开app</div>
          </script>
        </wx-open-launch-app>
      </div>
    launch(){
        // 在此处可设置粘贴板内数据,数据是传递给 app 的参数进
        if(!this.enable){
            // 不支持标签降级处理
        }
    }

    四、最后当然是封装成项目中的一个组件

    <template>
      <div @click="launch">
        <wx-open-launch-app
            :id="id"
            class="launch-btn"
            :appid="appId"
            :extinfo="extinfoStr" 
          >
          <script type="text/wxtag-template">
            <style>.btn {height: 96px;}</style>
            <div class="btn">打开app</div>
          </script>
        </wx-open-launch-app>
      </div>
    </template>
    <script>
      import globalConfig from '@assets/js/config'
      import { copyToClipboard } from '@assets/js/utils'
      import { getWeixinVersion, onBridgeReady } from '@assets/js/weixin/weixin'
      
      let idIndex = 0
      export default {
        name: 'LaunchButton',
        props: {
          extinfo: {
            type: Object,
            default: ''
          },
        },
        watch: {
          extinfo: {
            handler(n){
              this.extinfoStr = JSON.stringify(n)
            },
            immediate: true
          }
        },
        data() {
          idIndex++
          return {
            id: 'wxopenLanchAppId' + idIndex,
            appId: globalConfig.WEIXIN_APP_ID,
            enable: false,
            extinfoStr: '',
          }
        },
        methods: {
          redirectToApp(){
            setTimeout(()=>{
              window.location.href = globalConfig.YING_YONG_BAO
            }, 400)
          },
          setClipboard(){
            console.log('start copy')
            let copyObject = {
              app: 'yogo'
            }
            for(var k in this.extinfo){
              copyObject[k] = this.extinfo[k]
            }
            copyObject = JSON.stringify(copyObject)
    
            copyToClipboard(copyObject)
            console.log('end copy')
          },
          launch(){
            this.setClipboard()
            if(!this.enable){
              this.redirectToApp()
            }
          }
        },
        created(){
          // 微信版本号大于 7.0.12 开放标签才可进行 唤醒 app 跳转
          const wxVersion = getWeixinVersion()
          if(wxVersion){
            let v = wxVersion.split('.')
            if(v[0]>=7){
              if(v[1]>=0){
                if(v[2]>=12){
                  this.enable = true
                }
              }
            }
          }
        },
        mounted(){
          var btn = document.getElementById(this.id)
          btn.addEventListener('launch', e => {
            this.setClipboard()
            console.log('success');
          });
          btn.addEventListener('error',  e => {
            console.log('fail', e.detail);
            this.setClipboard()
            this.redirectToApp()
          });
        }
      }
    </script>
    <style lang="scss" scoped>
      .launch-btn{
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 100%;
        z-index: 1;
        opacity: 0;
        // background: red;
      }
    </style>

    五、参考微信官方链接
    接入指南
    微信内网页跳转 app 功能
    JS-SDK使用步骤
    开放标签说明文档

    注:转载请注明出处博客园:sheldon(willian12345@126.com)

    https://github.com/willian12345

     
  • 相关阅读:
    Linnia学习记录
    漫漫考研路
    ENS的学习记录
    KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定
    KnockoutJS 3.X API 第四章 数据绑定(3) 控制流if绑定和ifnot绑定
    KnockoutJS 3.X API 第四章 数据绑定(2) 控制流foreach绑定
    KnockoutJS 3.X API 第四章 数据绑定(1) 文本及样式绑定
    KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
    KnockoutJS 3.X API 第三章 计算监控属性(4)Pure computed observables
    KnockoutJS 3.X API 第三章 计算监控属性(3) KO如何实现依赖追踪
  • 原文地址:https://www.cnblogs.com/willian/p/13293030.html
Copyright © 2011-2022 走看看