Сетевой запрос в «didEnterBackground» не всегда принимается серверной частью

#ios #swift

Вопрос:

У меня есть проблема с didEnterBackground . В viewDidLoad у меня есть следующий код:

 NotificationCenter
    .default
    .addObserver(
        self,
        selector: #selector(didEnterBackground),
        name: UIApplication.didEnterBackgroundNotification, object: nil)
 

с помощью функции didEnterBackground :

 @objc func didEnterBackground() {
    // I have checked course always has a value and it does
    guard let course = self.focusedCourse.value else { return }

    switch course.status {
    case .finished:
        // I have also debugged to check playTime has a value and it does

        // API call
        Worker.PutLessonProgress(lessonID: course.id, progress: Int(playTime.value)).request(completion: nil)
    case .live, .upcoming, .todayUpcoming, .free:
        break
    }
}
 

Мой рабочий класс — это просто оболочка вокруг Alamofire .

Когда я вхожу в фоновый режим с помощью переключения (например, мое приложение открыто, затем я переключаюсь на приложение B) , вызов API выполняется успешно в 100% случаев. Однако, если я открою приложение, а затем немедленно принудительно выйду из приложения (например, не переключайтесь на другое приложение и просто проведите пальцем по закрытому приложению), хотя didEnterBackground оно вызывается (проверяется путем регистрации), кажется, что запрос API часто не поступает на сервер.

Нормально didEnterBackgroundNotification ли быть таким ненадежным, или я где-то допустил ошибку в своем коде?

Комментарии:

1. Что вы подразумеваете под немедленным выходом из приложения ? Как ты «увольняешься»?

2. Обновлено в описании

Ответ №1:

Уведомление не является ненадежным. Это просто не гарантирует вам время выполнения. Если пользователь завершит работу приложения, любое выполнение будет остановлено.

Не уверен, что делает ваш рабочий класс, но просто используйте сеанс urlbackgrounds, чтобы ваши данные доставлялись самой ОС.

Комментарии:

1. URLBackgroundSession не будет работать, так как приложение не находится в фоновом режиме. Он прекращен.

2. Кекс, вы правы, что фоновые сеансы не будут работать, если пользователь принудительно завершит работу приложения (проведите пальцем вверх), но фоновые сеансы, вообще говоря, не требуют, чтобы приложение находилось в фоновом режиме. Они работают, даже если приложение прекращено системой, просто не выходите принудительно. Невозможно продолжить передачу, если пользователь принудительно завершит работу так, как вы описали. Это сделано специально.

3. Я ищу принудительный выход, если приложение переключается на другое приложение и переходит в фоновый режим, у него есть достаточно времени для вызова API, и это не проблема. Спасибо, что заметили этот вопрос!