离子框架+科尔多瓦。 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 中有这个字符串 【参考方案1】:

不知道你是否解决了这个问题,但是遇到同样问题的人找到这个帖子,你可以检查这个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 版本工作正常的主要内容,如果未能解决你的问题,请参考以下文章

如何在离子科尔多瓦中添加用户跟踪授权

离子科尔多瓦键盘将离子页脚栏推离屏幕

用于普通科尔多瓦的科尔多瓦离子插件?

离子科尔多瓦文件传输插件超时错误代码3

使用此命令在移动设备中运行离子应用程序时出错(离子科尔多瓦运行安卓)

尽管成功运行了离子资源命令,离子应用程序图标和闪屏仍显示科尔多瓦默认图标