ios15及以上webview、Safari使用Websocket断连,1006无清晰错误码

这篇具有很好参考价值的文章主要介绍了ios15及以上webview、Safari使用Websocket断连,1006无清晰错误码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


做游戏通常都会用到Websocket,这个工具在前端本身的文档( Websocket-mdn)就简单得很,原理也很简单,就是http1.1的基础上增加了长链接,封装之后监听open、message、error、close,可以主动调用send、close,通常close不会主动调用。

问题表现:

机型均为15.3以上,后测试12.5没有问题,机型范围并不具体;1006 {eventType: true} 无其他报错信息。其中eventType时浏览器事件机制的只读属性,代表被信任,无信息价值。1006是保留,用来表示期望收到状态码时连接非正常关闭,无具体指向。

定位疑似原因:

数据多帧发送存在无法正确解析和解压数据的bug

解决方式:

后台建联时关闭请求头的连接确认

定位问题思路过程记录:

1、对比前端代码运行环境问题

(虽然Android运行正常,但还是仔细些好,也方便后续提供给研究问题的人证明);
结果记录:

  • 检查前端对接websocket代码,并未启用close流程;
  • 检查接收数据后是否解码数据影响,切换解码与不接码控制变量对比,无影响;
    综上,排除前端代码问题。

2、写纯请求前端代码连接,确认是否接口部署服务问题;

结果记录:

  • 后台SYNC和正常响应验证,验证没有影响。
  • 走到固定流程会失败,对比流程变化怀疑接收字符长度引起的变化。后台通过直接切换返回无意义长度问题严重,200字符可以成功走完流程,500个字符不行,考虑可能时 MTU(最大传输单元)问题;但MTU大小通常是1500(最大可配置到9000)字节,且是接收到数据之后断连,而MTU问题则会丢失数据帧。
  • 多次验证过程中,游戏又可以走到不同的流程,因此特定流程的后台接口影响也排除,长度的嫌疑度也降低,怀疑内容可能性增大。(后续多次验证时确认)
    综上,长度是一种影响的表现,虽可作为一种解决思路,但实际表现中属于收到数据再断连,断连的引起机制还未找到;且游戏的数据结构同步已全部是关键信息,不易拆分,若使用分批次发组合数据,组合数据耗时切须维护管理,对于数据长度的拓展有一定的限制性,方案复杂没有针对性,没有实操的意义。

3、IOS连接是否有对TSL安全协议版本有要求(使用的wss协议)

结果记录:

  • 查到一份资料有提到需要使用tsl1.2,后台确认服务一致;
    综上,排除SSL证书问题问题。

4、验证iOS网络是否稳定&查阅信息是否iOS会出现频繁断连又迅速重连情况

结果记录:

  • 断网表现报错一致,继续查看;
  • iOS部分机型升级版本确实会出现Wi-Fi断连,但不会马上重连;且无websocket关键字相关;
  • 多IOS手机随机测试,多网络切换,断连现象稳定频发;
  • 使用浏览器的navigator.onLine及断网联网监听事件,websocket断连时网络并未断连;
    综上,排除网络不好原因引起。

5、自己搞个nodedemo验证纯连接问题:

结果记录:

  • 写demo测试直接断连,就很黑人问号。node库和go库的区别很大吗?
    本想研究node库深入,虽然能成大功但时间紧急,也感觉这个走向有些费力不讨好,出结果的几率小。且websocket,原理简单,看了下node的主文件没有什么切入点。

6、IOS自身多运行环境对比:QQ频道应用、QQ聊天框、safari、chrome;

  • 代理多环境运行代码,对比表现一致;
  • 以safari为关键词搜索问题时,发现有类似问题,且关掉一个内置功能 NSURLSession Websocket 即可,验证可行。
    然而QQ内部又无此功能,因此还是需要找到核心原因。
    查询Safari此功能的作用,是一个新规范的压缩中间件,也就是说是存在中间件执行有问题并内部主动关闭的情况;那么就需要验证下是否有该中间件的请求头标识。
    webview里抓不到wss请求包??QQ内部与外部的区别。QQ android是有实现新的???
    通过抓包safari对比请求头、数据等时,发现

iOS websocket 抓包工具:Charles 、 Wireshark 、mitmproxy 、Socks5 代理(付费)。本是用whistle代理抓包来着,但是不知道为什么抓不到此次的wss请求,只得在safari中查看

  • 结果预设:抓包iOS正式环境 webview 、 safari 、chrome; demo的各浏览器 ; 对比请求头
    大家的请求头应该一致,ios必须具备压缩头;假设 不建立defate压缩连接 是解决办法,那么safari的两种情况表现应该有所不同;

upgrade 逐跳(Hop-by-hop)标头,connection
Sec-WebSocket-Extensions
用于指定一个或多个请求服务器使用的协议级 WebSocket 扩展。允许在一个请求中使用多个 Sec-WebSocket-Extension 标头;结果跟在一个标头文件中包含了所有列出的扩展一样。 permessage-deflate 压缩扩展;
websocket错误码1006,前端

通过对比验证,请求头标识特点符合。那么就需要关闭这个压缩功能,还原到旧的协议版本来验证是否是压缩协议实现有问题。Safari虽提供了这个功能,但是实际运行环境的QQ并没有,因此只能找到后台,找其改掉websocket建联时请求协议商定时的确认。看了go的websocket 库,同nodejs一样无配置入口,但后台大佬不负众望,改了库内部的实现。(todo-待补充)
协议建立连接之后验证,果然不再断连。
至此,虽找到并解决了关键点,但这个关键点后面还有很多牵连的知识以及疑似内部深层次的iOS- webview实现该压缩协议失败而 Android正常的根本原因需要探索。

题外

此坑是个开发时预料之外的坑,借此记录下排查问题的过程以及网上的优秀资料和贡献者们,且整理下websocket问题排查规范流程:

  1. 网络问题:网络不稳定、断网、网络丢包等原因都可能导致websocket断连。
  2. 服务器问题:服务器故障、服务器重启等原因也可能导致websocket断连。
  3. 应用问题:应用进入后台、应用被系统强制关闭、应用崩溃等原因都可能导致websocket断连。
  4. SSL证书问题:如果websocket使用的是wss协议,那么SSL证书无效或过期也可能导致websocket断连。
  5. WebSocket协议版本不兼容:如果客户端和服务器使用的WebSocket协议版本不兼容,也可能导致websocket断连。

参考资料:
状态码报错一览表
websocket原理
基于Tomcat的Websocket范例及permessage-deflate扩展特性的研究
The WebSocket Protocol - rfc6455协议文章来源地址https://www.toymoban.com/news/detail-607857.html

到了这里,关于ios15及以上webview、Safari使用Websocket断连,1006无清晰错误码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 让iOS Safari浏览器支持油猴脚本

    Userscripts 是一款免费 iOS Safari 浏览器插件,可以兼容油猴脚本,但如果油猴脚本代码没有对手机进行适配的话可能不会生效。  1、 首先 打开设置 找到  Safari 浏览器  选择  扩展  然后 勾选  Userscripts  所有网站中 选择  允许     然后打开 Userscripts 后按照下图所示,在

    2024年02月13日
    浏览(47)
  • iOS 16.4后 Safari 开发中不能调试Web页面

    项目中有WKWebView, iPhone和模拟器 升级到16.4后 不能使用Safari 调试? 以前挺好的为啥现在不行了? 这时候有两个方案, 第一, 使用低版本模拟器 16.2 16.0 等都可以. 第二, 设置 inspectable (OC), isInspectable (Swift) ---------------------- 官方文档 isInspectable | Apple Developer Documentation 简单的说,在

    2024年02月15日
    浏览(40)
  • react-native-webview使用postMessage后H5不能监听问题(iOS和安卓的兼容问题)

     chatgpt: https://chat.xutongbao.top/ 参考链接: https://blog.csdn.net/liuxingyuzaixian/article/details/125199131 https://chat.xutongbao.top/

    2024年02月12日
    浏览(28)
  • 苹果IOS安装IPA, plist形式 Safari 浏览器点击安装

    苹果开发者账号链接 网址: https://developer.apple.com/account 苹果应用上架链接 网址: https://appstoreconnect.apple.com/ 应用证书文件及打包 参考教程: 最新uniapp打包IOS详细步骤(2022) 证书在线制作工具 网址: https://app.121xuexi.com/ iPhone直接安装IPA 可以使用 爱思助手 - 应用游戏 - 导入安装

    2024年02月08日
    浏览(63)
  • iOS websocket接入的简单使用

    接触WebSocket 考虑到普通的HTTP 通信方式只能由客户端主动拉取,服务器不能主动推给客户端 。然后就想出的2种解决方案。 1.和后台沟通了一下 他们那里使用的是WebSocket ,所以就使用WebSocket让我们app端和服务器建立长连接。这样就可以事实接受他发过来的消息 2.使用推送,也

    2024年02月02日
    浏览(25)
  • iOS 17中的Safari配置文件改变了游戏规则,那么如何设置呢

    Safari在iOS 17中最大的升级是浏览配置文件——能够在一个应用程序中创建单独的选项卡和书签组。这些也可以跟随你的iPad和Mac,但在本指南中,我们将向你展示如何使用运行iOS 17的iPhone。 你可能有点困惑,为什么Safari中没有明显的位置可以添加个人资料,我们当然也是。诀

    2024年02月09日
    浏览(33)
  • UserScripts Safari 苹果iOS上特别好用且免费的脚本插件,五分钟学会

    JavaScript yyds。如果你喜欢用 Chrome for iOS,那么你也可以试试通过 QuantumultX/Surge 等代理工具及其提供的方法为网站的特定网页嵌入 JavaScript 用户脚本,用于移除网页上的广告或加速视频广告跳过等;(参阅本文附注) Userscripts 是一款免费 iOS Safari 浏览器插件,可以兼容油猴脚

    2023年04月22日
    浏览(37)
  • WebSocket之socket.io的基本使用

     Socket.IO 是一个WebSocket库,可以在客户端和服务器之间实现低延迟、双向和基于事件的通信。它建立在 WebSocket 协议之上,并提供额外的保证,例如回退到 HTTP 长轮询或自动重新连接。 基本使用 安装socket.io yarn add socket.io  新建js文件与html文件内容如下 这个时候启动node后,

    2024年02月08日
    浏览(28)
  • QT新版本安装(5.15以上)——Qt 镜像网站——Qt5.15.2镜像安装

    由于QT版本升级到6.以上版本,在线安装可能找会存在找不到到相关想要的版本。如5.15的版本。 解决办法:还采用在线安装的方法,添加版本的镜像路径(URL)的方法进行安装。 在线安装软件连接: 链接:https://pan.baidu.com/s/1sXqYhfHNNmKCzJf4Xdd0Zg?pwd=o2j2  提取码:o2j2 中国科学技

    2024年04月13日
    浏览(31)
  • ios全屏模式下避免跳转到safari浏览器,在苹果safari上实现全屏效果(让web页面以独立app的形式运行)

    你可能不知道的一个功能:web 单页面应用可以在手机端以类似独立 app 的形式运行。 就像下面这样, 没有上下的工具栏 切换的时候跟普通 app 没什么不同 苹果官方对 safari可用 meta 标签的说明 Safari HTML Reference - Supported Meta Tags 只需要添加下面一行即可 添加meta标签,打开谷歌

    2024年02月09日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包