Событие 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()
}
Я надеюсь, что это решит вашу проблему. В случае каких-либо проблем, пожалуйста, не стесняйтесь.
Благодарю.