iOSがネットワークの状態に関する情報を入手する方法

3630 ワード

  • キャリア情報:CTTelephonyNetworkInfoのサービスを直接使用すると、キャリアの名前、キャリアコードなどの情報を得ることができます.easy!
  • -(NSString *)currentCarrierName{
        CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
        CTCarrier *carrier = [telephonyInfo subscriberCellularProvider];
        return [[NSString alloc] initWithFormat:@"%@_%@_%@_%@", [carrier carrierName], [carrier mobileCountryCode], [carrier mobileNetworkCode], [carrier isoCountryCode]];
    }
    
  • 現在のネットワークタイプ(WiFi/4 G)信号の強弱Googleからの文章は、大体statusBarのビューにアクセスし、KVCがそのビューの属性にアクセスして、所望の情報を得る.文章は信号強度を得る方法については言及していないが、その考え方に沿って、すぐにキーを見つけた:
  •  :**UIStatusBarDataNetworkItemView**, **UIStatusBarSignalStrengthItemView**
      :**dataNetworkType**, **wifiStrengthBars**, **signalStrengthBars**
    

    詳細コードは次のとおりです.
    -(NSString *)currentNetworkType{
        NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
        
        NSNumber *dataNetworkItemView = nil;
        NSNumber *signalStrengthItemView = nil;
        for (id subview in subviews) {
            if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
                dataNetworkItemView = subview;
            }
            if ([subview isKindOfClass:[NSClassFromString(@"UIStatusBarSignalStrengthItemView") class]]) {
                signalStrengthItemView = subview;
            }
            if (dataNetworkItemView && signalStrengthItemView) {
                break;
            }
        }
        
        if (!dataNetworkItemView) {
            return nil;
        }
        
        NSNumber *networkTypeNum = [dataNetworkItemView valueForKey:@"dataNetworkType"];
        NSNumber *wifiStrengthBars = [dataNetworkItemView valueForKey:@"wifiStrengthBars"];
        NSNumber *signalStrengthBars = [signalStrengthItemView valueForKey:@"signalStrengthBars"];
        if (!networkTypeNum) {
            return nil;
        }
        
        NSInteger networkType = [networkTypeNum integerValue];
        switch (networkType) {
            case 0:
                return @"No Service";
                break;
                
            case 1:
                return [[NSString alloc] initWithFormat:@"%@_%@", @"2G", signalStrengthBars];
                break;
                
            case 2:
                return [[NSString alloc] initWithFormat:@"%@_%@", @"3G", signalStrengthBars];
                break;
                
            case 3:
                return [[NSString alloc] initWithFormat:@"%@_%@", @"4G", signalStrengthBars];
                break;
                
            case 4:
                return [[NSString alloc] initWithFormat:@"%@_%@", @"LTE", signalStrengthBars];
                break;
                
            case 5:
                return [[NSString alloc] initWithFormat:@"%@_%@", @"WiFi", wifiStrengthBars];
                break;
            default:
                return [[NSString alloc] initWithFormat:@"%@_%@_%@", networkTypeNum, wifiStrengthBars, signalStrengthBars];
                break;
        }
    }
    
  • 授之以渔私はどのように上记のこれらの类が何がアクセスできる属性があることを知っていますか?答えは傑出したオープンソースライブラリYYYModelを借りることです.もちろん、自分でOCのruntime方法で書くこともできますが、YYYModelでパッケージされた方法では便利ではありません.
  • #import "YYModel.h"
    //...
        YYClassInfo *info = [YYClassInfo classInfoWithClass:[signalStrengthItemView class]];
        NSLog(@"dataNetworkItemView ivars:%@", info.ivarInfos);
        NSLog(@"dataNetworkItemView properties:%@", info.propertyInfos);
        NSLog(@"dataNetworkItemView method:%@", info.methodInfos);
    
  • 終了:)