Сокет.ввод-вывод с помощью Swift не является рукопожатием

#node.js #swift #websocket #swiftui #socket.io-1.0

#node.js #swift #websocket #swiftui #socket.io-1.0

Вопрос:

Я пытаюсь интегрировать приложение iOS с Node.js Сервер WebSocket. Я использую SwiftUI для iOS и сокета.ввод-вывод как для сервера, так и для клиента.

Но когда я пытаюсь подключить приложение iOS к серверу, кажется, что оно не подключается к серверу.

Я проверил, работает ли сервер, подключив приложение React к Node.js сервер и соединение отлично работают с браузером.

Я проверил журналы swift, и, похоже, он пытается установить связь с сервером, но начинается длительный опрос, поэтому я предполагаю, что в процессе установления связи есть какая-то проблема.

Я регистрирую «новое соединение» в консоли в виде строки в Node.js сервер, если есть новое соединение, и он нормально работает для React, но не для Swift.

Но я не пытаюсь ничего продвигать, поэтому не могу выяснить, что не так.

Может кто-нибудь мне помочь, пожалуйста?

 import SwiftUI
import SocketIO

final class Service: ObservableObject {
    private var manager = SocketManager(socketURL:URL(string: "http://localhost:5000")!, config: [.log(true), .compress])
    
    init() {
        let socket = manager.defaultSocket
        socket.on(clientEvent: .connect)  { (data,act) in
            print("Connected")
        }
        socket.connect()
    }
}

struct SocketIO: View {
    @ObservedObject var service = Service()
    var body: some View {
        Text("Hello, Web socket!")
    }
}
 

Это журнал, который я получаю от SocketIO-client-swift

2020-12-18 13:08:24.033132 0900 тестов[4397:171225] LOG SocketIOClient{/}: добавление обработчика для события: подключение 2020-12-18 13:08:24.033663 0900 тестов[4397:171225] LOG SocketIOClient{/}: Обработка события: изменение состояния с данными: [подключение, 2] 2020-12-18 13:08:24.033811 0900 тестов[4397:171225] LOG SocketIOClient{/}: присоединение к пространству имен / 2020-12-18 13:08:24.033930 0900 тестов [4397:171225] LOG SocketManager: пытался подключить сокет, когда движок не открыт. Подключение 2020-12-18 13:08:24.034033 0900 тестов[4397:171225] ЖУРНАЛ SocketManager: добавление движка 2020-12-18 13:08:24.035507 0900 тестов[4397:171427] ЖУРНАЛ SocketEngine: запуск двигателя. Сервер: http://localhost:5000 2020-12-18 13:08:24.035608 0900 тестов[4397:171427] LOG SocketEngine: рукопожатие 2020-12-18 13:08:24.038113 0900 тестов [4397:171427] LOG SocketEnginePolling: выполнение опроса GET http://localhost:5000/socket.io/?transport=pollingamp;b64=1 2020-12-18 13:08:24.125554 0900 Тесты[4397:171431] [] nw_protocol_get_quic_image_block_invoke dlopenсбой libquic 2020-12-18 13:08:24.166652 0900 тестов [4397:171427] LOG SocketEnginePolling: получен ответ на опрос 2020-12-18 13:08:24.166801 0900 тестов [4397:171427] LOG SocketEnginePolling: получено сообщение об опросе: 0{«sid»:»97Fb8N3Ub5ZuRlfHAAAA», «обновления»: [«websocket»], «pingInterval»: 25000, «pingTimeout»:5000} 2020-12-18 13:08:24.168076 0900 Тесты[4397:171427] LOG SocketEngine: Получено сообщение: 0{«sid»: «97Fb8N3Ub5ZuRlfHAAAA»,»обновления»: [«websocket»],»pingInterval»: 25000,»pingTimeout»:5000} 2020-12-18 13:08:24.171813 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: ping с данными: [] 2020-12-18 13:08:24.171845 0900 тестов [4397:171427] ЖУРНАЛ SocketEnginePolling: выполнение опроса GET http://localhost:5000/socket.io/?transport=pollingamp;b64=1amp;sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.172148 0900 тестов[4397:171225] LOG SocketManager: двигатель открыт Подключение 2020-12-18 13:08:24.172267 0900 тестов[4397:171225] LOG SocketIOClient{/}: Сокет подключен 2020-12-18 13:08:24.172485 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: изменение состояния с данными: [подключено, 3] 2020-12-18 13:08:24.172704 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: соединение с данными: [«/»]Подключено 2020-12-18 13:08:24.174125 0900 тестов[4397:171427] LOG SocketEngine: запись опроса: есть данные: false 2020-12-18 13:08:24.174260 0900 тестов[4397:171427] LOG SocketEnginePolling: отправка опроса: как тип: 2 2020-12-18 13:08:24.174607 0900 Тесты[4397:171427] ЖУРНАЛ SocketEnginePolling: создана строка сообщения: 1:2 2020-12-18 13:08:24.175188 0900 Тесты[4397:171427] LOG SocketEnginePolling: публикация 2020-12-18 13:08:24.175708 0900 Тесты[4397:171427] LOG SocketEnginePolling: выполнениесообщение для опроса http://localhost:5000/socket.io/?transport=pollingamp;b64=1amp;sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.181566 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: websocketUpgrade с данными: [[«обновление»: «websocket», «подключение»: «Обновление», «sec-websocket-accept»: «DK4ZA/luKjOL11P 2vm4APQNE5I=»]] 2020-12-18 13:08:24.181780 0900 Тесты[4397:171429] ЖУРНАЛ SocketEngineWebSocket: Отправка ws: зонда в качестве типа: 2 2020-12-18 13:08:24.183557 0900 Тесты[4397:171431] LOG SocketEnginePolling: Получен ответ на опрос 2020-12-18 13:08:24.183723 0900 Тестов[4397:171431] ЖУРНАЛ SocketEnginePolling: выполнение опроса GET http://localhost:5000/socket.io/?transport=pollingamp;b64=1amp;sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.184529 0900 тестов [4397:171427] РЕГИСТРАЦИЯ SocketEngine: ожидание промывки зонда 2020-12-18 13:08:24.186620 0900 тестов [4397:171428] ОШИБКА SocketEnginePolling: ошибка при длительном запросе опроса 2020-12-18 13:08:24.186736 0900 тестов [4397:171428] ОШИБКА SocketEngine: ошибка 2020-12-18 13:08:24.186892 0900 тестов [4397:171225] ОШИБКА SocketManager: ошибка 2020-12-18 13:08:24.186907 0900 тестов [4397:171428] ЖУРНАЛ SocketEngine: двигатель закрывается. 2020-12-18 13:08:24.187029 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: ошибка с данными: [«Ошибка»] 2020-12-18 13:08:24.187306 0900 Тесты[4397:171428] LOG SocketEnginePolling: Созданная строка СООБЩЕНИЯ: 1:1 2020-12-18 13:08:24.187548 0900 тестов[4397:171428] ЖУРНАЛ SocketEnginePolling: выполнение опроса POST http://localhost:5000/socket.io/?transport=pollingamp;b64=1amp;sid=97Fb8N3Ub5ZuRlfHAAAA 2020-12-18 13:08:24.188161 0900 тестов[4397:171225] ЖУРНАЛ SocketManager: запуск повторного подключения 2020-12-18 13:08:24.188342 0900 тестов[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: изменение состоянияс данными: [подключение, 2] 2020-12-18 13:08:24.188558 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: повторное подключение к данным: [«Ошибка»] 2020-12-18 13:08:24.188729 0900 Тесты[4397:171225] ЖУРНАЛ SocketManager: попытка повторного подключения2020-12-18 13:08:24.188830 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: повторное подключение к данным: [-1] 2020-12-18 13:08:24.189043 0900 тестов [4397:171429] ЖУРНАЛ SocketEngine: запуск двигателя. Сервер: http://localhost:5000 2020-12-18 13:08:24.189113 0900 тестов[4397:171225] LOG SocketManager: планирование повторного подключения в 15.068159317825785s 2020-12-18 13:08:24.189439 0900 тестов[4397:171429] LOG SocketEngine: рукопожатие 2020-12-18 13:08:24.189732 0900 тестов[4397:171429] LOG SocketEnginePolling:Выполнение опроса ПОЛУЧАЕТ http://localhost:5000/socket.io/?transport=pollingamp;b64=1 2020-12-18 13:08:24.197564 0900 тестов[4397:171432] LOG SocketEnginePolling: получен ответ на опрос 2020-12-18 13:08:24.197690 0900 тестов[4397:171432] LOG SocketEnginePolling: получено сообщение опроса: 0{«sid»: «7RPKclRosgovPKY5AAAB», «обновления»: [«websocket»],»pingInterval»: 25000, «pingTimeout»:5000} 2020-12-18 13:08:24.197839 0900 Тесты[4397:171432] ЖУРНАЛ SocketEngine: Получено сообщение: 0{«sid»: «7RPKclRosgovPKY5AAAB», «обновления»: [«websocket»], «pingInterval»: 25000, «pingTimeout»:5000} 2020-12-18 13:08:24.198569 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: ping с данными: [] 2020-12-18 13:08:24.198587 0900 Тесты[4397:171432] LOG SocketEnginePolling: Выполнение опроса GET http://localhost:5000/socket .io /?transport=опросamp;b64=1amp;sid=7RPKclRosgovPKY5AAAB 2020-12-18 13:08:24.198671 0900 тестов[4397:171225] LOG SocketManager: открыто подключение к движку 2020-12-18 13:08:24.198848 0900 тестов[4397:171225] LOG SocketIOClient{/}: подключен сокет 2020-12-18 13:08:24.198848 0900 тестов[4397:171225] LOG SocketIOClient{/}: подключен сокет 2020-12-18 13:08:24.199022 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: изменение состояния с данными: [подключено, 3] 2020-12-18 13:08:24.199197 0900 Тесты[4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: соединение с данными: [«/»]Подключено 2020-12-18 13:08:24.199445 0900 тестов [4397:171432] LOG SocketEngine: запись опроса: есть данные: false 2020-12-18 13:08:24.199714 0900 тестов[4397:171432] LOG SocketEnginePolling: отправка опроса: как тип: 2 2020-12-18 13:08:24.199973 0900 Тесты[4397:171432] ЖУРНАЛ SocketEnginePolling: создана строка сообщения: 1:2 2020-12-18 13:08:24.200257 0900 Тесты[4397:171432] LOG SocketEnginePolling: публикация 2020-12-18 13:08:24.200524 0900 Тесты[4397:171432] LOG SocketEnginePolling: выполнение опроса http://localhost:5000/socket.io/?transport=pollingamp;b64=1amp;sid=7RPKclRosgovPKY5AAAB 2020-12-18 13:08:24.205180 0900Тесты [4397:171225] ЖУРНАЛ SocketIOClient{/}: Обработка события: WebSocket upgrade с данными: [[«обновление»: «websocket», «подключение»: «Обновление», «sec-websocket-accept»: «e5m4DoLk6GlrzUzZSHtQ/n0gXl0=»]] 2020-12-18 13:08:24.205309 0900 Тесты[4397:171429]ЖУРНАЛ SocketEngineWebSocket: отправка ws: probe как тип: 2 2020-12-18 13:08:24.207171 0900 Тесты[4397:171429] LOG SocketEngine: получено сообщение: 3probe 2020-12-18 13:08:24.207420 0900 Тесты[4397:171429] LOG SocketEngine: получен ответ на запрос, следует обновить до WebSockets 2020-12-18 13:08:24.207622 0900 тестов[4397:171429] LOG SocketEngine: обновление транспорта до WebSockets 2020-12-18 13:08:24.209704 0900 тестов[4397:171429] LOG SocketEnginePolling: отправка опроса: как тип: 6 2020-12-18 13:08:24.210114 0900 Тесты[4397:171225] ВОЙТИ в SocketIOClient{/}: Обработка события: pong с данными: [] 2020-12-18 13:08:24.210826 0900 Тесты[4397:171431] LOG SocketEngine: ожидание промывки зонда 2020-12-18 13:08:24.211131 0900 Тесты[4397:171431] LOG SocketEnginePolling: получен ответ на опрос 2020-12-18 13:08:24.211279 0900 Тесты[4397:171431] ЖУРНАЛ SocketEngine: переход на WebSockets 2020-12-18 13:08:24.211500 0900 тестов[4397:171431] ЖУРНАЛ SocketEngineWebSocket: отправка ws: как тип: 5 2020-12-18 13:08:24.211974 0900 Тесты[4397:171431] LOG SocketEngine: ожидание промывки датчика

Ответ №1:

Это может быть связано с безопасностью. Обычно приложения ios ожидают подключения с использованием https. Чтобы разрешить http-соединения, в вашем info.plist добавьте это (временное исправление безопасности):

 <key>NSAppTransportSecurity</key>
<dict>

 <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>
 

Комментарии:

1. спасибо за комментарий, но я уже отредактировал info.plist. И я проверил, может ли симулятор подключаться к серверу, возвращая HTML-код с того же node.js сервер по маршрутизатору, и я могу видеть это из UIRepresentable WebView, поэтому я предполагаю, что дело не в самом соединении. Но все равно спасибо за ответ;)

2. вы могли бы попробовать config: [.forceWebsockets(true), .log(true)])

3. Я передал .forceWebsockets (true), и кажется, что журналы изменились, но все еще работают не так, как ожидалось, оператор печати запускается, но он продолжает появляться. Кажется, что он пытается подключить WebSocket без опроса, но все равно продолжает терпеть неудачу. И серверная часть, похоже, не распознает соединение.

4. Я пробовал другие фреймворки, такие как «Apple Network-> NWConnection» и «WebSocket» по адресу: github.com/shareup/websocket-apple и оба они хорошо работают в моем тесте. Но я не мог заставить «SocketIO» подключиться к «wss: // echo.websocket.org», например. В часто задаваемых вопросах «SocketIO» говорится; «Эта библиотека НЕ является библиотекой WebSockets». Кажется, что с «SocketIO» много проблем, может быть, что-то сломано.

5. О, это? спасибо за информацию! Я все еще пытался использовать SocketIO, так что это действительно помогло мне! Если это возможно, я хотел бы использовать фреймворк той же стороны, но я думаю, какая работа лучше. Большое спасибо 🙂