iOS 模拟器内的 Expo React Native 应用程序使用 socket.io 保持重新连接

Expo React Native application inside of iOS Simulator keeps reconnecting using socket.io

堆栈是 atm VueJSReact Native 使用 Expo,后端使用 NestJS。为方便起见,this repo 包含 VueJS 和 NestJS 部分的工作示例。 React Native端的连接(简化版)是这样实现的:

export const useSubscribeToWebsocket = (token: string) => {
  const { socketUrl } = usePlatform()

  useEffect(() => {
    console.log('open')
    const socket = io(socketUrl)

    socket.on('connect', () => {
      console.log('connect')
      socket.send(JSON.stringify(authenticate(token)))
    })

    socket.on('error', (error: any) => {
      dlog('error connection=> ', error)
    })

    socket.on('event', (socketEvent: any) => {
      console.log('event ', socketEvent)
    })

    return () => {
      socket.close()
    }
  }, [token])

  return null
}

网关(套接字服务器)看起来很简单:

@WebSocketGateway()
export class AppGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
  @WebSocketServer() server: Server;
  private logger: Logger = new Logger('AppGateway');

  @SubscribeMessage('msgToServer')
  handleMessage(client: Socket, payload: string): void {
    this.server.emit('msgToClient', payload);
  }

  afterInit(server: Server) {
    this.logger.log('Init');
  }

  handleDisconnect(client: Socket) {
    this.logger.log(`Client disconnected: ${client.id}`);
  }

  handleConnection(client: Socket, ...args: any[]) {
    this.logger.log(`Client connected: ${client.id}`);
  }
}

问题在于,虽然移动客户端仅连接一次(useEffect 挂钩被调用一次,除 open 外没有其他日志),handleConnection 不断记录客户端正在连接不同的 ID。 connect 也从未在 RN 端登录,所以我想它永远不会连接。 我用 VueJS 客户端测试了它,它只连接了一次(在后端也工作正常),一切正常。

是否只是模拟器的问题?有办法解决吗?

目前,3.0.4downgrading2.1.1 解决了这个问题。