1. 현상
Alipay 애플릿이 xmqtt.js를 통합한 후 Android는 서버에 정상적으로 연결되어 메시지를 주고받을 수 있으며, IOS는 서버에 정상적으로 연결되지만 약간 더 긴 문자열을 받을 수 없습니다.
Alipay 애플릿의 실제 시스템 디버깅 오류AMQJS0007E Socket error:未能完成操作。(OSStatus错误-9807。)
2. 원인 분석
이는 Android와 IOS의 메시지 처리 메커니즘이 다르기 때문인 것으로 추측됩니다. 긴 메시지의 경우 IOS는 **\r\n**과 같은 개행 기호를 추가하며 일부 메시지 내용에는 **\r\n 여러 개를 추가하기도 합니다. * *. 이 \r\n을 개별적으로 처리하다 보면 여전히 문제가 있는 경우가 있기 때문에 이 **\r\n**을 일괄적으로 교체해야 합니다.
중간에 파싱 방식을 대체하는 방식, base64를 uni8Array로 변환하는 방식을 채택했는데, 안드로이드 쪽이 더 이상 작동하지 않는 걸 발견해서 정말 안타깝습니다. 최종 해결책은 다음과 같습니다
3. 솔루션
일괄 교체 개행
data = data.replace(/[\r\n]/g,"");
메시지를 수신하기 위한 해당 my.onSocketMessage 메소드는 다음과 같이 수정됩니다.
my.onSocketMessage((res) => {
if (typeof res.data === 'string') {
// let str = res.data.replace(/[\r\n]/g,"");
// let array = base64.toByteArray(str)
let buffer = Buffer.from(base64.toByteArray(res.data.replace(/[\r\n]/g,"")))
proxy.push(buffer)
} else {
var reader = new FileReader()
reader.addEventListener('load', function () {
let data = reader.result
if (data instanceof ArrayBuffer) data = Buffer.from(data)
else data = Buffer.from(data, 'utf8')
proxy.push(data)
})
reader.readAsArrayBuffer(res.data)
}
});