ионный каркас + кордова. WebSocket не работает в версии выпуска Android, но отладочная версия работает правильно

С этими журналами:

Соединение WebSocket с «wss://xxxxxx.net/» не удалось: рукопожатие открытия WebSocket было отменено»

«TransportWebSocket.errorHandler — ошибка {}»

«TransportWebSocket.closeHandler — ошибка {«код»: 1006, «текст»: «»}»

Пожалуйста, помогите с этой проблемой.

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;
        }
    };

person Dmytro Korchevskyi    schedule 02.02.2017    source источник
comment
Не могли бы вы поделиться своим кодом?   -  person Doron Yakovlev-Golani    schedule 02.02.2017
comment
Я добавил код модуля   -  person Dmytro Korchevskyi    schedule 02.02.2017
comment
У вас есть сетевые разрешения?   -  person Doron Yakovlev-Golani    schedule 02.02.2017
comment
Да, у меня есть эта строка в AndroidManifest.xml ‹uses-permission android:name=android.permission.INTERNET /›   -  person Dmytro Korchevskyi    schedule 03.02.2017


Ответы (1)


Я не знаю, решили ли вы эту проблему, но для людей, столкнувшихся с той же проблемой и нашедших этот поток, вы можете проверить это выпуск Cordova ведет себя иначе, чем отладка в отношении SSL

Короче говоря, измените файл, который меняет поведение между отладкой и выпуском: platforms/android/CordovaLib/src/org/apache/cordova/engine/SystemWebViewClient.java

Закомментируйте содержимое метода onReceivedSslError и замените его на

handler.proceed();
return;
person Kaixin    schedule 13.08.2017