web-dev-qa-db-ja.com

iOSデバイスにセルラーデータ機能があるかどうかを知る

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

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

31
gcamp

こんにちは、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を使用しません。

32
bentech

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モデムが含まれているモデルを確認することです ここ =。

*****ベンテックの回答によると、デバイス名を調べたい場合(Apple 3gインターフェイス名を変更することにした場合)、事前の警告なしに動作を停止する可能性があります)、 getifaddrsそしてpdp_ip0インターフェースをチェックします。

16
darvids0n

@bentechの回答のSwift3.0(UIDevice + Extension)

この行をBridgingHeader.hに追加します。

#import <ifaddrs.h>

どこか別の場所:

extension UIDevice {
    /// A Boolean value indicating whether the device has cellular data capabilities (true) or not (false).
    var hasCellularCapabilites: Bool {
        var addrs: UnsafeMutablePointer<ifaddrs>?
        var cursor: UnsafeMutablePointer<ifaddrs>?

        defer { freeifaddrs(addrs) }

        guard getifaddrs(&addrs) == 0 else { return false }
        cursor = addrs

        while cursor != nil {
            guard
                let utf8String = cursor?.pointee.ifa_name,
                let name = NSString(utf8String: utf8String),
                name == "pdp_ip0"
                else {
                    cursor = cursor?.pointee.ifa_next
                    continue
            }
            return true
        }
        return false
    }
}
6
Mark Bourke

IOS 6.1では、 Core Telephony を使用して、セルラーベースバンド機能の存在を正常にチェックすることができました。これは、私がテストしたすべてのiPadで機能します。サービスがアクティブ化されている場合とされていない場合のVerizon、サービスが現在非アクティブ化されているAT&T、SIMカードの入出力、Wi-FiのみのiPadです。

私が使用したコードは次のようになります。

CTTelephonyNetworkInfo* ctInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = ctInfo.subscriberCellularProvider;
self.hasWWANCapability = carrier != nil;

セルラーベースバンドハードウェアを搭載したすべてのiPadの場合、carrierはnilではありません。 Wi-FiのみのiPadの場合、carrierはnilです。

4
Rick

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

運送業者が使用することを明記しているので、TOSがアクセスすることに反対しているかどうかはわかりません。

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

2
Chris Wagner

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");
}
1
Suraj K Thomas

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

1
Liye Zhang