我在我的应用程序中有一个"仅在WiFi下下载"的开关。然而,对于iPod touch或WiFi版iPad来说,该切换是无用的。
在代码中是否有一种方法可以知道设备是否具有蜂窝数据功能?最好是一些未来也能适用的方法(比如iPod touch第五代带3G版问世)。
我在我的应用程序中有一个"仅在WiFi下下载"的开关。然而,对于iPod touch或WiFi版iPad来说,该切换是无用的。
在代码中是否有一种方法可以知道设备是否具有蜂窝数据功能?最好是一些未来也能适用的方法(比如iPod touch第五代带3G版问世)。
嗨,你应该能够检查它是否具有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本身似乎很难找到。您可以使用{{link1:[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:“tel://”]]
}}来查看设备是否可以打电话。您可以使用Reachability代码检查设备是否可以访问互联网(以及当前可以使用哪种方法):
NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection]
currentReachabilityStatus];
if(currentStatus == kReachableViaWWAN) // 3G
else if(currentStatus == kReachableViaWifi) // ...wifi
else if(currentStatus == kNotReachable) // no connection currently possible
..但除此之外,我认为你无法检查设备中是否存在3G调制解调器。***** 如果它不能打电话,并且当前没有开启蜂窝数据和关闭wifi,那么你将无法确定它是否支持3G。
另一种方法(不过不向前兼容,所以你可能不想这样做)是将设备的型号与详尽的列表进行比较,知道哪些设备中有3G调制解调器,如此处所示。
***** 根据bentech的答案,如果你想要深入挖掘设备名称(如果苹果决定更改3g接口名称,则可能会在没有预先警告的情况下停止工作),请调用getifaddrs
并检查pdp_ip0
接口。
@bentech 的回答中使用的 Swift 3.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
}
}
NSString
。 - pommyCTTelephonyNetworkInfo* ctInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = ctInfo.subscriberCellularProvider;
self.hasWWANCapability = carrier != nil;
对于所有具有蜂窝基带硬件的iPad,carrier
不为nil。对于仅支持Wi-Fi的iPad,carrier
为nil。
它确实指出这是供运营商使用的,所以我不确定访问它是否违反了服务条款。
运营商可以使用此信息编写仅为其自己的订阅者提供服务的应用程序
一种方法是要求用户提供其位置。当位置尽可能准确时,您将知道设备是否具有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");
}
-(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中的一个,具体取决于您希望在出现新模型时如何出错...)
UIRequiredDeviceCapabilities
中没有3g
或cellular radio
这个键。 - Zhao Xiang