离子框架+科尔多瓦。 WebSocket 在 android release 版本中不工作,但 debug 版本工作正常
Posted
技术标签:
【中文标题】离子框架+科尔多瓦。 WebSocket 在 android release 版本中不工作,但 debug 版本工作正常【英文标题】:ionic framework + cordova. WebSocket is not working in the android release version, but the debug version works correctly 【发布时间】:2017-02-02 15:37:33 【问题描述】:有了这些日志:
与“wss://xxxxxx.net/”的 WebSocket 连接失败:WebSocket 打开握手被取消”
“TransportWebSocket.errorHandler - 错误”
"TransportWebSocket.closeHandler - 错误 "code":1006,"text":"""
请帮助解决这个问题。
sp.external.TransportWebSocket = function ()
var self = this;
var socket = null;
var isOpen = false;
var listSendMsg = [];
this.openHandler = null;
this.closeHandler = null;
this.messageHandler = null;
this.errorHandler = null;
this.serverURL = '';
this.send = function (_data, _highPrioritetFlag)
utils.logger.debug('TransportWebSocket', 'send', 'Open status:' + isOpen);
_highPrioritetFlag = _highPrioritetFlag || false;
if (isOpen)
if (_data && typeof _data === 'object')
try
socket.send(JSON.stringify(_data));
catch (error)
throw new Error('Invalid JSON stringify');
else
throw new Error('The data sent must be an object');
else
if (_highPrioritetFlag)
listSendMsg.unshift(_data);
else
listSendMsg.push(_data);
openSocket();
;
this.reopen = function ()
utils.logger.debug('TransportWebSocket', 'reopen');
openSocket();
;
this.close = function (_code)
utils.logger.debug('TransportWebSocket', 'close');
socket.close(_code);
;
function procListMsg()
utils.logger.debug('TransportWebSocket', 'procListMsg', 'Processing buffer messages, items:' + listSendMsg.length);
if (listSendMsg.length > 0)
self.send(listSendMsg.shift());
setTimeout(procListMsg, 20);
function openHandler()
utils.logger.debug('TransportWebSocket', 'openHandler', 'WebSocket.readyState:' + socket.readyState);
if (socket.readyState === WebSocket.OPEN)
isOpen = true;
procListMsg();
if (self.openHandler)
self.openHandler();
function closeHandler(error)
utils.logger.debug('TransportWebSocket', 'closeHandler', 'Error', code: error.code, text: error.reason);
isOpen = false;
if (socket.readyState === WebSocket.CLOSED)
if (self.closeHandler)
self.closeHandler(error);
function errorHandler(error)
utils.logger.debug('TransportWebSocket', 'errorHandler', 'Error', code: error.code, text: error.reason);
isOpen = false;
if (self.errorHandler)
self.errorHandler(error);
function messageHandler(e)
var msg = null;
if (self.messageHandler)
try
msg = JSON.parse(e.data);
catch (error)
throw new Error('Invalid JSON format in response: ' + e.data);
self.messageHandler(msg);
function openSocket()
utils.logger.debug('TransportWebSocket', 'openSocket', 'Opening');
socket = new WebSocket(self.serverURL);
socket.onopen = openHandler;
socket.onclose = closeHandler;
socket.onmessage = messageHandler;
socket.onerror = errorHandler;
;
【问题讨论】:
你能分享你的代码吗? 我添加了模块的代码 你有网络权限吗? 是的,我在 androidManifest.xml 中有这个字符串不知道你是否解决了这个问题,但是遇到同样问题的人找到这个帖子,你可以检查这个cordova "release" behaves differently to "debug" regarding SSL
简而言之,修改使调试和发布行为不同的文件:
platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java
注释掉方法onReceivedSslError
的内容,替换为
handler.proceed();
return;
【讨论】:
以上是关于离子框架+科尔多瓦。 WebSocket 在 android release 版本中不工作,但 debug 版本工作正常的主要内容,如果未能解决你的问题,请参考以下文章