我正在使用 socket.io 客户端快速。当我声明并连接套接字并在 AppDelegate 中使用它的命令时,一切正常。但是一旦我将这些东西从 AppDelegate 移动到另一个类(使套接字成为全局变量)并从 AppDelegate 调用该类的函数,套接字错误就开始出现(错误的描述与这个主题真的无关。我有一个关于 Socket.io 问题的讨论)我想问的问题是这种情况吗?我用过
deinit {
NSLog("CCNOTIFICATIONS RESOURCES GOT DE INITIALIZED")
}
在那个文件中,但这永远不会被调用。
据我所知,AppDelegate 是一个委托,当应用的状态发生一些变化(即它的启动或进入后台/前台)时,它会被调用。而且在 AppDelegate 中弄乱大量代码也不是一个好习惯。显然这两个文件的范围没有区别,那么为什么会发生这种情况?
如果我的理解有误,请纠正我。如何解决这个错误问题?或者至少我可以尝试什么其他方法来解决这个问题?任何帮助,将不胜感激。
更新: 这是代码:当我在 AppDelegate 中编写它时:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
public static var socket = SocketIOClient(socketURL: URL(string: “URL”)!, config: [.log(true), .compress])
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
AppDelegate.socket.connect()
AppDelegate.socket.on("connect") {data, ack in
print("Connected successfully")
}
AppDelegate.socket.on("book-adventure-provider") {data, ack in
print("BOOKING CAME")
print(data)
}
return true
}
当我将其写入其他文件时:
CC通知:
public class CCNotifications : INotifications
{
public var socket = SocketIOClient(socketURL: URL(string: “URL”)!, config: [.log(true), .compress, .forcePolling(true), .forceNew(true)])
public func sendBookingRequest(adventureId: String, success: @escaping () -> Void, error: @escaping CErrorCallback) {
if (ConnectionStatus.isConnected() == false)
{
let errorObj = CError()
errorObj.message = "No internet connection"
errorObj.code = ClientConstants.connectionErrorCode
error(errorObj)
}
else
{
let jwtToken = KeychainWrapper.standard.string(forKey: "jwtToken")
let data = ["adventure_id": adventureId, "jwt": jwtToken]
socket.emit("book-adventure", data)
socket.on("book-adventure-seeker") { data, ack in
print(data)
}
}
}
}
Cuufy客户端:
public class CuufyClient : IClient {
public var notifications: INotifications? = nil
public static var Notifications: INotifications? { get { return CuufyClient.client?.notifications}}
//region Actions
public static func Initialize(completion: ((_ error: CError?) -> Void)?) {
CuufyClient.client?.notifications = CCNotifications ()
completion? (nil)
}
//endregion
}
最后将其称为:
CuufyClient.Notifications?.funcWhichIWannaCall.
注意: 两种方式都有效。但是当我在 CCNotifications 中编写代码并运行它时,有时它会开始给出套接字错误:会话 id 未知,然后一次又一次地连接自己。
更新2: 日志中套接字错误之前的一行我观察到了这个错误:
2017-12-15 15:45:34.133480+0500 TestTarget[5332:230404] TIC Read Status [1:0x60000017f440]: 1:57
搜索此错误后,我知道在 Xcode 9 中,此错误表明 TCP 连接已关闭。当我在 socket.io 分支上打开这个问题时,专家说:
该库在底层网络之上的相当高的级别上运行。它依赖 URLSession 或 Starscream 来告诉它何时连接丢失。
任何人都可以帮助我解决 URLSession 为什么 TCP 正在关闭,因为我对 iOS 还很陌生。