如何在 Web 套接字中制作红蜘蛛的单例管理器 Class
How to make a Singleton Manager Class of Starscream in Web-socket
如何在 swift 中创建 starscream 网络套接字的单个 class 管理器。请帮助我如何通过管理单例 class 经理来获得请求和响应。
因为我想在许多视图和子视图中通过应用程序使用套接字,这不是一个好习惯,我可以在每个 class 上启动委托方法并获得请求和响应。
还有一个问题是如何使用 websockets 格式进行身份验证:
{'UsernameAuth':'Username', 'PasswordAuth':'Password'}
请帮帮我。
谢谢
Swift 中的单例非常琐碎。
创建一个单独的 Swift 文件:
WSHub.swift
Hub 应该向观察者传递消息。
import Srascream
@objc protocol WSHubObserver: class {
optional func wsHub(_ hub: WSHub, receivedText: String)
optional func wsHub(_ hub: WSHub, receivedJsonDic: [String: Any])
optional func wsHub(_ hub: WSHub, receivedJsonArray: [Any])
}
class WSHub: NSObject {
static let shared = WSHub()
private(set) var webSocket: WebSocket
// Note these observers are referenced and instances will not die unless removed from observers or you can wrap them into WeakRef struct
private var observers: [WSHubObserver] = []
private init() {
self.webSocket = WebSocket(... some URL or URLRequest here...)
super.init()
self.websocket.onText = { [weak self] (text) in
self?.handleText(text)
}
}
public func addObserver(_ observer: WSHubObserver) {
self.observers.append(observer)
}
public func addObserver(_ observer: WSHubObserver) {
if let index = self.objservers.index(observer) {
self.observers.remove(at: index)
}
}
private func handleText(_ text: String) {
self.observers.forEach { observer in
observer.wsHub?(self, receivedText: text)
}
if let data = text.data(using: .utf8),
let object = try? JSONSerialization.jsonObject(with: data, options: []) {
if let dic = object as? [String : Any] {
observer.wsHub?(self, receivedJsonDic: dic)
} else if let arr = object as? [Any] {
observer.wsHub?(self, receivedJsonArray: arr)
}
}
}
}
然后你就可以在代码的任何地方使用lazily-initialized
单例WSHub.shared.webSocket.send(...)
授权部分取决于服务器。它可能 URLRequest
与某些 https://
url 和 POST
的 json 数据分开,然后您可能会得到 header [=17= 的响应].当您要连接到 websocket 时,您可以创建 URLRequest
并执行 request.set(someCookieString, for: "Cookie")
然后服务器可能会让您进入 ws 管道。
我怀疑你是否应该在每次连接时发送 login/pass,因为在应用程序内部存储用户凭据是一种不好的方式,所以你应该基于 session.
然后是您的处理程序:
class SomeWsHubSmallClass: NSObject, WSHubObserver {
func wsHub(_ hub: WSHub, receivedText: String) {
}
func wsHub(_ hub: WSHub, receivedJsonDic: [String: Any]) {
}
func wsHub(_ hub: WSHub, receivedJsonArray: [Any]) {
}
}
let object = SomeWsHubSmallClass()
WSHub.shared.addObserver(object)
如何在 swift 中创建 starscream 网络套接字的单个 class 管理器。请帮助我如何通过管理单例 class 经理来获得请求和响应。
因为我想在许多视图和子视图中通过应用程序使用套接字,这不是一个好习惯,我可以在每个 class 上启动委托方法并获得请求和响应。
还有一个问题是如何使用 websockets 格式进行身份验证:
{'UsernameAuth':'Username', 'PasswordAuth':'Password'}
请帮帮我。
谢谢
Swift 中的单例非常琐碎。 创建一个单独的 Swift 文件: WSHub.swift
Hub 应该向观察者传递消息。
import Srascream
@objc protocol WSHubObserver: class {
optional func wsHub(_ hub: WSHub, receivedText: String)
optional func wsHub(_ hub: WSHub, receivedJsonDic: [String: Any])
optional func wsHub(_ hub: WSHub, receivedJsonArray: [Any])
}
class WSHub: NSObject {
static let shared = WSHub()
private(set) var webSocket: WebSocket
// Note these observers are referenced and instances will not die unless removed from observers or you can wrap them into WeakRef struct
private var observers: [WSHubObserver] = []
private init() {
self.webSocket = WebSocket(... some URL or URLRequest here...)
super.init()
self.websocket.onText = { [weak self] (text) in
self?.handleText(text)
}
}
public func addObserver(_ observer: WSHubObserver) {
self.observers.append(observer)
}
public func addObserver(_ observer: WSHubObserver) {
if let index = self.objservers.index(observer) {
self.observers.remove(at: index)
}
}
private func handleText(_ text: String) {
self.observers.forEach { observer in
observer.wsHub?(self, receivedText: text)
}
if let data = text.data(using: .utf8),
let object = try? JSONSerialization.jsonObject(with: data, options: []) {
if let dic = object as? [String : Any] {
observer.wsHub?(self, receivedJsonDic: dic)
} else if let arr = object as? [Any] {
observer.wsHub?(self, receivedJsonArray: arr)
}
}
}
}
然后你就可以在代码的任何地方使用lazily-initialized
单例WSHub.shared.webSocket.send(...)
授权部分取决于服务器。它可能 URLRequest
与某些 https://
url 和 POST
的 json 数据分开,然后您可能会得到 header [=17= 的响应].当您要连接到 websocket 时,您可以创建 URLRequest
并执行 request.set(someCookieString, for: "Cookie")
然后服务器可能会让您进入 ws 管道。
我怀疑你是否应该在每次连接时发送 login/pass,因为在应用程序内部存储用户凭据是一种不好的方式,所以你应该基于 session.
然后是您的处理程序:
class SomeWsHubSmallClass: NSObject, WSHubObserver {
func wsHub(_ hub: WSHub, receivedText: String) {
}
func wsHub(_ hub: WSHub, receivedJsonDic: [String: Any]) {
}
func wsHub(_ hub: WSHub, receivedJsonArray: [Any]) {
}
}
let object = SomeWsHubSmallClass()
WSHub.shared.addObserver(object)