簡體   English   中英

嘗試將 swift 客戶端連接到 socket.io 服務器時收到 SSL 錯誤

[英]Receiving SSL error when trying to connect swift client to socket.io server

我正在 Node.js 中設置 Socket.io 服務器,在 Swift 中設置客戶端來實現實時聊天應用程序。

在服務器端,代碼如下:

const express = require('express');
const app = express();
const port = process.env.PORT || 8080;
const server = app.listen(port, () => {
    console.log(`A Node Js API is listening on port: ${port}`);
});
const io = require("socket.io")(server, {
    rejectUnauthorized: false
});

//set socket.io listeners
io.on('connection', (socket) => {
  console.log('a user connected');

  socket.on('disconnect', () => {
    console.log('user disconnected');
  });

  socket.on("connect_error", (err) => {
    console.log(`connect_error due to ${err.message}`);
    });
});

在客戶端,代碼如下:

import SocketIO

class SocketIOManager: NSObject {
    static let sharedInstance = SocketIOManager()
    static let manager = SocketManager(socketURL: URL(string: "https://localhost:8080")!, config: [.log(true), .compress])
    let socket = manager.defaultSocket


    func establishConnection() {
        socket.on("test") { dataArray, ack in
            print(dataArray)
        }
        socket.connect()
    }

    func closeConnection() {
        socket.disconnect()
    }
}

我在 applicationDidBecomeActive() 方法中調用 AppDelegate 中的建立連接()。 當調用建立連接()時,我收到以下 SSL 錯誤:

LOG SocketManager: Trying to reconnect
LOG SocketIOClient{/}: Handling event: reconnectAttempt with data: [-2]
LOG SocketManager: Scheduling reconnect in 25.7991450561197s
LOG SocketEngine: Starting engine. Server: https://localhost:8080
LOG SocketEngine: Handshaking
LOG SocketEnginePolling: Doing polling GET https://localhost:8080/socket.io/?transport=polling&b64=1 
...
finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." 
UserInfo={NSErrorFailingURLStringKey=https://localhost:8080/socket.io/?transport=polling&b64=1, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, 
_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <A81C6803-9CF8-4930-A6C8-0C633C165D25>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey

我已嘗試編輯 Info.plist 以更改應用程序傳輸安全設置,但我仍然收到錯誤消息。 可能出了什么問題?

對於任何為這個問題而苦惱的人,這里有一個可行的解決方案。 您應該使用.secure(true), .selfSigned(true)選項和URLAuthenticationChallenge

class ServerLiveDataSocket : NSObject
{
    
    static let shared = ServerLiveDataSocket()
    
    var manager : SocketManager!
    var socket : SocketIOClient!
    
    func initSocketService(symbols : [String], dataPovider : DataProvider)
    {
        manager = SocketManager(socketURL: URL(string: "YOUR_HTTPS_URL_ADDRESS")!, config: [.log(true),
        .compress, .secure(true), .selfSigned(true), .sessionDelegate(self)])
        socket = manager.defaultSocket
        socket.on("users", callback: { data,ack in
            print(data)
        })
        socket.on(clientEvent: .connect) { data, ack in
            self.socket.emit("userNew", userData)
        }
        socket.connect()
    }
    
    
}
extension ServerLiveDataSocket : URLSessionDelegate
{
    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM