Как подключить клиент Starscream iOS к Java веб-серверу - PullRequest
0 голосов
/ 16 апреля 2020

Я использую Spring Boot v2.2 с правильным WebSocketHandler (). Я уверен, что сервер правильный, потому что когда я go до http://websocket.org/echo.html и пытаюсь подключиться к нашему серверу, мы можем проверить соединение как на сервере, так и в клиенте браузера.

Однако в iOS (я тестирую на 2 симуляторах - iOS 12 и iOS 13.3) я не могу подключиться. Я сейчас пытаюсь использовать Starscream. (попытка сделать это с помощью Socket.io привела к неразрешимым проблемам, а попытка сделать это с помощью SocketRocket привела к проблемам, просто заставив его работать на iOS 13.3.)

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что Starscream просто не работает тихо при попытке подключения к адресу нашего сервера java (ws: //127.0.0.1: 8080 / socket). Когда я молча говорю «сбой», я имею в виду, что на клиенте или сервере ничего не происходит, что указывает на наличие ошибки, но также при отладке я вижу, что isConnected = false в нашем сокете iOS.

Чтобы попытаться решить эту проблему, я попытался:

  • добавить App Transport Security Settings -> Allow Arbitrary Loads = YES в Info.plist.
  • добавить NSExceptionDomains -> NSExceptionAllowsInsecureHTTPLoads = YES в Info.plist.
  • с использованием localhost и 127.0.0.1, оба с /socket или / и HTTP вместо ws / wss.
  • Я даже смог эффективно запросить google.com с помощью GET запрос с использованием нативного Swift.
import Foundation
import Starscream

class WinkNetworkClient : WebSocketDelegate {
    private var isConnected : Bool = false

    init() {
        let socket: WebSocket =
            WebSocket(request:
                URLRequest(url: URL(string: "ws://127.0.0.1:8080/socket")!), certPinner: FoundationSecurity(allowSelfSigned: true))
        socket.delegate = self
        socket.connect()
        // socket.write(string: "Hi Server!")
        print("Client done")
    }

    func didReceive(event: WebSocketEvent, client: WebSocket) {
        switch event {
        case .connected(let headers):
            isConnected = true
            print("websocket is connected: \(headers)")
        case .disconnected(let reason, let code):
            isConnected = false
            print("websocket is disconnected: \(reason) with code: \(code)")
        case .text(let string):
            print("Received text: \(string)")
        case .binary(let data):
            print("Received data: \(data.count)")
        case .ping(_):
            break
        case .pong(_):
            break
        case .viabilityChanged(_):
            break
        case .reconnectSuggested(_):
            break
        case .cancelled:
            isConnected = false
        case .error(let error):
            isConnected = false
            print("error connecting to websocket: \(String(describing: error))")
        }
    }
}

Я очень растерялся относительно того, в чем может быть проблема. Что я делаю неправильно?

...