IKEventSource 3.0.1

IKEventSource 3.0.1

测试已测试
语言语言 SwiftSwift
许可证 自定义
发布上次发布2019年9月
SPM支持SPM

Andres CanalAndres Canal维护。




EventSource

EventSource

使用NSURLSession编写的Swift SSE客户端。

摘要

这是一个在Swift上编写的EventSource实现,力图使API尽可能接近JavaScript版本。根据W3C EventSource编写。如果缺少或部分正确,请提交问题,我会着手解决!

如何使用?

它的工作方式与JavaScript版本相同,主要区别是创建新的EventSource对象时,您可以添加请求头,例如如果您的服务器使用基本认证,您可以在这里添加头信息。

Last-Event-Id完全由库处理,因此如果连接断开并且库需要重新连接时,它会发送到服务器。Last-Event-Id也存储在NSUserDefaults中,这样我们就可以保留上次接收的事件以供下次应用使用,从而避免接收重复的事件。

如果连接断开,库将自动重新连接。重新连接时间为3秒。这个时间可以通过服务器发送retry: time-in-milliseconds事件来更改。

sse-server文件夹中,您将找到一个用于测试库的极其简单的node.js服务器。要运行服务器,您只需做以下操作

  • npm install
  • node sse.js

安装

您可以将EventSource.swift文件拖到项目中,或者使用CocoaPods。

pod 'IKEventSource'

然后导入库

import IKEventSource

JavaScript API

var eventSource = new EventSource(server);

eventSource.onopen = function() {
    // When opened
}

eventSource.onerror = function() {
    // When errors
}

eventSource.onmessage = function(e) {  
    // Here you get an event without event name!
}

eventSource.addEventListener("ping", function(e) {
  // Here you get an event 'event-name'
}, false);

eventSource.close();

Swift API

var eventSource: EventSource = EventSource(url: server, headers: ["Authorization" : basicAuthAuthorization])

eventSource.onOpen {
  // When opened
}

eventSource.onError { (error) in
  // When errors
}

eventSource.onMessage { (id, event, data) in
  // Here you get an event without event name!
}

eventSource.addEventListener("event-name") { (id, event, data) in
  // Here you get an event 'event-name'
}

eventSource.close()

我们添加了以下方法,这些方法在JavaScript EventSource API中不可用,但我们认为它们可能有用

public func removeEventListener(event: String) -> Void
public func events() -> Array<String>

以下属性也可用

  • readyState: EventSource的状态
    • EventSourceState.Closed
    • EventSourceState.Connecting
    • EventSourceState.Open

  • URL: EventSource服务器URL。

示例


事件:

id: event-id
event: event-name
data: event-data

调用

eventSource.addEventListener("event-name") { (id, event, data) in
  // Here you get an event 'event-name'
}


事件:

id: event-id
data: event-data
data: event-data

调用

eventSource.onMessage { (id, event, data) in
  // Here you get an event without event name!
}


事件:

id: event-id
data: event-data-1
data: event-data-2
data: event-data-3

调用

eventSource.onMessage { (id, event, data) in
  // Here you get an event without event name!
  // data: event-data-1\nevent-data-2\nevent-data-3
}


事件:

:heartbeat

调用

nothing it's a comment


实时示例

这是应用程序附带的一个示例。如果您运行服务器并运行应用程序,您将能够实时查看此示例。移动的框只是为了显示所有内容都在后台运行,并且主线程的性能没有下降。(GIF看起来不太好,但如果你点击图片,你会被带到运行更流畅的GIF的gfycat版本)

Sample

贡献者

感谢各位贡献者指正缺失的内容或问题并修复它们或打开问题!!!

联系我们

有关使用此库的问题或有关此库的通用评论,请使用我们的公共hipchat房间

如果您在使用此库时发现任何错误或遇到问题,请在此存储库中打开问题(或一个拉取请求 :))。

您可以在inaka.github.io查看我们所有的开源项目。