Сейчас я пытаюсь создать сетевую систему для своего приложения. Я хочу, чтобы мои сетевые операции имели возможность повторить попытку после сбоя сети. Это то, что Apple, говорит о таком поведении (Designing for Real-World Networks):После чего необходимо перезапустить сетевую задачу?
Для запросов, по указанию пользователя:
Всегда пытаться установить соединение. Не пытайтесь угадать, доступен ли сетевой сервис, и не кэшируйте это определение. Если соединение не удается, используйте API SCNetworkReachability, чтобы помочь диагностировать причину сбоя. Затем:
- Если соединение не выполнено из-за временной ошибки, попробуйте подключиться снова.
- Если соединение не удалось, поскольку узел недоступен, дождитесь, когда API-интерфейс SCNetworkReachability вызовет ваш зарегистрированный обратный вызов. Когда хост станет доступен снова, ваше приложение должно автоматически повторить попытку подключения без вмешательства пользователя (если только пользователь не предпринял какие-либо действия для отмены запроса, например, закрытие окна браузера или нажатие кнопки отмены).
Я реализовал эту функциональность успешно, но у меня возникают проблемы решить, что «случайная ошибка» на самом деле.
Прямо сейчас я повторение задача после получения NSURLErrorNotConnectedToInternet
, NSURLErrorNetworkConnectionLost
, NSURLErrorInternationalRoamingOff
, NSURLErrorCallIsActive
, NSURLErrorDataNotAllowed
или NSURLErrorTimedOut
и код состояния HTTP в диапазоне 500 ... 599, но я не уверен, если таковые достаточно.
Я был бы очень рад услышать советы от более опытных разработчиков, которые также используют повторное поведение. Как вы решаете, когда повторять задачу, а когда нет?
Заранее благодарен!
На Verizon и Sprint, AFAIK, даже текущие устройства не могут получить доступ к данным во время вызова (если вы не используете LTE, а VoTTE включен на этом сотовом сайте). – dgatwood