收藏
回答

app无法转跳到登录页面 and 小程序登录的哲学思考

框架类型 问题类型 操作系统 工具版本
小程序 Bug Windows 稳定版 Stable Build (1.02.1911180)

稳定版 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({
  onLaunchfunction () {
    const loginData = wx.getStorageSync(loginDataKey)
    let toLogin = () => {
      console.log('未登录,去登录..')
      wx.showLoading({title'登录中'icon'loading'masktrue})
      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',
              duration1e8
            })
          }
          // TODO 发起网络请求
          // 登录成功
          success()
        },
        fail(err){
          console.log(err)
          wx.hideLoading()
          wx.showToast({
            title'登录失败,请重新打开小程序试试',
            icon'none',
            duration1e8
          })
        }
      })
    }
    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: {
    userInfonull
  }
})
最后一次编辑于  01-10
回答关注问题邀请回答
收藏

3 个回答

  • 磐石
    磐石
    01-10

    页面显示回到首页按钮,可以进行隐藏的,文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/ui/navigation-bar/wx.hideHomeButton.html

    首页就出现弹窗,并且不可以关闭,拒审的几率很大。

    01-10
    有用
    回复 7
    • 反者道之动
      反者道之动
      01-10
      好的    哎    我搞不懂了  既然不能弹窗 也不能转跳到登录页(假设不存在技术问题,本质和弹窗没啥区别)  那到底要怎么搞   用户点击之后再出现弹窗?
      01-10
      回复
    • 磐石
      磐石
      01-10回复反者道之动
      可以参照小程序的相关规则哦,地址我忘了。可以说下你的具体需求
      01-10
      回复
    • 反者道之动
      反者道之动
      01-10回复磐石
      就是整个应用需要先登录然后才能继续操作
      01-10
      回复
    • 磐石
      磐石
      01-10回复反者道之动
      那建议你先看看微信小程序这方面的规则哦,看看是否符合
      01-10
      回复
    • 反者道之动
      反者道之动
      01-10回复磐石
      嗯嗯  好的 谢谢 ~~
      01-10
      回复
    查看更多(2)
  • 反者道之动
    反者道之动
    01-10

    问题1:

    不是的,问题1和授权状态可能有关系,但是和wx.checkSession没关系,因为上面的代码等同于


    什么都不写,直接写转跳到登录页。但是失败了(第一次进入后,在点击编译的话)。


    因为已经进入了转跳页面,但是wxml不会展示。只执行了js。


    问题2:

    返回按钮也不行。(我记得之前的小程序不会展示返回按钮)



    思路1:


    再每一个页面放一个组件是一种解决方案。这个可行,只是页面太多,等了解完所有的逻辑后可能会这么做。(这有一个问题是,如果一进入就直接有一个弹窗,不知道会不会审核被拒)


    思路2.:

    这个不可行。原因上面讲过了,如果转跳到登录页,这个过程需要时间,会有一瞬间的闪屏。



    01-10
    有用
    回复 2
    • 黯伢
      黯伢
      01-10
      你至少在我下面回复一下啊。
      刚才我测试了一下,在onLoad中调用wx.reLaunch或是wx.navigateTo确实有闪屏的bug,个人认为你应该把这个bug单独发帖,不过可以通过设置个延时100毫秒或是放到onShow中可以解决。至于问题1,你调用过了wx.login后那个登陆状态,不是由你的代码来控制的,在开发工具上是开发工具控制的,在微信上是微信控制的,所以有个wx.checkSession去获取登陆状态。
      01-10
      回复
    • 反者道之动
      反者道之动
      01-10回复黯伢
      不好意思  第一次用微信小程序论坛    其实我表达的意思是  问题1无法跳到登录页  代码没执行到转跳代码  而是因为一些原因被微信拦截了     

      你说wx.checkSession获取登录状态,我目前是作为辅助。只检查是否过期,不检测是否登录。

      最后我的解决方案是不提供点击按钮,直接wx.login获取code,然后换取openid即可登录成功。

      ~~ 谢谢大佬的热心解答
      01-10
      回复
  • 黯伢
    黯伢
    01-10

    问题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>
    
    01-10
    有用
    回复
登录 后发表内容
问题标签