2014-12-19 4 views
3

Я использую NSURLSession на моем приложении, так как iOS 7 впервые вышел. В последнее время некоторые пользователи стали жаловаться, что некоторые функции не работают, после того, как глубокий взгляд на их журналы, я заметил, что несколько сетевых запросов не удалось с ошибкой:Недопустимые ошибки сервера с NSURLSession

{NSLocalizedDescription=Server is unreachable. Check your network connection and try again., NSUnderlyingError=0x174c4c300 "The operation couldnât be completed. (NSURLErrorDomain error -1001.)"}

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

NSString *urlString = [url host]; 
const char *hostUrl = [urlString UTF8String]; 
struct hostent *remote_entity = gethostbyname(host); 
if (!remote_entity) { 
    DDLogWarn(@"DNS Lookup failed! Cant resolve Hostname: %@ for request: %@", [url host], [url description]); 
    return nil; 
} 
else { 
    // Get address info from host entry 
    struct in_addr *remote_in_addr = (struct in_addr *) remote_entity->h_addr_list[0]; 
    char *sremote_in_addr = inet_ntoa(*remote_in_addr); 
    NSString* hostIP = [NSString stringWithUTF8String:sremote_in_addr]; 
    DDLogWarn(@"Hostname: %@ IP: %@ (original request: %@)", [url host], hostIP, [url description]); 
    return hostIP; 
} 

После развертывания этого изменения, я могу видеть в моих журналах, что даже если запрос не удается (с NSURLErrorDomain ошибки -1001) Я все еще могу разрешить имя хоста.

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

Любые идеи о том, как исправить это навсегда? Должен ли я реализовать механизм отслеживания пакетов в моих приложениях (аналогично traceroute в unix)? Может ли это быть неправильной конфигурацией на моих серверах, поскольку запросы на другие хосты (например, Amazon S3) никогда не прерываются? Кстати, я использую Heroku.

Спасибо заранее, Ze

ответ

0

Я рекомендую смотреть на Apple, Networking Overview Guide, в частности в разделе Handling Network Problems Gracefully.

При работе с сетевым кодом вы должны учитывать тот факт, что иногда все происходит неправильно. Это особенно актуально для мобильных устройств, где сотовые соединения могут приходить и уходить. В вышеупомянутом разделе по работе с сетевыми проблемами Apple дает рекомендации по автоматическому повторному запросу и обнаружению изменений в сети с использованием API SCNetworkReachability. Я рекомендую использовать эту стратегию в сетевом коде, чтобы дать вашим пользователям лучший опыт.

В вашем конкретном случае появляется ошибка -1001: indicating a network timeout. Поиск узла выполняется успешно, но по какой-то причине сетевой запрос не попал на сервер. В этом случае повторение будет иметь смысл.

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