从 Swift 中的 Socket 获取响应

Posted

技术标签:

【中文标题】从 Swift 中的 Socket 获取响应【英文标题】:Get Response from Socket in Swift 【发布时间】: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。那它有用吗? 【参考方案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>

【讨论】:

以上是关于从 Swift 中的 Socket 获取响应的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Swift 3 中的 JSON 获取指定值

PHP:如何从 JSON 中获取变量(从 Swift iOS 应用程序发送)并以 JSON 响应

我如何从 swift4 中的字符串中获取特定的键值

如何从 iOS 应用程序中的 Node.js 服务器获取响应?

Swift 3:在 ViewDidLoad 中从服务器获取信息,当单击按钮时,等待服务器的信息响应

从json响应swift中删除数组中的双引号