稳定版 Stable Build (1.02.1911180)
const loginDataKey = 'loginData'
const loginData = wx.getStorageSync(loginDataKey)
// 未登录,去登录
if(!loginData){
consolelog'未登录,去登录..'
wx.reLaunch({
url:'/pages/login/index'
})
}
有时候无法转跳到登录页,有时候可以(点击全部清除就可以,而再次点击编译就不行)
还有转跳到了登录页之后,会有一个返回首页的按钮,我不希望看到这个按钮,请问如何取消(到了登录页的用意是只有登录成功才能操作其他地方)
【这个关键点在于,微信小程序里面登录要如何做才是最恰当的,并且代码可以跑起来】
首先我保证转跳代码被执行了。代码每一次都有进入条件,如图
但是【使用真机正常】(点击真机调试)
(在以前,这个代码是没有问题,现在微信做了更新吧)
关于我的思考
我发现,当我在第一个页面的时候执行上面的代码,就完全可以。
如图
所以我猜测,小程序的用意是,不能单独开一个地方去转跳到登录页?
所以,小程序登录的哲学到底是啥?
希望官方回答
### 更多信息
#### 1
虽然login页面不出来(在开发者工具里面),但是js倒是执行了。
#### 2
如果在app.js里面使用 wx.redirectTo
那么,页面停留在首页。不会触发进入登录页。
--关于问题反馈完--
最后,我想了一个方案,不知道这样符合小程序官方的登录逻辑不。
在首页画出现一个弹窗,这个弹窗无法关闭,用户点击之后就可以授权了。(如果未登录)
这样可以过审核或者今后有没有可能被封了?
如果小程序限制单独开一个登录页面,那么用意是想要小程序可以游客试玩还是?
最后解决方案
登录是不需要授权的,也就是不需要转跳到登录页(暂时未知为啥微信要限制),也不需要弄按钮。
app.js完整代码如下
const loginDataKey = 'loginData'
//app.js
App({
onLaunch: function () {
const loginData = wx.getStorageSync(loginDataKey)
let toLogin = () => {
console.log('未登录,去登录..')
wx.showLoading({title: '登录中', icon: 'loading', mask: true})
wx.login({
success(res){
console.log('wx.login res')
console.log(res)
let success = () => {
console.log('登录成功')
let loginResponse = {"openid":"ooZAbwpdDdaZV_xiamianshi_mashaike"}
wx.setStorageSync(loginDataKey, loginResponse)
wx.hideLoading()
}
let fail = () => {
wx.hideLoading()
wx.showToast({
title: '登录失败,请重新打开小程序试试',
icon: 'none',
duration: 1e8
})
}
// TODO 发起网络请求
// 登录成功
success()
},
fail(err){
console.log(err)
wx.hideLoading()
wx.showToast({
title: '登录失败,请重新打开小程序试试',
icon: 'none',
duration: 1e8
})
}
})
}
console.log('--loginData--')
console.log(loginData)
// 未登录,去登录
if(!loginData){
toLogin()
}else{
wx.checkSession({
success () {
//session_key 未过期,并且在本生命周期一直有效
console.log('session_key 未过期')
},
fail () {
// session_key 已经失效,需要重新执行登录流程
// wx.login() //重新登录
console.log('session_key 已经失效,需要重新执行登录流程, 重新登录中')
toLogin()
}
})
}
},
globalData: {
userInfo: null
}
})
页面显示回到首页按钮,可以进行隐藏的,文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.hideHomeButton.html
首页就出现弹窗,并且不可以关闭,拒审的几率很大。
问题1:
不是的,问题1和授权状态可能有关系,但是和wx.checkSession没关系,因为上面的代码等同于
什么都不写,直接写转跳到登录页。但是失败了(第一次进入后,在点击编译的话)。
因为已经进入了转跳页面,但是wxml不会展示。只执行了js。
问题2:
返回按钮也不行。(我记得之前的小程序不会展示返回按钮)
思路1:
再每一个页面放一个组件是一种解决方案。这个可行,只是页面太多,等了解完所有的逻辑后可能会这么做。(这有一个问题是,如果一进入就直接有一个弹窗,不知道会不会审核被拒)
思路2.:
这个不可行。原因上面讲过了,如果转跳到登录页,这个过程需要时间,会有一瞬间的闪屏。
刚才我测试了一下,在onLoad中调用wx.reLaunch或是wx.navigateTo确实有闪屏的bug,个人认为你应该把这个bug单独发帖,不过可以通过设置个延时100毫秒或是放到onShow中可以解决。至于问题1,你调用过了wx.login后那个登陆状态,不是由你的代码来控制的,在开发工具上是开发工具控制的,在微信上是微信控制的,所以有个wx.checkSession去获取登陆状态。
你说wx.checkSession获取登录状态,我目前是作为辅助。只检查是否过期,不检测是否登录。
最后我的解决方案是不提供点击按钮,直接wx.login获取code,然后换取openid即可登录成功。
~~ 谢谢大佬的热心解答
问题1:当你只是重新刷新的时候,在你已经wx.login的情况下wx.checkSession还是会返回success的,在开发工具上只能点击上方下拉项“清除登录状态”才视为退出,在手机上则是由微信去判断用户是否要重新登录。
问题2:确实在onLoad中去重定向到一个非首页都会有返回会首页的按钮,同于直接从外部打开一个非首页的页面,你可以改为跳转,及wx.reLaunch改为wx.navigateTo,这样就会变成返回的按钮。
思路1:如果想要所有页面的内容都要登录后查看,可以把login写成一个组件,首页在未登录时显示为这个登录组件,登录后为正常内容,如果不是所以页面都要登录,就在要登录的页面预至这个组件;
思路2:要登录的页面放个按钮(这个功能需求登录后才能使用),点击判断并跳到登录,登录完wx.navigateBack回来就行了。
<view wx:if="{{isLogin == -1}}"></view> <view class="login" wx:elif="{{isLogin == 0}}"> <login bindloginSuccess="init"/> </view> <view wx:elif="{{isLogin == 1}}"> <view>正常内容</view> </view>