知道iOS设备是否具有蜂窝数据function

我在我的应用程序中有一个切换“仅在WiFi下载”。 但是,对于iPod touch或WiFi-iPad,该切换是无用的。

有没有办法知道该设备是否具有代码中的蜂窝数据function? 有些东西可以在未来发挥作用,就像3G手机的第五代iPod touch一样。

嗨,你应该能够检查它是否有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。

3G本身似乎很难find。 您可以使用[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]找出设备是否可以拨打 [[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调制解调器。*****如果它不能打电话,并且目前没有打开单元数据和wifi closures ,你将无法确定它是否具有3Gfunction。

另一种方法(不是前向兼容的,所以你可能不想这样做)是将设备的模型与详尽的列表进行比较,知道哪些有3G调制解调器,如图所示。

*****根据bentech的回答,如果你想要使用设备名称(如果苹果决定改变3G接口名称,这可能会停止工作,没有预先警告),调用getifaddrs并检查pdp_ip0接口。

在iOS 6.1中,我能够使用核心电话成功检查蜂窝基带function的存在。 这适用于我testing过的所有iPad:Verizon服务已启用和未启用,AT&T服务已停用,SIM卡进出,还有一个Wi-Fi专用的iPad。

我使用的代码如下所示:

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

对于蜂窝基带硬件的所有iPad, carrier不是零。 对于Wi-Fi专用的iPad, carrier是零。

我想你应该可以使用CoreTelephony框架 。

它确实呼吁,它是运营商使用,所以我不知道是否是反对TOS访问它。

运营商可以使用这些信息来编写只为自己的用户提供服务的应用程序

@ bentech的答案Swift 3.0(UIDevice +扩展)

将此行添加到您的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 } } 

一种做法是询问用户的位置。 当它尽可能精确时,您将知道设备是否具有GPS。 所有具有GPS的设备将具有3G。 那些不带GPS的将不会有3G。

苹果在这里提供代码。 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"); } 

另一种方法是扩展: 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,这取决于你想在哪种模式下出现错误的方式…)