uniapp安卓app使用web-view,物理返回键处理

场景:使用uniapp内嵌h5,h5是独立的网站,有自己的tabbar

问题:APP打开h5首页后,在各个页面之间跳转,在tabbar退出APP,非tabbar则是返回上一级

思路:APP与H5,互发消息,由H5进行控制物理返回键,告诉APP是退出还是返回上一级

1、uniapp设置,在uniapp使用web-view的地方处理,不要uniapp原生的tabbar,同时使用onBackPress方法控制跳转,由APP与h5约定的方法控制






2、h5设置

(1)、在app.vue中,设置web-view通讯初始化,以及拿到APP传的参数值,使用localStorage缓存起来,要注意的地方,UniAppJSBridgeReady在每一次APP打开都会执行






(2)、在路由页面设置

import Vue from 'vue';
import Router from 'vue-router';
import routes from './routers'
import { sendAppMessage } from 'libs/util'
Vue.use(Router);

const router = new Router({
    scrollBehavior(to,from,savePosition){ // 在点击浏览器的“前进/后退”,或者切换导航的时候触发。
        // to:要进入的目标路由对象,到哪里去  from:离开的路由对象,哪里来 savePosition:会记录滚动条的坐标,点击前进/后退的时候记录值{x:?,y:?}
        if(savePosition) {
            return savePosition;
        }else{
            return {x:0,y:0}
        }
    },
    base: process.env.BASE_URL,
    routes,
    mode: 'hash' // 默认 hash history去除路由地址的# 使用 history会导致刷新报404
})

router.beforeEach((to, from, next) => {
  // console.log("beforeEach to:"+JSON.stringify(to))
  // console.log("from:"+JSON.stringify(from))
  next()
})

router.afterEach(to => {
  console.log("to.name:"+to.name)
  // 与APP互通消息
  if(localStorage.getItem("isFromApp") && JSON.parse(localStorage.getItem("isFromApp"))){
    if(to.name == 'homes' || to.name == 'recommend' || to.name == 'publishPost' || to.name == 'message' || to.name == 'myzone'){
      sendAppMessage(true)
    }else{
      sendAppMessage(false)
    }
  }
  // console.log("afterEach to:"+JSON.stringify(to))
  // window.scrollTo(0, 0)
})

export default router

(3)、通信方法,/src/libs/util.js

export const sendAppMessage = (flag) => {
  uni.postMessage({
    data: {
      isQuitApp: flag ? true : false
    }
  });
}

(4)、使用中间页,为什么要中间页呢?因为用户退出APP后,下次再重新进入,会再次执行UniAppJSBridgeReady,但是app.vue执行顺序要比router.js的要晚,而h5页面会因为有缓存而执行了sendAppMessage,但是uni此时是未定义的,会报错,所以需要中间页来让router先执行,然后再执行app.vue,最后再执行主程序,中间页index.vue代码如下






要注意的地方,这里是个大坑

a、路由文件不能使用按需加载,必须使用实例化加载,否则app.vue 使用 this.$route.query.isFromApp 得不到值

uniapp安卓app使用web-view,物理返回键处理_第1张图片

这个实在心酸,坑太多,填坑不易

你可能感兴趣的:(uniapp)