NSURLSession Обработчик перенаправления другое поведение на WatchOS - PullRequest
0 голосов
/ 01 мая 2018

Я работаю над обновлением старого приложения WatchOS для поддержки WatchOS 4.0. Приложение выполняет некоторые сетевые запросы, один из которых отвечает кодом состояния перенаправления 302 и соответствующим заголовком Location. Я не хочу следовать перенаправлению, а заголовки ответа 302. содержат всю информацию, необходимую для этого конкретного запроса.

Я использую NSURLSession и внедрил метод делегата - URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:.

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

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

Вот странная часть. Когда Apple Watch в паре с iPhone, я получаю поведение, описанное выше. Однако, когда я переключаю iPhone в режим «В самолете», чтобы имитировать часы, находящиеся вне диапазона, когда сетевые запросы выполняются непосредственно через Wi-Fi или сотовую связь, я получаю другое поведение.

Метод делегата перенаправления по-прежнему вызывается, как и ожидалось, однако обработчик завершения NSURLSessionTask вызывается не сразу. Скорее, он вызывается через некоторое время с ошибкой тайм-аута запроса -1001.

NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];

NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    // Odd behaviour described above here
}];

[task resume];

Метод перенаправления делегата:

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task willPerformHTTPRedirection:(NSHTTPURLResponse *)response newRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLRequest * _Nullable))completionHandler {
    completionHandler(nil);
}

К настоящему моменту это было крайне сложно отладить, так как я не могу отладить через XCode и не смог найти способ прокси-запросов сетевых запросов.

Кто-нибудь сталкивался с таким поведением, или есть какие-то подсказки, почему оно ведет себя по-другому? Это дефект WatchOS?

...