iOS 模拟器内的 Expo React Native 应用程序使用 socket.io 保持重新连接
Expo React Native application inside of iOS Simulator keeps reconnecting using socket.io
堆栈是 atm VueJS
,React 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.4
的 downgrading 到 2.1.1
解决了这个问题。
堆栈是 atm VueJS
,React 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.4
的 downgrading 到 2.1.1
解决了这个问题。