Определите завершение приложения с помощью задач конечной длины - PullRequest
0 голосов
/ 22 апреля 2019

Чтобы определить завершение приложения, я реализовал задачу конечной длины, но через некоторое время приложение завершается и запускается с начального экрана.

func registerBackgroundTask() {
    backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
        self?.endBackgroundTask()
    }
    assert(backgroundTask != .invalid)
}


func endBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = .invalid
    if backgroundTask != .invalid {
        endBackgroundTask()
    }
}

 func applicationDidEnterBackground(_ application: UIApplication) {
    registerBackgroundTask()
}

Приложение не должно закрываться при выполнении задач конечной длины, также, пожалуйста, предоставьте примеры, чтобы определить прекращение работы приложения, когда оно находится в режиме ожидания.

1 Ответ

1 голос
/ 22 апреля 2019

приложение не должно закрываться при выполнении задач конечной длины

Это не обещано вообще.Есть много причин, по которым ваше приложение может быть закрыто.beginBackgroundTask - это запрос к ОС на дополнительное время для завершения кратковременной операции для пользователя.Он не обещает, что ваш запрос будет удовлетворен.

Конкретный способ, которым вы делаете это, вероятно, иногда может потерпеть неудачу, и конкретно рассматривается в документации:

Позвоните этомукак можно раньше, прежде чем начинать задание, и желательно до того, как ваше приложение действительно войдет в фоновый режим.Метод запрашивает утверждение задачи для вашего приложения асинхронно.Если вы вызываете этот метод незадолго до того, как ваше приложение должно быть приостановлено, есть вероятность, что система может приостановить ваше приложение до того, как это утверждение задачи будет предоставлено.Например, не вызывайте этот метод в конце метода applicationDidEnterBackground (_ :) и ожидайте, что ваше приложение продолжит работу.Если система не может предоставить утверждение задачи, она вызывает ваш обработчик срока действия.

Вы хотите обернуть конкретную операцию, для которой вы хотите запросить время.Вы всегда переносите эту операцию, независимо от того, думаете ли вы, что уходите на задний план или нет.Вы не просто вызываете это каждый раз, когда переходите в фоновый режим.

, пожалуйста, предоставьте примеры, чтобы определить прекращение работы приложения, когда оно находится в режиме ожидания.

В applicationWillEnterBackground записать значение в UserDefaultsapplicationDidEnterForeground удалите ключ.В applicationWillFinishLaunching ищите этот ключ.Если он там, значит, вас снова запускают, поэтому в какой-то момент вы умерли на заднем плане.Это включает в себя что-то вроде перезагрузки или сбоя питания.Если его там нет, то это первый запуск, или вы разбились на переднем плане.Точный способ реализации этого в значительной степени зависит от того, что вы планируете делать с информацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...