如何获取运营商网络的连接类型?
- 我能够使用
Reachability
类获得连接是否为 WIFI 或 WWAN。 -
我能够获取网络标志
可达性标志状态:WR t------ localWiFi状态为标志
-
我可以使用
CaptiveNetwork
获得WIFI SSID
支持的接口: ( en0 )
en0 => {
BSSID = "xx:xx:xx:xx:xx:xx";
SSID = MyWifiNetwork;
SSIDDATA = <x1x1x1x1 x1x1x1x1 x1>;
}
但我无法区分3G,EDGE或GPRS连接。
知道也使用 iOS 私有 API 吗?
谢谢。
从 iOS 7 开始,您可以使用:
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
[NSNotificationCenter.defaultCenter addObserverForName:CTRadioAccessTechnologyDidChangeNotification
object:nil
queue:nil
usingBlock:^(NSNotification *note)
{
NSLog(@"New Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
}];
我还发现这可以检测慢速或快速连接:
- (BOOL)isFast:(NSString*)radioAccessTechnology {
if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) {
return NO;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
return NO;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) {
return NO;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
return YES;
} else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) {
return YES;
}
return YES;
}
这里是使用私有 API 的OLD
解决方案,特别是SoftwareUpdateServices.framework
Class NetworkMonitor = NSClassFromString(@"SUNetworkMonitor");
NSLog(@"TYPE: %d", [NetworkMonitor currentNetworkType]);
它返回:
0:无数据
1: 无线上网
2:GPRS/边缘
3: 3G
希望这对社区有所帮助。
接受的答案不适用于iOS 10。我找到了一个解决方法,并在AppDelegate中设置了一个计时器,该计时器每5秒检查一次属性currentRadioAccessTechnology。因此,我们还需要一个功能来检查 WIFI 连接是否可用,而不是无线接入技术。
检查无线网络连接是否可用:
class func isConnectedToWlan() -> Bool {
var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0,
sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
$0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
}
}
var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {
return false
}
//Only Working for WIFI
let isReachable = flags == .reachable
let needsConnection = flags == .connectionRequired
return isReachable && !needsConnection
}
像这样设置计时器:
Timer.scheduledTimer(timeInterval: TimeInterval.seconds(5.0), target: self, selector:
#selector(showNetworkMessage), userInfo: nil, repeats: true)
每 5 秒调用一次的选择器:
guard !Reachability.isConnecteToWlan() else {
//Connected to WLAN
return
}
guard let currentRadioAccessTechnology = info.currentRadioAccessTechnology else {
// No internet connection
return
}
guard (currentRadioAccessTechnology == CTRadioAccessTechnologyGPRS
|| currentRadioAccessTechnology == CTRadioAccessTechnologyEdge) else {
// 3G, LTE fast radio access Technology
return
}
if lastRadioAccessTechnology != nil {
guard let lastRadioAccessTechnology = lastRadioAccessTechnology,
(lastInfo != currentRadioAccessTechnology ||
lastInfo != currentRadioAccessTechnology) else {
//Internet connection did not change
return
}
}
// Internet connection changed to Edge or GPRS
// Store lastRadioAccessTechnology to check if internet connection changed
lastRadioAccessTechnology = currentRadioAccessTechnology
我正在开发一个iPhone应用程序,该应用程序需要能够识别当前正在使用的互联网连接类型(Wifi,3G,Edge等)。 我找到了一种使用 Apple 可达性示例代码进行检查的简单方法。网上似乎缺乏这方面的信息,希望这能帮助到某人。
首先将 Reachability.m/.h 复制到您的项目中,并将 #include"Reachability.h"包含在您的类中。
Reachability *reach = [[Reachability alloc]init];
if (reach.internetConnectionStatus == NotReachable) {
NSLog(@"No Connection Found");
} else if (reach.internetConnectionStatus == ReachableViaCarrierDataNetwork) {
NSLog(@"3G or Edge");
} else if (reach.internetConnectionStatus == ReachableViaWiFiNetwork) {
NSLog(@"Wifi Connection");
}
[reach release];
此代码可能不是实现此目的的最佳方法,但它似乎是最简单的方法。