Событие Emit сокета в applicationWillTerminate

Я пытаюсь передать событие сокета в 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\"}"], Ack: false 2018-10-08 20:29:49.561608+0530 SOCKET_POC[4718:304214] LOG SocketEngine: Запись ws: 23["устройство отключено","{\"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)
}

Я даже напечатал состояние моего сокета, который всегда печатает подключен.

Но когда я вижу журналы на сервере (бэкэнд), они вообще не получают событие моего испущенного сокета.

2 ответа

В вашем 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" как есть.

Если вы хотите запустить событие сокета, как только убьете приложение, вам нужно создать фоновую задачу, как в документации разработчика Apple.

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

Я надеюсь, что это решит вашу проблему. В случае каких-либо проблем, пожалуйста, не стесняйтесь.

Благодарю.

Другие вопросы по тегам