目前通过 httpclien.webSocketClient 来实现 websocket 的建链 通过 DefaultClientWebSocketSession 来接受服务端推送的消息 session.incoming.receive()
目前问题是 当 app 退出到后台 锁屏一段时间之后 app 被冻结了 再次打开 app 就会出现 Exception: java.net.SocketTimeoutException: timeout Exception: kotlinx.coroutines.channels.ClosedReceiveChannelException: Channel was closed 类似的异常
想请问这种情况怎么处理
ps 提供思路并解决的老哥有红包感谢:D
1
bmwh123 2023-10-26 16:25:20 +08:00
有的国产安卓系统,会禁止长时间运行的应用 service,可能需要把你测试的 app 的安全设置或者自启管理之类的设置一下,还有就是可以使用两个服务互相调用的方式去保活
|
2
NessajCN 2023-10-26 16:26:01 +08:00 via Android
每次从冻结回来肯定要 new 个新 socket client 对象啊,哪能还用之前那个
|
3
henyi2211 2023-10-26 16:27:26 +08:00
断线自动尝试重连。
如果有状态数据要恢复,就加入会话机制;初次建立连接的时候,服务端发送会话 token 给客户端保存;重连时,尝试使用会话 token 恢复状态 |
4
tool2d 2023-10-26 16:27:43 +08:00
手机锁屏 websocket 不是常规状态嘛,客户端重连一下就可以了啊。
|
5
rcj6056 OP @bmwh123 项目启动了一个前台进程 在通知栏会有一个小图标 表示 app 还存活着
但是停留后台超过一定时间就会报 socket 的异常 |
6
JackCh3ng 2023-10-26 16:36:09 +08:00
app 电池管理选择不优化,然后锁定后台。
一般像你这种需求是要上消息推送服务的。 |
7
okakuyang 2023-10-26 16:39:44 +08:00 via iPhone
这就是安卓后台保活吧,我觉得基本无解。可以看看是不是省电模式或者手机优化程序干的。
|
8
JackCh3ng 2023-10-26 16:40:24 +08:00
现在的安卓系统对于应用后台长期存在的 service 会在通知中心显式的提醒用户,这应该是安卓的隐私保护策略。然后还有个电池优化管理,会清掉后台不用的 app ,这会导致 app 的一些功能异常。我不是专业的安卓开发,这些是我之前写一个计时器 app 时遇到的问题,我是通过电池优化管理选择不优化来解决的。
|
9
coderxy 2023-10-26 16:42:09 +08:00
保活别想了,老老实实做好重连就行了。
|
12
lty81372860 2023-10-26 17:17:27 +08:00
IM 应用就接各大手机厂的官方推送服务吧,国内各家魔改的系统对于微信这种大体量应用是有白名单的,当然也不对外开放,所以想达到效果就接推送好了。
|
13
lty81372860 2023-10-26 17:19:14 +08:00
实际你可以了解下商用的那些 IM SDK 是怎么保证效果的,最后殊途同归,都是调官方推送服务+调优过的长连接策略
|
14
gowas 2023-10-26 17:20:26 +08:00
整个错误抑制 要有断线重连
|
15
lty81372860 2023-10-26 17:20:34 +08:00
之前微信技术团队分享过一个他们对于长连接的调优文章,具体可以去他们公众号搜搜。
|
16
babyrjw 2023-10-26 17:38:14 +08:00
感觉部分网络的 NAT 会不定期淘汰 NAT 表,淘汰后这 socket 就没用了,关键是 tcp 的中断检测也麻烦,发一条数据等超时才知道断开。 我以前遇到过在某一次心跳之后服务器发送数据到客户端失败,两边抓包发现客户端和服务器都会偶发性该问题,切换网络就正常
|
17
xiaoming61 2023-10-26 17:52:01 +08:00 via Android
断线重连必须要有,光有前台服务不够。一些国产系统会在应用后台时禁止联网。
|
18
weeei 2023-10-26 20:35:39 +08:00
退到后台就主动关闭长连接。切到前台重新连接。后台接收消息主要靠系统级别的推送。
|
19
ifbluethen 2023-10-27 14:36:04 +08:00
前司用 uniapp 开发 MQTT 应用也是这个问题,最后只能销毁原有的,再新建重连。
|
20
hez2010 2023-10-28 00:22:37 +08:00
开发即时通讯的推送消息难道不应该走平台的统一推送吗。。
Google 服务虽然被墙了但是 FCM 可没有被墙。 |