Итак, эту проблему так сложно описать вкратце, и я чувствую, что должен сначала спросить здесь, прежде чем поднимать проблему в AFNetworking github. Вот история:
// Definition for words in the story.
Characters:
- APP: Our iOS app, which POST requests to a URL's API (has user input from a UITextField)
APP's networking connection using framework AFNetworking 3.0
- DEV: Us developers, who created the iOS app.
- CUST: The troublesome customer, who live far from DEV.
CUST used app before, then one day it doesn't work anymore (S1 has died).
Server:
- S1: The CUST's primary server (died for some reasons). This has the IP address = ip1
- S2: The CUST's secondary server (works fine). This has the IP address = ip2
- URL: The domain URL point to both server (using load balancing or something like that, I dunno).
// End-of-definition
Начало истории:
CUST
используйте приложение, введите URL
, соединение не удалось. CUST
введите URL
в браузере iPad, доступ нормальный. CUST
попросите DEV
проверить, что произошло. DEV
введите URL
в приложении, подключитесь нормально. В то время DEV
не знает, что у CUST
есть 2 сервера.
И CUST
, и DEV
в отчаянии, уже несколько раз борются. CUST
пробовал все, что мог (использовал https
/http
, добавлял/удалял www
, удалял приложение и переустанавливал). DEV
отвлекся по необоснованным причинам (ошибка коннектора, ошибка API...). Затем CUST
помнит, что у него 2 сервера. CUST
поделился IP addresses
для DEV
для проверки. Именно тогда DEV
узнает, что S1
умер, а S2
нет.
Итак, DEV
понял причину, по которой CUST
не может получить доступ к URL
с помощью APP
: S1
умер. Тем не менее, вот реальный вопрос для SO:
Почему у нас это работает, а у CUST
нет? Почему APP
(в руке DEV
) идет к S2
, а в руке CUST
идет к S1
(и умер)? Но почему CUST
заходит на URL
через браузер iPad?
Это как-то связано с DNS? VPN? Балансировки нагрузки? Я хотел бы иметь причину для этой проблемы.
Спасибо за чтение. Не стесняйтесь редактировать этот вопрос, так как я также изо всех сил пытался описать это как можно проще.
ОБНОВЛЕНИЕ 1:
Когда James Jayson
спрашивает, как APP
подключиться к URL
, он использует AFNetworking 3.0
с AFHTTPSessionManager
с некоторой настройкой:
self.sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:baseUrl sessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
self.sessionManager.securityPolicy.allowInvalidCertificates = YES;
self.sessionManager.securityPolicy.validatesDomainName = NO;
self.sessionManager.requestSerializer.timeoutInterval = timeout;
self.sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
// Call API:
[self.sessionManager POST:path parameters:dictParams progress:nil success:^(NSURLSessionTask *task, id responseObject) {
// success block
} failure:^(NSURLSessionTask *task, NSError *error) {
// failure block
}
ОБНОВЛЕНИЕ 2:
Итак, теперь у меня есть кое-что новое: CUST
использует iOS 9.3.5, а DEV
использует iOS 10.x. DEV
попробуйте выполнить отладку на устройстве iOS 9.3.5, появится ошибка CUST
, сообщение об ошибке будет выглядеть как this (почти то же самое, отличается только URL).
ЖУРНАЛ: Домен ошибки = Код NSURLErrorDomain = -1004 «Не удалось подключиться к серверу». UserInfo={NSErrorFailingURLStringKey=APIURL, _kCFStreamErrorCodeKey=-2200, NSErrorFailingURLKey=APIURL, NSLocalizedDescription=Не удалось подключиться к серверу., _kCFStreamErrorDomainKey=4, NSUnderlyingError=0x16146990 {Домен ошибки=kCFErrorDomainCFNetwork Code=-1004 "(null) UserInfo=" _kCFStreamErrorDomainKey=4, NSErrorPeerAddressKey={длина = 16, емкость = 16, байты = 0x100201bb253ce7160000000000000000}, _kCFStreamErrorCodeKey=-2200}}}
Сейчас DEV
бьется над тем, как бороться с этой ошибкой. Пожалуйста помоги.