解决uniapp的websocket连接在web和安卓正常,iOS连接不上
的问题
  承接上篇()第3个问题:在安卓app上是可以正常建⽴链接的,但是在ios app上却不⾏。虽然不⾏,但还是需要解决。
  起初查百度,很多⼈说是nginx配置,或ssl证书问题,但是我试了,iOS还是不⽣效。那么web连接和安卓连接都没问题,那么说明nginx配置没问题,ssl证书应该也没问题。
  后来到Dcloud问答及开放社区⾥看帖⼦,发现的确有很多⼈遇到这个问题,但是都没有给出切实有效的解决⽅案。
  后来查看插件市场,看到⼀个插件:,更新记录有:解决 iOS 端⽆法使⽤的问题,所以抱着试试的态度试了⼀下就解决了。
⼀、解决⽅案 - plus-websocket
  在 HTML5+ 和 WEB 环境使⽤⼩程序风格的 websocket 接⼝,⽀持 H5、5+APP、uni-app(不含⼩程序,⼩程序环境请直接使⽤ uni 接⼝)。
  也可以⽤于解决 uni-app 环境下不⽀持 ArrayBuffer 类型数据和不⽀持多个 websocket 连接的问题以及解决使⽤ websocket 后导致部分安卓设备⽩屏的问题。
1、使⽤⽅式
(1)NPM
npm i plus-websocket --save
import socket from'plus-websocket'
(2)直接下载
// 以下路径需根据项⽬实际情况填写
import socket from'../../js/plus-websocket/index.js'
2、API
  详细⽤法可参考,跟uni提供的websocket的使⽤api⼀样
SocketTask.(CALLBACK)
SocketTask.send(OBJECT)
SocketTask.close(OBJECT)
SocketTask.(CALLBACK)
SocketTask.(CALLBACK)
app开发者需要更新此app以在此ios上正常使用
socket.sendSocketMessage(OBJECT)
socket.closeSocket(OBJECT)
3、注意事项
  当在 uni-app 中使⽤时也可⽤当前 API 替换 uni-app 内置的 websocket API
// main.js
import socket from'plus-websocket'
// #ifdef APP-PLUS
Object.assign(uni, socket)
// #endif
⼆、遇到问题
  这⾥遇到⼀个问题就是:开发版正常,⽽打包⾃定义基座之后不正常的问题。怎么解决呢?
1、由于我将⾃⼰封装的 uniWebsock.js、引⼊的 stomp.js 和 plus-websocket.js 都是放在 static ⽬录下,并且在 uniWebsock.js ⾥使⽤到了import 和 Class类等 ES6 的写法。
  想到之前看⽂档时对这⽅⾯有描述,但记不清了,那么就回去看⽂档:
1、编译到任意平台时,static ⽬录下的⽂件均会被完整打包进去,且不会编译。⾮ static ⽬录下的⽂件(vue、js、css 等)只有
被引⽤到才会被打包编译进去。
2、static ⽬录下的 js ⽂件不会被编译,如果⾥⾯有 es6 的代码,不经过转换直接运⾏,在⼿机设备上会报错。
3、css、less/scss 等资源不要放在 static ⽬录下,建议这些公⽤的资源放在⾃建的 common ⽬录下。
4、HbuilderX 1.9.0+ ⽀持在根⽬录创建 ext.json、sitemap.json 等⼩程序需要的⽂件。
  那么说明我们引⼊的 js 之类的⽂件是不能放在 static ⽬录的,需要⾃建⼀个公共⽬录 js_sdk 去存放。
2、这样改了之后安卓⾃定义基座可以了,但是 iOS ⾃定义基座还是不⾏。就想到之前分享、视频播放之类的都增加了模块勾选的,所以想到这个websocket是不是也需要什么模块配置。
  查看 mainfest.json ⽂件⾥的APP模块配置,发现有个 iOS UIWebview模块
  点击详情查看是不是这个影响:
  看了之后好像也没什么影响,后来就去github查看插件的源码,发现其源码是通过创建UIWebview实现的://SocketTask.ts
  所以判断 iOS 是需要添加UIWebview⽀持的,那么勾选之后需要打包才能⽣效。勾选之后制作⾃定义基座就Ok了,使⽤wss://域名/ws/代理 iOS 也可以正常连接了。
  虽然最终是解决了,但是还是没弄清楚为啥,猜测可能是 uniapp 提供的 websocket 内部实现没兼容 iOS 的问题,有了解的⼤神希望不吝赐教。