0

我正在尝试在applicationWillTerminate中发出套接字事件AppDelegate。我用过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\"}"],确认:假 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)
}

我什至打印了我的套接字的状态,它总是打印连接。

但是当我在服务器(后端)看到日志时,他们根本没有收到我发出的套接字事件。

4

2 回答 2

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”的逻辑不变。

于 2018-10-09T12:45:19.920 回答
0

如果您想在终止应用程序后立即触发套接字事件,则需要从苹果的开发人员文档中创建一个后台任务。

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()
}

我希望这能解决你的问题。如有任何问题,请随时进行循环。

谢谢。

于 2018-10-10T04:56:04.627 回答