使用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
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();
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>
以下属性也可用
事件:
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版本)
感谢各位贡献者指正缺失的内容或问题并修复它们或打开问题!!!
有关使用此库的问题或有关此库的通用评论,请使用我们的公共hipchat房间。
如果您在使用此库时发现任何错误或遇到问题,请在此存储库中打开问题(或一个拉取请求 :))。
您可以在inaka.github.io查看我们所有的开源项目。