将 sails.io 连接到 iOS swift 应用

Connect sails.io with an iOS swift app

我正在尝试将一个简单的 iOS 应用连接到 sails.js API。 iOS 应用程序是用 swift 编写的。 sails的版本是0.11

对于网络套接字管理,我使用 https://github.com/socketio/socket.io-client-swift

class Communicate: UIViewController {

let socket = SocketIOClient(socketURL: "localhost:2000")

override func viewDidLoad() {
    super.viewDidLoad()
    self.addHandlers()
    self.socket.connect()
}

func addHandlers() {

    socket.on("connect") {data, ack in
        print("socket connected !") // This is working

        self.socket.emit("get", ["url": "/device"]) // I get the sails error
    }

}
}

在 sails.js 控制台上,我收到以下错误:

verbose: Receiving incoming message from Socket.io:  { url: '/device?__sails_io_sdk_version=0.11.0&__sails_io_sdk_platform=iOS&__sails_io_sdk_language=fr' }

error: Error (SAILS:HOOK:SOCKETS:PARSE_VIRTUAL_REQ):: Failed to parse incoming socket.io request.

details: 'Sails v0.11.x is not compatible with the socket.io/sails.io.js client SDK version you are using (0.9.0). Please see the v0.11 migration guide on http://sailsjs.org for more information.' }

我模仿sails.io的行为可能做错了什么,但我不知道如何实现。

预先感谢您的帮助。

我知道这不是最好的解决方案。 但是如果你去 node_modules\sails\node_modules\sails-hook-sockets\lib\parse-sdk-metadata.js 改变 handshake.query[SDK_META_PARAMS.version] = '0.9.0'; 到“0.11.0” 这可以解决你的问题。

无需更改服务器,您可以通过连接参数告诉服务器您符合 v0.11.0 语义:

self.socket = SocketIOClient(socketURL: baseWebSocketServerURL, options: 
[SocketIOClientOption.ConnectParams(["__sails_io_sdk_version":"0.11.0"])])

我认为这是比入侵服务器和破坏其他客户端的语义版本检查更好的解决方案。

如果其他答案不适合您,请试一试:

    let socket = SocketIOClient(socketURL: URL(string: "http://yoursailsserver.com:1337)")!, config: [.log(true), .forcePolling(true), .connectParams(["__sails_io_sdk_version":"0.11.0"])])

只需在您的套接字末尾添加 ?__sails_io_sdk_version=0.11.0 url

示例: http://www.example.com:port/?__sails_io_sdk_version=0.11.0