收藏
回答

小程序重启流程是如何执行的?

先描述一遍场景:

  1. 打开小程序
  2. 进入二级页面 A
  3. 关闭小程序(直接点击右上角胶囊按钮)
  4. 点击别人分享的该小程序消息,小程序被打开并进入 页面 A

可以看到的现象(安卓):关于第3点应该只是暂时放在后台运行,并没有真的被杀掉。第4点执行时,原来在后台运行会完整执行一遍生命周期(onUnload, onHide),重新打开的小程序也会完整执行一遍初始化过程。我其中的疑点为:

  1. relaunch 的小程序是否会先进行销毁,然后新初始化一个小程序?
  2. 前后两个小程序逻辑层是否共用同一个上下文?
  3. 前一个销毁和下一个的初始化是否为同步执行,即是否是前一个销毁完后新的才开始初始化?

以上两点在各个平台是否存在差异?


以上疑问对我在开发过程遇到的问题可能是十分关键的,我将简短的对相关问题进行描述:

问题一:App 初始化时建立 WebSocket 连接,并将 WS 消息存在全局变量 BUCKET 中,而在页面 A 的 onUnload 事件会进行重置,当发生以上场景时我发现:新启动的小程序 WS 收到消息并存在 BUCKET 中,但此时发生了页面 AonUnload 事件 BUCKET 被重置,导致收到的消息丢失了。

问题二:还是同一个场景,同时我们建立 WebSocket 连接时使用同一个 ID 进行登录,保证同一个用户只能建立一个 WS 连接,并且会在 WS 断开时判断为登出状态。当发生以上场景时,新启动的小程序 WS 未收到新消息(等待一会后 WS 连接才会变得正常),虽然我推测可能是后端对于登出的实现存在问题,但仍然需要考虑小程序这边的问题:如果重启后不是同一个 JS 上下文就意味着 WS 发生了重连,而前一次 WS 断开和后一次 WS 连接的登录和登出流程就有可能不符合预期。

最后一次编辑于  2023-04-27
回答关注问题邀请回答
收藏

1 个回答

  • 游戏人生
    游戏人生
    2023-04-27

    relaunch 后就会销毁

    ws 必须重连,需要重新登陆登出,但是你也可以把 token/jwt 存在localstorage里,而不是内存

    2023-04-27
    有用
    回复 1
    • 举高高
      举高高
      2023-04-27
      WS重连是合理的,但小程序relaunch是完全销毁原来的吗?和新启动的有没有资源会被共享(包括逻辑层的JS沙箱)?实际表现让我感觉逻辑层JS上下文是共享的。
      2023-04-27
      回复
登录 后发表内容