31

アプリに「WiFi のみでダウンロード」というトグルがあります。ただし、そのトグルは iPod touch や WiFi-iPad では役に立ちません。

デバイスにコードでセルラー データ機能があるかどうかを知る方法はありますか? 将来的に機能するものも素晴らしいでしょう (3G を備えた iPod touch 第 5 世代が登場する場合など)。

4

8 に答える 8

35

こんにちは、pdp_ip0 インターフェイスがあるかどうかを確認できるはずです

#import <ifaddrs.h>

- (bool) hasCellular {
    struct ifaddrs * addrs;
    const struct ifaddrs * cursor;
    bool found = false;
    if (getifaddrs(&addrs) == 0) {
        cursor = addrs;
        while (cursor != NULL) {
            NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
            if ([name isEqualToString:@"pdp_ip0"]) {
                found = true;
                break;
            }
            cursor = cursor->ifa_next;
        }
        freeifaddrs(addrs);
    }
    return found;
}

これはプライベート API を使用しません。

于 2013-01-24T17:36:05.640 に答える
16

3G 自体を見つけるのは難しいようです。を使用して、デバイスが通話を発信できるかどうかを調べることができます[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]到達可能性コードを使用して、デバイスがインターネットに接続できるかどうか、期間 (および現在発生している方法)を確認できます。

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection] 
                               currentReachabilityStatus];

if(currentStatus == kReachableViaWWAN) // 3G

else if(currentStatus == kReachableViaWifi) // ...wifi

else if(currentStatus == kNotReachable) // no connection currently possible

..しかし、それを除けば、デバイスに 3G モデムが存在するかどうかを確認することはできないと思います.***** 電話をかけることができず、現在セルデータがオンになっていない場合Wi-Fi がオフになっていると、3G 対応かどうかを確認できません。

別の方法 (ただし、前方互換性がないため、おそらくこれを行う必要はありません) は、デバイスのモデルを完全なリストと比較し、ここに示すように、どのモデルに 3G モデムが搭載されているかを確認することです。

***** bentech の回答によると、デバイス名を調べたい場合 (Apple が 3g インターフェイス名を変更することを決定した場合、事前の警告なしに動作を停止する可能性があります)、電話getifaddrsしてインターフェイスを確認してくださいpdp_ip0

于 2011-08-18T01:14:29.237 に答える
2

CoreTelephony Frameworkを使用できるはずだと思います。

キャリアが使用するものであると明記されているため、TOSにアクセスすることがTOSに違反しているかどうかはわかりません.

通信事業者は、この情報を使用して、自社の加入者のみにサービスを提供するアプリケーションを作成できます。

于 2013-01-24T17:39:25.250 に答える
1

これを行う1つの方法は、ユーザーの場所を尋ねることです。可能な限り正確であれば、デバイスにGPSが搭載されているかどうかがわかります。GPSを搭載したすべてのデバイスには3Gが搭載されます。そして、GPSを持たないものは3Gを持っていません。

于 2013-01-18T08:28:40.180 に答える
0

Apple はここにコードを提供しました。 https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html

Reachability.h と Reachability.m をプロジェクトにコピーし、Reachability.h をクラスにインポートしてから、

Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];

while (networkStatus==NotReachable) {
    NSLog(@"not reachable");
//no  internet connection 
    return;
}
while (networkStatus==ReachableViaWWAN) {
    NSLog(@" ReachableViaWWAN ");
}

while (networkStatus==ReachableViaWiFi) {
    NSLog(@"ReachableViaWiFi");
}
于 2014-02-26T06:56:24.853 に答える
-3

別の方法は、これを拡張することです: https://github.com/monospacecollective/UIDevice-Hardware/blob/master/UIDevice-Hardware.mこれで:

-(bool) hasCellular:(NSString*)modelIdentifier {
    if ([modelIdentifier hasPrefix:@"iPhone"]) return YES;
    if ([modelIdentifier hasPrefix:@"iPod"]) return NO;

    if ([modelIdentifier isEqualToString:@"iPad1,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,2"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,3"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,4"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,5"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,6"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,7"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad3,2"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,3"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,4"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad3,5"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,6"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad4,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad4,2"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,5"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,6"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,7"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad4,4"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad4,5"])      return YES;

    if ([modelIdentifier isEqualToString:@"i386"])         return NO;
    if ([modelIdentifier isEqualToString:@"x86_64"])       return NO;

return YES;

}

(明らかに、新しいモデルがある場合にどちらの方法でエラーを発生させたいかに応じて、NO または YES のいずれかを削除するように編集できます...)

于 2014-07-15T23:32:55.017 に答える