2013-12-26 1 views
0

В моем случае я не могу использовать класс Reachability, потому что я использую iPhone в сети Wi-Fi, которая не может получить доступ к интернет. Это всего лишь интранет wifi.Как получить текущий активный тип сети (Wi-Fi или 3G) iPhone, не используя класс Reachability

Это означает, что класс Reachability вернет Not Reachable.

ответ

6
-(void)newtworkType { 

NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews]; 
NSNumber *dataNetworkItemView = nil; 

for (id subview in subviews) { 
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { 
     dataNetworkItemView = subview; 
     break; 
    } 
} 


switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) { 
    case 0: 
     NSLog(@"No wifi or cellular"); 
     break; 

    case 1: 
     NSLog(@"2G"); 
     break; 

    case 2: 
     NSLog(@"3G"); 
     break; 

    case 3: 
     NSLog(@"4G"); 
     break; 

    case 4: 
     NSLog(@"LTE"); 
     break; 

    case 5: 
     NSLog(@"Wifi"); 
     break; 


    default: 
     break; 
} 
} 
+0

Это помогает, спасибо большое. –

+0

@DevinZhao, возможно, использует частные API, поскольку эти сообщения говорят: http: //stackoverflow.com/questions/8400340/determining-3g-vs-edge/11400410#11400410 –

+0

Да, это определенно частный. Мне было бы интересно узнать: кто-нибудь смог получить его приложение в Магазине, используя это? Кроме того, имейте в виду, что реализация Apple может измениться, этот код в значительной степени зависит от иерархии представлений конкретной строки состояния. Если он когда-либо изменится, этот код приведет к сбою вашего приложения. –

0

Для вашего intranet wifi я думаю, вы также можете использовать Reachability

Вам нужно только изменить имя хоста для хоста внутренней сети.

Такие, как:

struct sockaddr_in ip4addr; 
int s; 
ip4addr.sin_family = AF_INET; 
ip4addr.sin_port = htons(80); 
inet_pton(AF_INET, "192.168.0.1", &ip4addr.sin_addr); 

s = socket(PF_INET, SOCK_STREAM, 0); 
bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr); 

Reachability * reach = [Reachability reachabilityWithAddress:&ip4addr]; 

выше код начертано faildrop, https://github.com/tonymillion/Reachability/issues/6

Я не испытываю, но я думаю, что он может справиться с вашей проблемой

Смежные вопросы