2015-12-28 3 views
8

Я борется с проблемой, когда NSURLConnection звонки мгновенно терпят неудачу. Необходимо полностью перезагрузить устройство или включить режим «Flight Mode» для разрешения проблемы. Перезапуск приложения (прокрутка вверх) не помогает.NSURLConnection случайно не работает до перезагрузки устройства

Некоторые факты:

-Все URL-адреса являются HTTPS, TLS 1.2 совместим с Forward секретность. Нет проблем с ATS и iOS 9. Ошибка присутствует с iOS 7 и остается на 9.2.

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

-Нет проблем с инфраструктурой/сетью - другие устройства в одних и тех же сетях (например, такие же WiFi) работают в одном приложении одновременно. Переход в/из 3G/Wifi не имеет значения.

-I всегда применять willCacheResponse для возврата nil.

-Сервис размещен на AWAS Elastic Beanstalk, поэтому некоторые предположили, что это может быть проблема кэширования DNS в случае изменения IP-адреса - это кажется мне маловероятным и должно запускать сразу несколько ошибок на разных устройствах, что я никогда не видели.

-Описанный метод: didFailWithError, мгновенно, как если бы не было подключения к Интернету на устройстве - все остальные приложения работают.

- Веб-сайт, на котором размещен API, используемый приложением, может быть просмотрен без проблем в любое время. На самом деле веб-сайт делает те же запросы на получение данных.

Код ошибки возвращен -1003, kCFURLErrorCannotFindHost. Я слежу за потоком Git, занимающимся той же проблемой, но безрезультатно. https://github.com/AFNetworking/AFNetworking/issues/967

Я пробовал использовать NSURLRequestReloadIgnoringCacheData для всех моих запросов, но это не помогло.

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

Я создаю свой запрос со статическим методом, который выглядит так. Он был лишен некоторой непубличной информации, но в основном он просто выполняет запрос POST с данными JSON. [Controller getSQLHost] просто возвращает URL-адрес базового домена.

+(NSURLConnection*)initiatePOSTwithJSONDictionary:(NSDictionary*)dictionary toURL:(NSString*)urllocation withDelegate:delegate { 

    NSMutableDictionary *connectionDictionary = [[NSMutableDictionary alloc] init]; 

    if (dictionary) { 
     [connectionDictionary setObject:dictionary forKey:@"input"]; 
    } 

    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:connectionDictionary options:kNilOptions error:nil]; 

    NSURL *url = [NSURL URLWithString:[[Controller getSQLHost] stringByAppendingString:urllocation]]; 

    NSString *postLength = [NSString stringWithFormat:@"%i", (int)[jsonData length]]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:jsonData]; 

    return [[NSURLConnection alloc] initWithRequest:request delegate:delegate]; 

} 
+0

см. В быстром: http://iosdevcenters.blogspot.in/2015/12/nsurlrequest-in-swift.html –

+0

@KiritModi Хотя я ценю, что вы нашли время, чтобы ответить, я не понимаю, что эта статья имеет отношение к мой вопрос? – nickdnk

+0

Можете ли вы дать мне URL? –

ответ

0

Вы делегируете внедрение connectionShouldUseCredentialStorage? (или ответьте «ДА»)

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

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

+0

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

+0

То, что я понимаю из этого метода, состоит в том, что если вы его не реализуете, вызывающий абонент предполагает, что он отвечает ДА, и он перейдет в хранилище keyChain. Если вы делаете свои манипуляции с ключевыми цепочками, это может мешать, и вы можете реализовать метод, чтобы заставить его отвечать НЕТ. –

+0

Но разве это не приведет к сбою каждого вызова? Я мог бы попробовать, я думаю. – nickdnk

0

Вы создаете NSURLConnection s на текущей runloop. Сколько из них активны в любой момент? Считаете ли вы использование NSOperationQueue, чтобы вы не укусили ошибки загрузки?

Является ли ваш делегат потокобезопасным? Если нет, это может объяснить спорадичность ошибки.

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

+0

В основном только один звонок за раз. Я не создаю более одного запроса для каждого действия пользователя. Я не могу одолжить их устройства. - проблема не возникает достаточно часто - также, я не знаю, что делать, поскольку единственным регистрированием, которое я могу получить, является ошибка 1003, которая ничего мне не говорит. Я рассматриваю возможность перехода на NSURLSession, но в соответствии с потоком GitHub, который на самом деле не имеет никакого значения. – nickdnk

+0

Не знаю о безопасности потоков. Я просто следил за всеми обычными инструкциями для NSURLConnection. Ни один из них не упоминает безопасность потоков. – nickdnk

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