先描述一遍场景:
- 打开小程序
- 进入二级页面 A
- 关闭小程序(直接点击右上角胶囊按钮)
- 点击别人分享的该小程序消息,小程序被打开并进入 页面 A
可以看到的现象(安卓):关于第3点应该只是暂时放在后台运行,并没有真的被杀掉。第4点执行时,原来在后台运行会完整执行一遍生命周期(onUnload, onHide),重新打开的小程序也会完整执行一遍初始化过程。我其中的疑点为:
- relaunch 的小程序是否会先进行销毁,然后新初始化一个小程序?
- 前后两个小程序逻辑层是否共用同一个上下文?
- 前一个销毁和下一个的初始化是否为同步执行,即是否是前一个销毁完后新的才开始初始化?
以上两点在各个平台是否存在差异?
以上疑问对我在开发过程遇到的问题可能是十分关键的,我将简短的对相关问题进行描述:
问题一:App 初始化时建立 WebSocket 连接,并将 WS 消息存在全局变量 BUCKET 中,而在页面 A 的 onUnload 事件会进行重置,当发生以上场景时我发现:新启动的小程序 WS 收到消息并存在 BUCKET 中,但此时发生了页面 A 的 onUnload 事件 BUCKET 被重置,导致收到的消息丢失了。
问题二:还是同一个场景,同时我们建立 WebSocket 连接时使用同一个 ID 进行登录,保证同一个用户只能建立一个 WS 连接,并且会在 WS 断开时判断为登出状态。当发生以上场景时,新启动的小程序 WS 未收到新消息(等待一会后 WS 连接才会变得正常),虽然我推测可能是后端对于登出的实现存在问题,但仍然需要考虑小程序这边的问题:如果重启后不是同一个 JS 上下文就意味着 WS 发生了重连,而前一次 WS 断开和后一次 WS 连接的登录和登出流程就有可能不符合预期。
relaunch 后就会销毁
ws 必须重连,需要重新登陆登出,但是你也可以把 token/jwt 存在localstorage里,而不是内存