我正在尝试在AppDelegate
的 applicationWillTerminate 中发出套接字事件。我用过socket.io
。
我相信我能够成功发出该事件。 以下是我在控制台中获得的日志:
2018-10-08 20:29:45.663856 + 0530 SOCKET_POC [4718:303986] LOG SocketIOClient {/}:发射:23 [“ device-disconnect”,“ {\” QrcodeID \“:\” 2a758b00-314f -d69d-a10b-24fca56693ed \“,\” UniqueID \“:\” E15C087D-626F-4F10-B0B3-7567DA76EF51 \“}”],Ack:否 2018-10-08 20:29:49.561608 + 0530 SOCKET_POC [4718:304214] LOG SocketEngine:编写ws:23 [“ device-disconnect”,“ {\” QrcodeID \“:\” 123 \“,\” UniqueID \ “:\” 123 \“}”]包含数据:false 2018-10-08 20:29:49.561675 + 0530 SOCKET_POC [4718:304214] LOG SocketEngineWebSocket:发送ws:23 [“ device-disconnect”,“ {\” QrcodeID \“:\” 123 \“,\” UniqueID \ “:\” 123 \“}”]类型:4
请在下面找到代码:
func applicationWillTerminate(_ application: UIApplication) {
print(SocketHandler.instance?.socket.status)
if let uniqueId = UserDefaults.standard.value(forKey: Constants.USER_DEFAULT_KEYS.UINQUE_ID) as? String {
CommonFunctions().emitResultOnDeviceDisconnect(qrcode: "\(Variables.QRCodeID)", uniqueId: uniqueId)
print(SocketHandler.sharedInstance().socket.status)
}
我什至打印了我的套接字的状态,该套接字始终打印为已连接。
但是当我在服务器(后端)上看到日志时,它们根本没有收到我发出的套接字事件。
答案 0 :(得分:0)
在您的AppDelegate.Swift中, 将您的“ applicationDidEnterBackground(_ application:UIApplication)”更改为以下代码==>
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
print("The task has started")
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
})
}
并保持“ applicationWillTerminate”的逻辑不变。
答案 1 :(得分:0)
如果您想在终止应用程序后立即触发套接字事件,则需要创建一个后台任务,就像苹果开发者documentation一样。
optional func applicationWillTerminate(_ application: UIApplication)
您应该使用此方法为您的应用执行所有最终清理任务,例如释放共享资源,保存用户数据和使计时器无效。您实施此方法大约需要五秒钟来执行任何任务并返回。如果该方法在时间到期之前没有返回,则系统可能会完全终止该进程。
您可以做的是创建一个后台任务来触发套接字事件,以便在我们应该收到回调的情况下及时入手。
请按照以下代码解决您面临的问题:
将此属性添加到您的Appdelegate中
var taskIdentifier: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
添加以下方法
func startBackgroundTask() {
taskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: { [weak self] in
self?.endBackgroundTask()
})
// Only to check if the task is in invalid state or not for debugging.
assert(task != UIBackgroundTaskInvalid)
}
func endBackgroundTask() {
UIApplication.shared.endBackgroundTask(taskIdentifier)
taskIdentifier = UIBackgroundTaskInvalid
}
func applicationWillTerminate(_ application: UIApplication) {
if let uniqueId = UserDefaults.standard.value(forKey: Constants.USER_DEFAULT_KEYS.UINQUE_ID) as? String {
CommonFunctions().emitResultOnDeviceDisconnect(qrcode: "\(Variables.QRCodeID)", uniqueId: uniqueId)
}
self.startBackgroundTask()
}
我希望这可以解决您的问题。如有任何问题,请随时循环。
谢谢。