web-dev-qa-db-ja.com

Objective-CはiOSデバイスのデータネットワークタイプを決定します

サーバーからデータを受信するアプリケーションの場合、問題は、ユーザーがcellular data3GまたはWIFIではない)に接続すると、データを受信するのに時間がかかることです。

私はこれからこのコードを実装しました Answer しかし、それが効果的かどうかはわかりません。正確な型が得られる場合とそうでない場合があります。

これが私のコードです:

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

これは私ができる最善のことですか??、私は試しました Apple Reachabilityの例 、しかしそれはreachabilityForInternetConnectionまたは単にreachabilityForLocalWiFiかどうかを判断できますが、私の場合は役に立ちません。

前もって感謝します。

20
Mutawe

Status barがアプリケーションで非表示になっていないことを確認してください。コードがNo wifi or cellularのテキストを読み取るため、表示されていない場合は常にStatus barが返されます。

これは問題を解決するための最良の方法です。Status barを非表示にしないようにすると、アプリケーションはネットワークタイプに関するテキストを取得します。

15
M.Alatrash

iOS 7 +を使用している場合は、次の方法でCoreTelephonyフレームワークから情報を取得できます。

CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);

定義されている可能な値は次のとおりです:CTRadioAccessTechnologyGPRSCTRadioAccessTechnologyEdgeCTRadioAccessTechnologyWCDMACTRadioAccessTechnologyLTEなど

28
muzz

ケース1、NSLog(@"2G");は、電話が3G、4G、WiFiではなく通常のセルラーデータ上にある場合です。

データ転送を防ぐために、NSLog for2Gの下にコードを挿入する必要があります。

0
arjunyg