如何在不使用Reachability类的情况下获取iPhone的当前活动网络类型(wifi或3G)

时间:2013-12-26 04:21:29

标签: ios objective-c reachability

在我的情况下,我不能使用Reachability类,因为我在无法访问互联网的wifi网络中使用iPhone。它只是一个内联网 wifi。

这意味着,Reachability课程将返回Not Reachable

2 个答案:

答案 0 :(得分:4)

 -(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;
}
}

答案 1 :(得分:0)

对于intranet wifi,我认为您也可以使用Reachability

您只需要将主机名更改为Intranet主机。

如:

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

我不测试,但我认为它可以解决您的问题