Обнаружение сбоев в сети с помощью загрузок из хранилища Firebase

Я использую Firebase iOS SDK и загружаю изображения в память с помощью метода dataWithMaxSize. Загрузка работает хорошо, когда подключение к сети хорошее, но если подключение к сети отсутствует, задача загрузки будет продолжаться бесконечно без вызова обратного вызова ошибки. Похоже, та же проблема была обнаружена в этом Сообщение SO, где используется Firebase Android SDK. Если кто-то может оказать некоторую помощь в этом вопросе, я был бы очень признателен.

Спасибо


person Wouter    schedule 13.06.2016    source источник


Ответы (3)


Я сделал много тестов, установив maxUploadRetryTime с различными TimeInterval (30, 20, 10, 8, 5, 2, 1), и я могу подтвердить, что настройка maxUploadRetryTime = 1.0 ТОЛЬКО вызовет блокировку сбоя тайм-аута.

Некоторые журналы:

2017-05-03 21:15:17.922 [Info] [main] [UploadRequest.swift:40] upload(uploadData:) > Start uploading with Timeout: 1.0

2017-05-03 21:15:18.170 [Verbose] [main] [UploadRequest.swift:60] upload(uploadData:) > Upload failed

Это очень неожиданное поведение, и я не уверен, знают ли они об этом. На данный момент я использую Firebase/Database (3.17.0)

ОБНОВИТЬ:

Я сообщил об ошибке команде firebase, и они подтвердили проблему. Номер отчета: 8-2338000016926

person danialmoghaddam    schedule 03.05.2017

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

как в андроиде

 private boolean isNetworkAvailable() {

    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            // Update UI here when network is available.

            ConnectivityManager connectivityManager
                    = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
            activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if (!(activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting())) {

                Snackbar snackbar = Snackbar
                        .make(coordinatorLayout, "No internet connection!", Snackbar.LENGTH_INDEFINITE)
                        .setAction("RETRY", new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                isNetworkAvailable();
                            }
                        });
                View sbView = snackbar.getView();
                snackbar.setActionTextColor(Color.WHITE);
                sbView.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.snackbar_back_color2));
                TextView textView = (TextView) sbView.findViewById(android.support.design.R.id.snackbar_text);
                //textView.setTextColor(Color.YELLOW);
                snackbar.show();

            }
        }
    });

    return (activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting());
}
person Sahaj Rana    schedule 13.06.2016
comment
Ваше решение охватывает только один сценарий. Что делать, если соединение отключается во время загрузки/скачивания файла? - person danialmoghaddam; 03.05.2017

maxUploadRetryTime/maxDownloadRetryTime/maxOperationRetryTime — это все свойства в FIRStorage, и вы можете настроить их на сбой операции так же, как описано в другом посте об android.

Принцип работы этих тайм-аутов заключается в том, что они основаны на том, как долго будут предприниматься повторные попытки. Таким образом, если установлено значение «4 секунды», а соединение останавливается на 5 секунд, операция завершится ошибкой. Если операция продолжается без прерывания работы сети в течение 5 минут, операция завершится успешно (и вы будете периодически получать уведомления о ходе выполнения по мере передачи данных).

person Benjamin Wulfe    schedule 14.06.2016
comment
Обратите внимание, что время ожидания по умолчанию для загрузки и загрузки для обеих платформ составляет относительно долгие 10 минут. Поэтому может показаться, что операция будет повторяться вечно, но в конце концов она сдается. - person Benjamin Wulfe; 14.06.2016
comment
Спасибо за ответ. В данный момент пробую этот вариант. Документация на веб-сайте кажется неточной: максимальное время в секундах для повторной попытки загрузки, по умолчанию 60 с. - person Wouter; 14.06.2016
comment
К сожалению, мне не везет. Я устанавливаю maxDownloadRetryTime следующим образом: FIRStorage.storage().maxDownloadRetryTime = 5 Обратный вызов ошибки не вызывается даже при очень коротком времени повтора в 5 секунд. Я использую Network Link Conditioner со 100% потерей пакетов для проверки подключения в Mac OS. Я заметил, что в консоли появляется следующая ошибка: Domain=NSURLErrorDomain Code=-1001 Время запроса истекло. Нужно ли прикреплять одного из других наблюдателей, чтобы увидеть ошибку? - person Wouter; 14.06.2016
comment
Я отлаживал загрузку файлов, наблюдая за событиями «Сбой», «Пауза», «Прогресс», «Возобновление» и «Успех». Я установил maxDownloadRetryTime на 5 секунд и использовал кондиционер сетевых каналов со 100% потерей пакетов. При регистрации выходных данных я заметил, что сначала регистрируется событие Progress, а затем событие Resume. После этого никаких других событий не происходит. Я ждал несколько минут без изменений. Я не знаю, является ли это предполагаемым поведением, но очень сложно дать отзыв пользователю о загрузке в таком сценарии. Должен быть какой-то другой путь. - person Wouter; 14.06.2016