Я использую 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))")
}
}
}
Я очень растерялся относительно того, в чем может быть проблема. Что я делаю неправильно?