Сначала измените ваш метод addressReachable. Вместо
return reachable && (flags & kSCNetworkFlagsReachable);
добавить следующее:
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
Это правильный способ проверить доступное соединение. Теперь, если вы хотите четко различать сотовую связь и Wi-Fi, измените ваш метод, чтобы он возвращал int, и используйте следующее
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
if(isReachable && !needsConnection) // connection is available
{
// determine what type of connection is available
BOOL isCellularConnection = ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0);
NSString *wifiIPAddress = [self getWiFiIPAddress];
if(isCellularConnection)
return 1; // cellular connection available
if(wifiIPAddress)
return 2; // wifi connection available
}
else
return 0; // no connection at all
Метод getWiFiIPAddress любезно предоставлен Мэттом Брауном и может быть найден здесь .
Еще одна вещь. Флаг kSCNetworkReachabilityFlagsIsDirect может указывать, проходит ли сетевой трафик через шлюз или поступает напрямую. Это может быть полезно в некоторых случаях.
Код правильно работает на устройстве. На симуляторе он объявит, что вы подключены через Wi-Fi, когда вы подключены через кабель Ethernet, и не будет сообщать, если вы подключены через Wi-Fi.