我想将我的应用程序连接到套接字,这里是代码: -
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()
并且我没有使用localhost网址,但我的应用程序仍未连接到套接字我认为我已遵循此How to connect with Socket.io? Swift 4 ,我还在info.plist中添加了App Transport Security。有帮助吗?问题是,当我传递令牌值时,它给了我错误,否则它正常工作。使用套接字时我是否需要传递令牌?
答案 0 :(得分:2)
您的网址是否在HTTPS下受到保护? 如果不是,那可能是问题,因为App Transport Security限制。
另请参阅此帖子here。
如果那不是问题。我建议检查双方,服务器和客户端上的Socket版本是否相同。最近我遇到了一个问题。
希望它有所帮助!
答案 1 :(得分: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)
}
}
答案 2 :(得分:1)
您应该在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()
关键是你应该在viewController中对manager属性做一个强引用,并static let shared = SocketIOManager()
为你做这个!