Интересно, что когда я использую клиент JavaScript, я могу получать сообщения без проблем (код приведен ниже). . Это подтверждает, что серверная часть правильно отправляет сообщения. Буду признателен за любую информацию о том, что может быть причиной этой проблемы.
iOS WebSocket Manager (Starscream):
Код: Выделить всё
import Foundation
import Starscream
import SwiftUI
class WebSocketManager: WebSocketDelegate {
static let shared = WebSocketManager()
@AppStorage("userId") private var userId: String = ""
var socket: WebSocket!
var isConnected: Bool = false
var subscribedTopics: Set = []
var onMessageReceived: ((ChatMessage) -> Void)?
private init() {
connectWebSocket()
}
func connectWebSocket() {
var request = URLRequest(url: URL(string: "ws://192.168.0.80:9001/ws")!)
request.timeoutInterval = 5
if let jwtToken = TokenManager.shared.getAccessToken() {
request.setValue("Bearer \(jwtToken)", forHTTPHeaderField: "Authorization")
}
socket = WebSocket(request: request)
socket.delegate = self
socket.connect()
let friends = CoreDataFriendManager.shared.loadAllFriends()
friends.forEach { friend in
if let topicName = friend.topicName {
subscribeToMessages(with: topicName)
}
}
listenToWebSocketMessagesGlobally()
}
func sendMessage(_ message: SendMessageRequest) {
if !isConnected { return }
if let token = TokenManager.shared.getAccessToken() {
let stompMessage = """
SEND
destination:/app/send-message
content-type:application/json
Authorization: Bearer \(token)
{
"recipientId": "\(message.recipientId.uuidString)",
"encryptedMessage": "\(message.encryptedMessage)"
}
\0
"""
socket.write(string: stompMessage)
}
}
func subscribeToMessages(with topicName: String) {
if subscribedTopics.contains(topicName) { return }
let subscribeMessage = """
SUBSCRIBE
id:sub-\(topicName)
destination:/topic/messages/\(topicName)
\0
"""
socket.write(string: subscribeMessage)
subscribedTopics.insert(topicName)
}
// WebSocket-Event-Handling
func didReceive(event: WebSocketEvent, client: WebSocketClient) {
switch event {
case .connected(let headers):
print("WebSocket verbunden mit Headern: \(headers)")
isConnected = true
for topicName in subscribedTopics {
subscribeToMessages(with: topicName)
}
case .disconnected(let reason, let code):
print("WebSocket getrennt: \(reason) mit Code \(code). Versuche erneut zu verbinden.")
isConnected = false
reconnectWebSocket()
case .text(let string):
print("Empfangene WebSocket Nachricht: \(string)")
if string.contains("MESSAGE") {
let components = string.split(separator: "\n").map(String.init)
if let jsonData = components.last?.data(using: .utf8) {
do {
let serverMessage = try JSONDecoder().decode(ServerMessage.self, from: jsonData)
let chatMessage = convertServerMessageToChatMessage(serverMessage)
onMessageReceived?(chatMessage)
print("Nachricht erfolgreich dekodiert und verarbeitet: \(chatMessage)")
} catch {
print("Fehler beim Dekodieren der Nachricht: \(error)")
}
}
} else {
print("Keine gültige STOMP-Nachricht empfangen oder Nachricht nicht im erwarteten Format.")
}
case .binary(let data):
print("Binary-Daten empfangen: \(data)")
case .pong(let data):
print("Pong empfangen: \(data?.count ?? 0) bytes")
case .ping(let data):
print("Ping empfangen: \(data?.count ?? 0) bytes")
case .error(let error):
print("WebSocket-Fehler: \(error?.localizedDescription ?? "Unbekannter Fehler")")
isConnected = false
case .viabilityChanged(let viable):
print("Verbindungsfähigkeit geändert: \(viable)")
case .reconnectSuggested(let suggested):
print("Reconnect vorgeschlagen: \(suggested)")
if suggested {
reconnectWebSocket()
}
case .cancelled:
print("WebSocket abgebrochen.")
isConnected = false
default:
break
}
}
private func convertServerMessageToChatMessage(_ serverMessage: ServerMessage) -> ChatMessage {
return ChatMessage(id: serverMessage.messageId, text: serverMessage.encryptedMessage, isSentByCurrentUser: false, timestamp: serverMessage.timestamp, senderName: "TestUser")
}
}
Вот код JavaScript, который успешно получает сообщения:
Код: Выделить всё
const Stomp = require('stompjs');
const WebSocket = require('ws'); // ws-Paket verwenden
const socket = new WebSocket('ws://192.168.0.80:9001/ws');
const stompClient = Stomp.over(socket);
socket.on('open', () => console.log("WebSocket-Verbindung geöffnet"));
socket.on('close', () => console.log("WebSocket-Verbindung geschlossen"));
socket.on('error', (error) => console.error("WebSocket-Fehler:", error));
const headers = {
Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIwNjQ3OGQxZC1hZTMxLTQ0MjktYWY4ZS02ZGMzMDVlMTYwOTciLCJpYXQiOjE3Mjk5NjUxNzMsImV4cCI6MTcyOTk2ODc3M30.xPdkLLv4LArvn00jAChKjsSE5RPt5zipgYGE0CNxe5BYsAvEomhIQohodNPTJat2pMVTgn2NkauZ8K3iiOt7DA'
};
stompClient.connect(headers, function (frame) {
console.log('STOMP-Verbindung hergestellt:', frame);
stompClient.subscribe('/topic/messages/1ed08549-ade6-4baa-b741-5634b75379f4', function (message) {
console.log("Nachricht empfangen:", message.body);
console.log("Header der Nachricht:", message.headers);
console.log("Inhalt der Nachricht:", message.body);
try {
const parsedMessage = JSON.parse(message.body);
console.log("JSON-Dekodierte Nachricht:", parsedMessage);
} catch (error) {
console.error("Fehler beim Parsen der Nachricht:", error);
}
});
const messageBody = JSON.stringify({
recipientId: "dd703e8e-8df1-4d27-9676-672d8c95d326",
encryptedMessage: "Hallo von User A!"
});
console.log("Sende Nachricht:", messageBody);
stompClient.send("/app/send-message", headers, messageBody);
},
function (error) {
console.error("Verbindungsfehler mit STOMP:", error);
});
stompClient.debug = function (str) {
console.log("STOMP-DEBUG:", str);
};
Вот как сообщение выглядит в клиенте JS, и оно успешно получено :
Код: Выделить всё
STOMP-DEBUG:
Подробнее здесь: [url]https://stackoverflow.com/questions/79129353/swift-ios-client-successfully-connects-to-java-backend-via-websocket-but-fails-t[/url]