【问题标题】:Get Response from Socket in Swift从 Swift 中的 Socket 获取响应
【发布时间】:2020-07-26 00:58:51
【问题描述】:

我正在尝试将 Socket 集成到我的应用程序中以进行实时聊天。后端是在 node.js 上完成的,前端是在 React 上开发的,两者都运行良好。

我在我的 Swift 项目中添加套接字时遇到问题。

在下面的aaHandlers() 函数中,我希望得到一个 JSON 响应,其中包含 4 个用户的详细信息。它在 Web 应用程序中运行良好,但在 Swift 中却不行。我做得对吗?

这里是代码

import Foundation
import SocketIO


let manager = SocketManager(socketURL: URL(string: "https://chatsapi.dummyUrl.io")!, config: [.log(true), .compress])
 let socket = manager.defaultSocket
 let socketConnectionStatus = socket.status

class SocketIOManager: NSObject {

    static let sharedInstance = SocketIOManager()

    override init() {
        super.init()

    }

    func addHandlers() {
        socket.on("get_all_user_list") { (data, ack) in
            print("KK get_all_user_list", data,ack) // this line never gets called. I tried putting breakpoints.
        }
    }


    func establishConnection() {
        socket.connect()
    }


    func closeConnection() {
        socket.disconnect()
    }

}

P.S:套接字已连接。

这是我在控制台中得到的:

> 2020-04-13 18:14:05.790193+0530 SocketTry[41289:9400138] LOG
> SocketIOClient{/}: Adding handler for event: get_all_user_list

【问题讨论】:

  • 您可以在您的机器上本地安装一个最小的节点程序并从那里测试它 (npm install --save socket.io),例如打电话给socket.emit('get_all_user_list', '<some json>');。然后将 Swift 程序中的 URL 更改为 http://localhost:3000。那它有用吗?

标签: ios swift xcode sockets socket.io


【解决方案1】:

请检查您是否在套接字中使用任何身份验证。如果您使用身份验证,则需要在您的 swift 代码中设置配置。 这里 AUTHTOKEN 是您从服务器的登录响应中收到的用户令牌。您从服务器的登录响应中收到的 AUTH_USER_ID。


class SocketIOManager: NSObject {

    static let sharedInstance = SocketIOManager()

    override init() {
        super.init()
        initialize()
    }

    func initialize() {

        let socketUrl = "https://chatsapi.dummyUrl.io"

        let specs: SocketIOClientConfiguration = [
            .log(true),
            .connectParams(getConnectionParam())]
        socketManager = SocketManager(socketURL: URL(string: socketUrl)!, config: specs)
        socket = socketManager?.defaultSocket
    }

    func getConnectionParam() -> [String: Any] {
            return ["auth": "AUTHTOKEN", "user_id": "AUTH_USER_ID", "timeZone": "\(Date().localTimeZoneName)"]
    }

    func addHandlers() {
        socket.on("get_all_user_list") { (data, ack) in
            print("KK get_all_user_list", data,ack) // this line never gets called. I tried putting breakpoints.
        }
    }


    func establishConnection() {
        socket.connect()
    }


    func closeConnection() {
        socket.disconnect()
    }

}

【讨论】:

    【解决方案2】:

    确保您在应用激活时已建立与服务器的连接。

    func applicationDidBecomeActive(application: UIApplication) {
        SocketIOManager.sharedInstance.establishConnection()
    }
    

    还有一个重要的提示:每次服务器发送用户列表时,Socket.IO都会自动调用上面的socket.on(...)方法。 p>

    【讨论】:

      猜你喜欢
      • 2017-07-28
      • 1970-01-01
      • 2020-02-02
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 2019-01-08
      • 2015-11-15
      相关资源
      最近更新 更多