如何在Swift 4中连接Socket

时间:2018-04-24 12:33:19

标签: ios swift socket.io

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

  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 enter image description here,我还在info.plist中添加了App Transport Security。有帮助吗?问题是,当我传递令牌值时,它给了我错误,否则它正常工作。使用套接字时我是否需要传递令牌?

3 个答案:

答案 0 :(得分:2)

您的网址是否在HTTPS下受到保护? 如果不是,那可能是问题,因为App Transport Security限制。

请参阅Info Plist Reference

另请参阅此帖子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()为你做这个!