TL; DR: Возможно, вам нужен NSTimer.
В моем приложении я хочу сделать сетевой вызов, только если у меня есть доступ к inte rnet.
Это не значимое утверждение. Нет никакого теста, который вы можете выполнить, который надежно означает, что вы можете «получить доступ к inte rnet» (несмотря на существование NSURLErrorNotConnectedToInte rnet, что на самом деле не означает, что он говорит). Например, ваш код пытается обработать «www.google.com» как «inte rnet». Но вполне возможно иметь сеть, которая разрешает пакеты от go до www.google.com, но нигде больше. Или разрешить пакеты ICMP, но не пакеты HTTP. Или разрешить HTTP-пакеты, но не на определенных портах. Такие конфигурации сети не просто возможны, они распространены, и по-разному все они могут выглядеть как «не на inte rnet».
Единственное, что вы можете ответить, это «могу я отправить пакет на указанный хост c и получить пакет взамен? " Даже невозможно узнать, можете ли вы просто отправить пакет. Если вы ничего не получите взамен, вы не знаете, был ли ваш пакет доставлен или нет.
Достижимость отвечает на вопрос: «Если я попытаюсь отправить пакет, попытается ли мой стек локальной сети даже попробовать? " Это в основном вопрос о том, есть ли первый прыжок, доступный в таблице маршрутизации. Это не значит, что вы можете подключиться; он может только сказать вам, что это абсолютно не так.
Используемые вами таймауты основаны на времени простоя сеанса. Но вы никогда не начинаете сеанс, поэтому он никогда не работает на холостом ходу. Время ожидания, которое вы ищете, - это время ожидания TCP, которое, как я ожидаю, составит 4 минуты. NSURLSession не может его настроить.
Если вам нужен тайм-аут «от начала до конца» настенных часов, то вам нужно запустить его самостоятельно с таймером .