2016-07-19 3 views
0

Сейчас я пытаюсь создать сетевую систему для своего приложения. Я хочу, чтобы мои сетевые операции имели возможность повторить попытку после сбоя сети. Это то, что Apple, говорит о таком поведении (Designing for Real-World Networks):После чего необходимо перезапустить сетевую задачу?

Для запросов, по указанию пользователя:

Всегда пытаться установить соединение. Не пытайтесь угадать, доступен ли сетевой сервис, и не кэшируйте это определение. Если соединение не удается, используйте API SCNetworkReachability, чтобы помочь диагностировать причину сбоя. Затем:

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

Я реализовал эту функциональность успешно, но у меня возникают проблемы решить, что «случайная ошибка» на самом деле.

Прямо сейчас я повторение задача после получения NSURLErrorNotConnectedToInternet, NSURLErrorNetworkConnectionLost, NSURLErrorInternationalRoamingOff, NSURLErrorCallIsActive, NSURLErrorDataNotAllowed или NSURLErrorTimedOut и код состояния HTTP в диапазоне 500 ... 599, но я не уверен, если таковые достаточно.

Я был бы очень рад услышать советы от более опытных разработчиков, которые также используют повторное поведение. Как вы решаете, когда повторять задачу, а когда нет?

Заранее благодарен!

ответ

0

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

NSURLErrorNotConnectedToInternet, NSURLErrorInternationalRoamingOff, NSURLErrorDataNotAllowed, вероятно, нуждается в некотором действии пользователя. Повторная попытка бессмысленна, если вы сначала не сообщите об этом пользователю.

NSURLErrorNetworkConnectionLost, NSURLErrorTimedOut и диапазон 500-599 вы можете повторить, но не слишком часто. «Connection Lost» должен либо перейти на «не подключен», либо работать при повторном запуске. Считайте, что «Timed Out» обычно занимает много времени (по умолчанию 60 секунд), поэтому вы хотите только повторить попытку, если это фоновая операция. 500 могут быть ошибки в вашем коде. Или это могут быть вещи, которые требуют перезагрузки сервера, поэтому повторите попытку через щедрое время.

+0

На Verizon и Sprint, AFAIK, даже текущие устройства не могут получить доступ к данным во время вызова (если вы не используете LTE, а VoTTE включен на этом сотовом сайте). – dgatwood

3

NSURLErrorNetworkConnectionLost: временная ошибка. Повторите попытку немедленно или после небольшой задержки.

NSURLErrorNotConnectedToInternet: возвращается, когда нет связи. Подождите, пока вы не сможете его изменить.

NSURLErrorInternationalRoamingOff: возвращается, когда вы находитесь на не-домашнем сотовом соединении с переездом данных. Подождите, пока вы не сможете его изменить.

NSURLErrorCallIsActive: возвращается, когда пользователь разговаривает по телефону. Подождите, пока вы не сможете его изменить.

NSURLErrorDataNotAllowed: возвращается только тогда, когда вы явно сказали, что ваши запросы не должны происходить по сотовой сети, а пользователь не подключен к Wi-Fi. Подождите, пока вы не сможете его изменить.

NSURLErrorTimedOut: возвращается, когда попытка подключения отключается, ожидая начального ответа с сервера. Возможно переходная сетевая ошибка. Повторите попытку немедленно, но ограничьте количество попыток до небольшого числа, прежде чем рассматривать сеть как снижающуюся и ожидающую изменения достижимости, прежде чем повторять попытку. Возможно, начните проверку доступности и повторите попытку параллельно.

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

Смежные вопросы