Варианты отправки данных на сервер / повторных запросов в фоновом режиме

Мы работаем над корпоративным приложением, которое отправляет данные формы, введенные пользователем, на сервер. Приложение пытается отправить данные сразу после нажатия пользователем кнопки "Сохранить". Если при отправке данных возникает проблема (например, нет сетевого подключения), мы хотим повторить попытку через X минут и периодически повторять попытки, пока данные не будут успешно отправлены. Запросы обычно не очень большие или длительные, но пользователь часто находится в среде без доступа к сети, поэтому повторные попытки важны.

Достаточно просто повторять запросы API, когда приложение работает, но в идеале мы хотим периодически повторять попытки, когда приложение находится в фоновом режиме. Что лучше всего мы можем достичь с помощью функций фонового выполнения iOS? Вот несколько вариантов, которые я вижу:

  • использование beginBackgroundTaskWithExpirationHandler: сделать одноразовый запрос на дополнительное время. Это даст нам в основном еще одну попытку отправить данные после того, как приложение перейдет в фоновый режим, но не повторные попытки
  • Используйте функцию "фоновой выборки" и попытайтесь отправить любые новые данные на сервер, когда приложение активируется для фоновой выборки. Звучит хорошо в теории, но я обеспокоен тем, что это может быть злоупотребление функцией фоновой выборки?

Один из них мой лучший вариант? Есть ли другой подход, который я пропускаю?

Это приложение Xamarin с реализациями для iOS и Android, хотя я не думаю, что это существенно повлияет на мой вопрос; Я могу написать специальный код iOS по мере необходимости.

1 ответ

Решение

Я думаю, что есть один подход, который вы пропустили: фоновые NSURLSessions. И я думаю, что это то, что вы должны использовать.

Я действительно не знаю, сколько вы можете сделать снимков с этим. Вот что я рекомендую:

  • Начните также фоновое задание (с beginBackgroundTaskWithExpirationHandler:), когда вы начинаете фоновую загрузку.
  • Пока срок действия фоновой задачи еще не истек, вы сможете перезапустить загрузку, даже если в фоновом режиме.
  • Если и когда вызывается ваш обработчик истечения срока действия фоновой задачи, вам необходимо немедленно завершить фоновую задачу. В этот момент ваше приложение прекратит работу, и загрузка продолжится во внешнем процессе.
  • Когда загрузка завершится или произойдет сбой, ваше приложение будет перезапущено в фоновом режиме и получит возможность обработать результат. Я не знаю, сможете ли вы начать новую фоновую загрузку в данный момент. Вы должны просто попытаться подождать кого-то, кто знает лучше меня...

Также не забудьте проверить -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes; Метод делегата, чтобы перезапустить загрузку там, где она не удалась, и не начинать заново.

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