在iOS Swift 3中使用socket.io

通常,大多数iOS / Android应用程序都与服务器通信以交换数据。 服务器实现并提供RESTful API,应用程序可使用该API进行通信。 当应用需要将数据发送到服务器或从服务器获取数据时,它会发出正确的请求,并在一段时间后返回数据。 在应用运行期间,这种情况会发生多次。 幸运的是,当有必要立即从服务器接收数据时(每次这些数据可用时),而无需让应用程序向服务器发送任何请求, socket.io是更好的解决方案。

传统上,使用流行的Web应用程序堆栈(例如LAMP)编写实时应用程序非常困难,这涉及轮询服务器的更改,跟踪时间戳,并且比预期的要慢得多。 Socket.IO是一个用于实时Web应用程序(即时通讯程序,推送通知,在线游戏)的JavaScript库

传统上,套接字是围绕其构建大多数实时系统的解决方案,可在客户端和服务器之间提供双向通信通道。 这意味着服务器可以将消息推送到客户端。 每当发生事件时,其想法是服务器将获取该事件并将其推送到相关的已连接客户端。 它使开发人员可以发送和接收数据,而不必担心跨浏览器的兼容性。

套接字通信依赖于客户端-服务器逻辑,其中服务器与客户端之间始终存在持久连接。 更准确地说,服务器“打开”一个专用端口,客户端可以通过该端口连接到该端口。 一旦发生这种情况,所有连接的应用程序都可以将消息发送到该端口(外发消息),并侦听任何传入消息。 由于这是连接到套接字时的默认行为,因此服务器上的每个已连接客户端都将自动获取其消息,而无需任何其他请求。 最重要的是,当服务器将消息发送到该端口时,收件人客户端将立即收到该消息,因此它们可以立即采取任何进一步的措施(例如,更新新闻提要)。

尽管Socket.IO主要是为Web应用程序设计的,但它提供了iOS的库| Android | 可以立即集成到项目中的Java

工作流程

首先,我创建了SocketIOManager的单例对象,该类的单个实例将由整个应用程序使用。 在本例中,SocketIOClient需要将socketURL作为参数http://demo.yourdomain.com:3000

socket . on(clientEvent: . connect) {data, ack in ... 

客户端连接时发出。 这也称为成功重新连接。 连接事件获得一个数据项:已连接到的名称空间。

 open func emit(_ event: String, with items: [Any]) 

事件和可选数据项发送到服务器

通过管理器创建的套接字由管理器保留。 客户端成功连接到套接字后,我们使用套接字的emit方法将数据发送到服务器。 因此,至少必须维护对管理器的单个强烈引用才能使套接字保持活动状态。 为了连接到套接字,请调用socket.connect() 断开套接字的连接并将其从套接字上的管理器调用socket.disconnect()中删除。 因此,让我们现在定义两个将使用socket属性的方法。 第一个将应用程序连接到服务器,第二个断开连接。

现在,只要应用程序处于活动状态,我们都将建立与服务器的连接,并且当应用程序进入后台时,我们将关闭该连接。 非常简单,因此打开AppDelegate.swift文件并在委托方法中,在applicationDidBecomeActive建立连接,applicationDidEnterbackground时 关闭连接