Know if iOS device has cellular data capabilities Know if iOS device has cellular data capabilities ios ios

Know if iOS device has cellular data capabilities


Hi you should be able to check if it has the pdp_ip0 interface

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

This doesn't use any private APIs.


3G by itself seems tough to find. You can find out whether a device can make calls using [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]. You can check whether a device can get to the internet, period (and by which method that can currently happen) using Reachability code:

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection]                                currentReachabilityStatus];if(currentStatus == kReachableViaWWAN) // 3Gelse if(currentStatus == kReachableViaWifi) // ...wifielse if(currentStatus == kNotReachable) // no connection currently possible

..but aside from that, I don't think you can check for the existence of a 3G modem in the device.***** If it can't make a call, and doesn't currently have cell data turned on and wifi turned off, you won't be able to find out if it's 3G-capable.

An alternative way (not forward-compatible though, so you probably don't want to do this) is to compare the device's model with an exhaustive list, knowing which ones have 3G modems in them, as shown here.

***** As per bentech's answer, if you want to go digging around with device names (this may stop working with no advance warning if Apple decide to change the 3g interface name), call getifaddrs and check for the pdp_ip0 interface.


Swift 3.0 (UIDevice+Extension) of @bentech's answer

Add this line to your BridgingHeader.h:

#import <ifaddrs.h>

Somewhere else:

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