Фоновая загрузка iOS — как проверить полученные ответы в случае сбоя приложения?

При выполнении фоновых загрузок в iOS существует ли механизм, который будет повторно доставлять результаты загрузки из системы в случае сбоя приложения при обработке указанных результатов? Я надеялся увидеть какую-то систему подтверждения, сообщающую ОС, что приложение завершило обработку всех отправленных данных и т. д., но я не вижу ничего подобного в документации.

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

Это, конечно, проблема и при загрузке в приложение: если вы загрузите что-то и произойдет сбой при обработке ответа, вы потеряете эту загрузку (и любые другие загрузки в процессе выполнения в то время), но вы рискуете потерять слишком много данных в фоновом режиме IMO.


person Zach    schedule 11.02.2019    source источник
comment
нет способа сказать iOS, что ваше приложение готово для загрузки. Вы можете сделать что-то на стороне сервера, чтобы проверить, завершена ли загрузка приложения. если приложение потерпело крах или iOS по какой-то причине убило его, вы можете отправить тихий толчок, чтобы разбудить приложение и продолжить загрузку в фоновом режиме.   -  person canister_exister    schedule 12.02.2019
comment
Однако может быть, верно? iOS может сообщить вам, что вызовы делегатов фонового сеанса вот-вот начнут доставляться, они доставляют их, а затем информируют вас о том, что вызовы делегатов фонового сеанса завершены, что потребует от вас ответа с логическим значением, указывающим, что вы подтверждаете доставку и т. д. Я не вижу ничего подобного прямо сейчас, но хотел бы спросить, чтобы убедиться!   -  person Zach    schedule 14.02.2019


Ответы (1)


Для задачи загрузки в фоновом сеансе, как только вы повторно подключитесь к существующему сеансу, «создав» сеанс с тем же именем сеанса, ваше приложение должно получать вызовы делегатов, как если бы оно все еще выполнялось ранее.

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

person dgatwood    schedule 12.02.2019
comment
Да, конечно. Мой вопрос по этому поводу: что, если вы выйдете из строя при обработке вызовов делегатов? Это потенциально может привести к потере большого количества данных, если iOS не даст вам возможности снова обработать вызовы делегатов. - person Zach; 14.02.2019
comment
Ах. Я понимаю. Если вас это беспокоит, лучше всего использовать задачу загрузки с телом запроса. Затем немедленно переместите файл, и если во время его обработки произойдет сбой, вы сможете повторить попытку при перезапуске. - person dgatwood; 14.02.2019