一、情景
在微信浏览器中,需要使用用户微信的code数据,因此采用了"location.href"获取微信授权信息的方式来实现授权登录,并且在重定向页面中获取code,完成操作后需要返回上一页,但是这时候发现采用uni.navigateBack()或者$Router.back()只能回到微信授权的那一页,结果又一次重定向回现在的页面了。
/**
* H5端微信授权登录
* getApp().globalData.AppId: 配置的appid
* redirect_uri: 当前页面或者你想要定向到的地址
* scope: snsapi_base:静默登录 / snsapi_userinfo:弹出框登录
*/
// #ifdef H5
let tar_url = location.href;
tar_url += location.href.indexOf('?') > -1 ? '&' : '?';
tar_url += 'ori_url=' + location.href;
let uricode = encodeURIComponent(tar_url);
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='
+ getApp().globalData.AppId + '&redirect_uri=' + uricode
+ '&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
// #endif
二、定位问题
通过打印history和getCurrentPages()比较后才发现,重定向打开页面的页面栈只有1级,因此在uni.navigateBack()中delta不论设置是几层,它就是跳不出去。
三、解决方案
1、在事件中返回(如点击确认按钮等):window.history.go(-2); // -2的层级自己看情况设置
2、监听浏览器左上角的后退按钮:
/**
* from(触发返回行为的来源):
* 'backbutton': 左上角导航栏按钮及安卓返回键;
* 'navigateBack': uni.navigateBack()方法;
* 支付宝小程序端不支持返回此字段。
*/
onBackPress(options){
// console.log(options.from)
if('触发条件'){
window.history.go(-2);
return true;
}else{
return false;
}
}