Как получить список всех активно работающих UIBackgroundTaskIdentifiers?

Я работаю над приложением для обмена сообщениями, в котором мы хотим продолжать повторять попытки отправки сообщения, которое не может быть доставлено из-за плохого / отсутствия подключения. И он должен продолжать попытки, даже если приложение находится в фоновом режиме. Это было достигнуто с помощью backgroundTaskIdentifier, и ниже показан фрагмент кода, который я использую.

Примечание: он повторяет попытку в течение 5 минут, и если это не удается, сообщение помечается как неудачное.

Это прекрасно работает. Успехи Apple в области выполнения приложений в фоновом режиме помогли мне понять это.

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

Есть ли способ получить список всех активно работающих backgroundTaskIdentifier, а затем я закончу уже запущенный backgroundTaskIdentifier, используя имя, которое мы использовали во время

UIApplication.shared.beginBackgroundTask(withName: 
       "com.XXX.messaging.backgroundTask.\(message.messageId)", expirationHandler: {...})

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

Ниже приведен фрагмент кода, который я использую

DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async { [weak self] in
   var backgroundTaskIdentifier: UIBackgroundTaskIdentifier = UIBackgroundTaskIdentifier.invalid
   
   backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(withName: 
       "com.XXX.messaging.backgroundTask.\(message.messageId)", expirationHandler: {
        UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
        backgroundTaskIdentifier = UIBackgroundTaskIdentifier.invalid
   })
            
   guard backgroundTaskIdentifier != UIBackgroundTaskIdentifier.invalid else {
       assertionFailure()
       return
   }
            
   let startTime = Date()
   self?.sendMessage(message,
                     conversation: conversation,
                     startTime: startTime,
                     endBGTaskCompletion: {
                         UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier)
                         backgroundTaskIdentifier = UIBackgroundTaskIdentifier.invalid
                     })
}

0 ответов

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