iOS15 Safari浏览器无法收发WebSocket

  • Creator 版本:2.4.3

  • 目标平台:iOS 15 Safari

  • 重现方式:以iOS15 Safari开启自己开发的Web游戏(且挂载的网页须设定Https),且设置→Safari浏览器→高级→Experimental Features→NSURLSession WebSocket开启,连线自行开发的C# WebSocket Server,第一个登入封包发送后Server始终无法收到,将NSURLSession WebSocket关闭就可收到。

  • 首个报错:

  • 之前哪个版本是正常的:iOS 14.8以前的版本

  • 手机型号:iPhone X、iPhone 12 Pro Max

  • 手机浏览器:Safari

  • 编辑器操作系统:Windows 10

  • 重现概率:每次

我们也遇到了这个问题,找到处理的办法了吗?

后来调整WebSocket Server封包接收处理的方式,透过确认Header第一位元为何,将不完整的封包组合起来接收,可以解决漏包问题。

封包解析,可参考:https://segmentfault.com/a/1190000012948613

后来解决后发现Safari仍有可能机率性崩溃,有可能为CocosCreator与底层相冲。

感谢回复,”确认Header第一位元为何“ ,这句指的是?

將收到的封包dataBuffer印出來。
byte[0]數值
假如是129就代表二進 10000001,對應文章"数据帧"opcode:0001
→%x1:表示这是一个文本帧(frame)

假如是136就代表二進 10001000,對應文章opcode:1000
→%x8:表示连接断开。

哦,这个我了解的,我们是自己在nginx上修改做的websocket协议解析,因为客户端是H5,服务端是c++用的socket,因此用nginx做代理和协议websocket<=>tcpsocket,包括握手阶段和数据收发

之前一直没问题,ios15上线后,就出现你说的问题了,不知道NSURLSession底层做了什么,协议出错,发现客户端经常发送断开位标识和无掩码位的标识,底层epoll_wait()也经常报错

我们客户端用的是cocoscreator框架提供的websocket库,并没有用到苹果的NSURLSession WebSocket,由于苹果生态封闭,我们也无法了解safari源码,不知道打开了你说的那个开关后,苹果NSURLSession底层具体做了什么,因此无法正向解决,只能逆向推导。
此外,我们还发现了服务端收到了很多未知的opcode,这个在ios15之前是没有的,目前统计的有
3 5 6 7 12 14 15(10进制表示),都是预留的非控制帧和控制帧,我猜想这些是苹果自定义的,当服务端收到需要作出相应的动作。
//​%x0 表示一个持续帧
//​%x1 表示一个文本帧
//​%x2 表示一个二进制帧
//​%x3 - 7 预留给以后的非控制帧
//%x8 表示一个连接关闭包
//​%x9 表示一个ping包
//​%xA 表示一个pong包
//​%xB - F 预留给以后的控制帧

我们目前也是只处理好Server端收到的部分,客户端也跟你相同是使用CocosCreator框架提供的WebSocket库,在iOS15 Safari仍然会有机率性出现问题,目前不确定CocosCreator官方有没有相关解法。

我们也遇到了这个问题,找到处理的办法了吗?

已基本解决,是ios15打开上述开关后,底层发包会发生拆包,也就是说你接收多次可能才收到一个完整的websocket包,我们之前底层处理过粘包(也就是一次可能接收到多个完整的websocket包),拆包没有处理好,造成解包乱掉了,也就是我上面说的不同的opcode,正常是不会有的

请问是怎么解决的,修改Nginx吗?
能不能详细介绍下

我这边游戏准备上线了,才在ios15上发现这个问题。在safari上,关闭那个开关,是能正常运行的。打开那个开关后,能正常进入游戏大厅,进入游戏大厅,什么都不做,只有心跳包和服务器交互。大概20s左右,websocket就抛出onError的错误,网络就断掉了。和服务端对过数据,没有发现拆包的现象。总之,开关打开后,进入游戏20多秒后,就会断连。请教一下,您那边是发现服务器接收了拆包数据,对拆包处理好,就解决问题了吗?

我的问题是因为NSURLSession开关打开后,close服务器,延时20多秒执行两个回调onerror和onclose回调。如果关闭NSURLSession开关,close服务器,只会回调onclose。而我在onerror中把另外的新连接的服务器置null了,导致网络断连。

后台建联的时候关闭permessage-deflate 压缩扩展
https://blog.csdn.net/qq_34425377/article/details/129810948