Событие Emit сокета в applicationWillTerminate - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь передать событие сокета в 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 ]

0 голосов
/ 10 октября 2018

Если вы хотите запустить событие сокета, как только вы убьете приложение, вам нужно создать фоновую задачу, как у разработчика 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()
}

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

Спасибо.

0 голосов
/ 09 октября 2018

В вашем 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» такой, какая она есть.

...