如何在Swift 4中连接Socket

4

我想将我的应用连接到套接字,这是代码:

  import UIKit
  import SocketIO

 class SocketIOManager: NSObject {
static let manager = SocketManager(socketURL: URL(string: "myURL")!)
static let socket = manager.defaultSocket


class func connectSocket() {
    let token = UserDefaults.standard.getAccessToken()

    self.manager.config = SocketIOClientConfiguration(
        arrayLiteral: .connectParams(["token": token]), .secure(true) // problem is here in passing token value
        )
        socket.connect()
}

class func receiveMsg() {
    socket.on("new message here") { (dataArray, ack) in

        print(dataArray.count)

    }
}
}

我创建了一个名为SocketIOManager.swift的新类,并在视图控制器中调用我的函数。
  SocketIOManager.connectSocket()

我没有使用本地主机URL,但我的应用程序仍未连接到套接字。我认为我遵循了这个如何使用Socket.io连接?Swift 4输入图像描述,并在info.plist中添加了App Transport Security。有什么帮助吗?问题是当我传递令牌值时,它会给我一个错误,否则它可以正常工作。当使用套接字时,我需要传递令牌吗?


1
很明显URL存在问题。请尝试通过http://amritb.github.io/socketio-client-tool/进行连接,并告诉我连接是否成功。 - a.masri
它正在显示已连接。 - viper
套接字部署本地主机还是服务器? - a.masri
我正在使用服务器URL。 - viper
让我们在聊天中继续这个讨论 - viper
显示剩余2条评论
3个回答

4
你应该在你的SocketIOManager类中创建一个共享属性,像这样:
static let shared = SocketIOManager()

然后像这样创建init()

    var socket: SocketIOClient!

    // defaultNamespaceSocket and swiftSocket both share a single connection to the server
    let manager = SocketManager(socketURL: URL(string: "http://localhost:3000")!, config: [.log(true), .compress])

    override init() {
        super.init()

        socket = manager.defaultSocket
        }

最后,您需要像这样编写您的方法:

func connectSocket() {
    let token = UserDefaults.standard.getAccessToken()

    self.manager.config = SocketIOClientConfiguration(
        arrayLiteral: .connectParams(["token": token]), .secure(true)
        )
        socket.connect()
}

func receiveMsg() {
    socket.on("new message here") { (dataArray, ack) in

        print(dataArray.count)

    }
}

然后像这样调用您的方法:

SocketIOManager.shared.connectSocket()

重点在于您应该在您的视图控制器中对管理属性进行强引用,并使用static let shared = SocketIOManager()让它为您完成!

错误 SocketEngine:发生了 SSL 错误,无法与服务器建立安全连接。我收到了这个错误信息。 - viper
我认为这是AppTransport安全错误。不是吗? 你设置正确了吗? - Seyed Samad Gholamzadeh
不是我做了应用程序传输需要的事情。 - viper
所以请连接到您的服务器管理器,并检查是否有其他连接服务器的配置。 - Seyed Samad Gholamzadeh
1
这是正确的,但我想知道一件事,是否有必要传递令牌? - viper
谢谢,兄弟。".connectParams(["token": token])"拯救了我的生命!:) - Hot'n'Young

2

试试这个例子:

 let manager = SocketManager(socketURL: URL(string: 
 "http://xxxxxxxxx.com")!, config: [.log(true), .compress])
 var socket = manager.defaultSocket

socket.connect()
    socket.on(clientEvent: .connect) {data, ack in
        print("socket connected")
        self.gotConnection()
       }
    }

 func gotConnection(){

 socket.on("new message here") { (dataArray, ack) in

    print(dataArray.count)

     }
   }

你做了哪些更改? - viper
我的代码可以运行,但是当我传递令牌值时它不起作用。 - viper
socket.on(client: SocketEngineClient, url: URL, options: [String : Any]?) in } - Pramod Reddy
传递 URL 和选项,在连接套接字到服务器后尝试在该位置发送令牌。 - Pramod Reddy

2
您的URL是否使用HTTPS进行了安全保护? 如果没有,这可能是问题所在,因为受到了应用程序传输安全限制。
请参见Info Plist Reference 此外,还可以参考此文章here
如果那不是问题所在。我建议检查服务器和客户端两端的套接字版本是否相同。最近我就因为这个问题遇到了麻烦。
希望能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接