iOS обнаруживает 3G или WiFi
Я не уверен, если это возможно, но у меня есть этот сценарий.
У меня есть веб-сайт, отображаемый в моем UIWebView, который имеет ссылку, установленную в UISegmentedController. Они веб-сайт может обнаружить, если вы находитесь на Wi-Fi или в сети 3g.
теперь сегментированный контроллер указывает на 2 разных страницы: 1-дружественный экран входа в систему iPhone 2-главная страница, как только вы вошли в систему.
теперь вот вопрос:
могу ли я запрограммировать свое приложение на определите, является ли это WIFI или 3G (я знаю, что вы можете это сделать), но затем на основе ответа перейдите в сегмент 1 или 2
примерно так:
if (iPhone device is on 3g) {
Go to Segment 1;
} else {
Go to Segment 0;
}
10 ответов:
используя код, который Apple предоставила здесь
Reachability *reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; NetworkStatus status = [reachability currentReachabilityStatus]; if(status == NotReachable) { //No internet } else if (status == ReachableViaWiFi) { //WiFi } else if (status == ReachableViaWWAN) { //3G }
Если вы не хотите импортировать библиотеку достижимости или иметь дело с уведомителями, вы можете использовать этот простой синхронный метод:
typedef enum { ConnectionTypeUnknown, ConnectionTypeNone, ConnectionType3G, ConnectionTypeWiFi } ConnectionType; + (ConnectionType)connectionType { SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, "8.8.8.8"); SCNetworkReachabilityFlags flags; BOOL success = SCNetworkReachabilityGetFlags(reachability, &flags); CFRelease(reachability); if (!success) { return ConnectionTypeUnknown; } BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); BOOL isNetworkReachable = (isReachable && !needsConnection); if (!isNetworkReachable) { return ConnectionTypeNone; } else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { return ConnectionType3G; } else { return ConnectionTypeWiFi; } }
импорт Яблока доступность и попробуйте это,
#import "Reachability.h" #import <CoreTelephony/CTTelephonyNetworkInfo.h> //Try this Reachability *reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; NetworkStatus status = [reachability currentReachabilityStatus]; if(status == NotReachable) { NSLog(@"none"); //No internet } else if (status == ReachableViaWiFi) { NSLog(@"Wifi"); //WiFi } else if (status == ReachableViaWWAN) { NSLog(@"WWAN"); //connection type CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; _carrier = [[netinfo subscriberCellularProvider] carrierName]; if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { NSLog(@"2G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { NSLog(@"2G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { NSLog(@"2G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { NSLog(@"3G"); } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { NSLog(@"4G"); } }
ссылки(ссылки могут сломаться в будущем):
Я сделал довольно простую оболочку достижимости на основе блока, которая удаляет весь устаревший C-подобный код достижимости, вылитый в гораздо большую форму какао.
использование как:
[EPPZReachability reachHost:hostNameOrIPaddress completition:^(EPPZReachability *reachability) { if (reachability.reachableViaCellular) [self doSomeLightweightStuff]; }];
посмотреть достижимость с блоками для ежедневного использования at eppz!блог, или захватить его непосредственно из eppz!достижимость на GitHub.
Это также работает с IP-адреса, что оказалось довольно редкой достижимостью функция обертки.
для swift мы можем использовать:
func getNetworkType()->String { do{ let reachability:Reachability = try Reachability.reachabilityForInternetConnection() do{ try reachability.startNotifier() let status = reachability.currentReachabilityStatus if(status == .NotReachable){ return "" }else if (status == .ReachableViaWiFi){ return "Wifi" }else if (status == .ReachableViaWWAN){ let networkInfo = CTTelephonyNetworkInfo() let carrierType = networkInfo.currentRadioAccessTechnology switch carrierType{ case CTRadioAccessTechnologyGPRS?,CTRadioAccessTechnologyEdge?,CTRadioAccessTechnologyCDMA1x?: return "2G" case CTRadioAccessTechnologyWCDMA?,CTRadioAccessTechnologyHSDPA?,CTRadioAccessTechnologyHSUPA?,CTRadioAccessTechnologyCDMAEVDORev0?,CTRadioAccessTechnologyCDMAEVDORevA?,CTRadioAccessTechnologyCDMAEVDORevB?,CTRadioAccessTechnologyeHRPD?: return "3G" case CTRadioAccessTechnologyLTE?: return "4G" default: return "" } // Get carrier name }else{ return "" } }catch{ return "" } }catch{ return "" } }
#import <ifaddrs.h> #import <arpa/inet.h> BOOL CheckWiFi() { struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; BOOL hasWifi = NO; int err = getifaddrs(&interfaces); if(err == 0) { temp_addr = interfaces; while(temp_addr) { if(temp_addr->ifa_addr->sa_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in *)temp_addr->ifa_addr; if(memcmp(temp_addr->ifa_name, "en", 2) == 0) { hasWifi = YES; break; } } temp_addr = temp_addr->ifa_next; } } freeifaddrs(interfaces); return hasWifi; }
чтобы проверить, находитесь ли вы в wifi, это экономит дорогостоящую проверку подключения. Проверьте ifa_name "мост", чтобы проверить общий доступ к интернету.
метод класса выглядит следующим образом
+(NSString*)connectedNetworkType { Reachability *reachability = [Reachability reachabilityForInternetConnection]; [reachability startNotifier]; NetworkStatus status = [reachability currentReachabilityStatus]; if(status == NotReachable) { NSLog(@"none"); //No internet } else if (status == ReachableViaWiFi) { NSLog(@"Wifi"); //WiFi return @"Wifi"; } else if (status == ReachableViaWWAN){ NSLog(@"WWAN"); //connection type CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; // _carrier = [[netinfo subscriberCellularProvider] carrierName]; if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x])) { NSLog(@"2G"); return @"2G"; } else if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD])){ NSLog(@"3G"); return @"3G"; } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { NSLog(@"4G"); return @"4G"; } } return @"-1";//default unknown }
вот обновленная версия для iOS 6 С SimplePing от apple также включены. Он совместим с ARC, и я начал с исправления другого человека для достижения. http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/
Я надеюсь, что это кому-то поможет.
Если вы используете Xamarin или Monotouch, вы можете использовать адаптированный класс достижимости из репозитория Xamarin GitHub:
https://github.com/xamarin/monotouch-samples/blob/master/ReachabilitySample/reachability.cs
Так что добавьте его в свой проект и позвоните
Reachability.InternetConnectionStatus()
используйте этот, построенный с достижимостью и простой в использовании, всего несколько строк кода для интеграции. Имеет функцию обратного вызова, чтобы сказать вам, когда связь изменяется http://huytd.github.io/datatify/