【问题标题】:How to check the internet Connection in iPhone without Reachability classes?如何在没有可达性类的情况下检查 iPhone 中的互联网连接?
【发布时间】:2014-08-23 19:49:14
【问题描述】:

我想在不使用可达性类的情况下检查我的 iPhone 中的互联网连接。我想在我认为触发特定事件时不断检查连接。我还想确定连接是来自 Wifi 还是通过 2G 或 3G 连接。我已经尝试过使用可达性类。但是,如果 Wifi 开启,这些类只会返回值(尽管网线已从 Wifi 路由器上拔下)。我试过了

[ReachabilityreachabilityForInternetConnection]

[ReachabilityreachabilityWithHostName:@"www.google.com"];

但是,尽管网络断开,上述方法似乎无法正常工作。

还有什么方法可以确定 iOS6 中网络的类型是 2G 还是 3G?我知道我们有只在 iOS 7 中工作的核心电话框架。但我只想知道我是否可以确定蜂窝网络 iOS 6.0。请帮帮我。

【问题讨论】:

    标签: ios objective-c iphone


    【解决方案1】:

    没有可达性类的工作代码,也可以在 iOS 6 中工作:

    - (NSNumber *) dataNetworkTypeFromStatusBar {
    
        UIApplication *app = [UIApplication sharedApplication];
        NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"]    subviews];
        NSNumber *dataNetworkItemView = nil;
    
        for (id subview in subviews) {
            if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
                dataNetworkItemView = subview;
                break;
            }
        }
        return [dataNetworkItemView valueForKey:@"dataNetworkType"];
    }
    

    到目前为止我发现的值键:

    0 = 没有 wifi 或蜂窝网络

    1 = 2G 或更早?

    2 = 3G?

    3 = 4G

    4 = LTE

    5 = 无线网络

    或者在iOS7中使用CoreTelephony框架

    CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
    NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
    [NSNotificationCenter.defaultCenter addObserverForName:CTRadioAccessTechnologyDidChangeNotification 
                                                    object:nil 
                                                     queue:nil 
                                                usingBlock:^(NSNotification *note) 
    {
        NSLog(@"New Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
    }];
    

    【讨论】:

    • 首先,我以前见过这种方法,所以我很确定它有效,而且人们可能确实使用它。但是,对我来说,它看起来像是一种非常脆弱/危险的方法。您不仅在访问 Apple 未直接授予您访问权限的内容,而且您还在访问可能随任何操作系统版本(甚至是次要版本)而改变的内容,这些内容充其量会导致不良结果,最坏的情况是崩溃。我还担心在您的代码中包含 UIStatusBarDataNetworkItemView 字符串,因为这是一个私有类,Apple 可能会拒绝您的应用引用它。
    • 上述代码有效,但正如@MikeS 建议的那样,我们最终可能会被苹果拒绝。我们有没有其他方法可以得到另一个解决方案?
    • @PradeepReddyKypa 从 iOS7 开始,有一个内置框架可以帮助您执行此操作。查看我的更新答案
    • @Ty_ 是的,我已经看到了。我知道这一点。我在我的问题中也提到了同样的问题。我只是在寻找一种在 iOS6.0 中实现相同功能的方法。任何帮助都会非常有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2017-08-25
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多