【分享】CocosCreator >= 3.5.0 后 Android WebSocket 链接保活实现

前言

在 Cocos Creator 3.5.0 之后,Cocos Creator 在 Android 平台上的实现改为了采用 okhttp 去进行实现

问题描述

在 Cocos Creator 3.5.0 之后,当游戏进入后台(比如跳转到广告播放、比如进入支付界面)一段时间,WebSocket 链接可能会主动断开

问题分析

  1. 在游戏进入后台后,游戏线程就会被暂停,一些定时器可能也没法按照预期操作(比如 WebSocket 定时发送一个消息到服务器,模拟 ping)
  2. 同时 Cocos Creator 在 Android 平台上创建 okhttp 实例的时候,没有指定 pingInterval(默认值为 0,即不自动发送 ping 帧)

在上面两个前提下,WebSocket 实际上并没有和服务器保持持续的 ping/pong ,从而导致一段时间后,连接就会断开。

解决方案

在 CocosCreator 创建 okhttp 实例的时候,指定 pingInterval 即可(定时间隔可视业务情况调整)

ps:

  • CocosWebSocket.java 位置:引擎根目录/native/cocos/platform/android/java/src/com/cocos/lib/websocket/CocosWebSocket.java
4赞

感谢分享!!

应用被切到后台了 运行暂停了,那么你这个保活机制如何被触发运行?

这里我们讨论的还不算是 应用进入到后台的范畴。

我们主要是针对游戏的Activity被暂停(比如打开了广告的Activity或者支付界面的Activity之类)的情况进行处理。

在这些情况下,应用本身还是在前台的,只是游戏的Activity暂停了,游戏的线程被暂停了。

但是,这个时候,由okhttp创建的ws实例是在线程池中的,他并不会因为游戏的Activity暂停而暂停。

所以,才可以这样子做

这个修改后,要编译引擎吗?还是要怎么样操作才能生效?

真正后台保活ws,用AndroidService,让WS进程跟Activity分离,这个改起来也不轻松

感谢分享!

我按帖子那样 去改,然后编译了一下引擎,打包在手机上调试,好像不行,调起视频广告回到游戏后,一样会断线