中国的iphone网络是区分2G和3G,要想获取当前的网络状态一直没有一个好的方法,网上给的例子也不尽让人满意最近闲来无事,仔细的研究Apple提供的例子:Reachability
通过如下的代码:
[cpp]
view plain
copy
- Reachability
*reach = [Reachability reachabilityWithHostName :@"www.apple.com"]; - NSLog(@"%d",
[reach currentReachabilityStatu s]); - return;
在currentReachabilityStatu
[cpp]
view plain
copy
- static
void PrintReachabilityFlags(SCNetworkReachabilityFla gs flags, c*****t char* comment) - {
- #if
kShouldPrintReachability Flags - NSLog(@"Reachability
Flag Status: %c%c %c%c%c%c%c%c%c %s\n", -
(flags & kSCNetworkReachabilityFl agsIsWWAN) ? 'W' : '-', -
(flags & kSCNetworkReachabilityFl agsReachable) ? 'R' : '-', -
(flags & kSCNetworkReachabilityFl agsTransientConnection) ? 't' : '-', -
(flags & kSCNetworkReachabilityFl agsConnectionRequired) ? 'c' : '-', -
(flags & kSCNetworkReachabilityFl agsConnectionOnTraffic) ? 'C' : '-', -
(flags & kSCNetworkReachabilityFl agsInterventionRequired) ? 'i' : '-', -
(flags & kSCNetworkReachabilityFl agsConnectionOnDemand) ? 'D' : '-', -
(flags & kSCNetworkReachabilityFl agsIsLocalAddress) ? 'l' : '-', -
(flags & kSCNetworkReachabilityFl agsIsDirect) ? 'd' : '-', -
comment -
); - #endif
- }
当是wifi的时候输出R
当是3G的时候输出Rt
当是联通2G或者是移动的时候输出Rtc
在头文件定义如下:
[cpp]
view plain
copy
- typedef
enum - {
-
NotReachable = 0, -
ReachableViaWiFi, -
ReachableVia3G, -
ReachableVia2G,//当前无法区分是联通的2G还是移动的2G - }
NetworkStatus;
因此我就是以这个为判断条件的,重写Reachability的函数:
[cpp]
view plain
copy
- -
(NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFla gs) flags - {
-
if ((flags & kSCNetworkReachabilityFl agsReachable) == 0) -
{ -
return NotReachable; -
} -
BOOL retVal = NotReachable; -
if ((flags & kSCNetworkReachabilityFl agsConnectionRequired) == 0) -
{ -
// if target host is reachable and no connection is required -
// then we'll assume (for now) that your on Wi-Fi -
retVal = ReachableViaWiFi; -
} -
if ( -
((flags & kSCNetworkReachabilityFl agsConnectionOnDemand ) != 0) || -
(flags & kSCNetworkReachabilityFl agsConnectionOnTraffic) != 0 -
) -
{ -
// ... and the connection is on-demand (or on-traffic) if the -
// calling application is using the CFSocketStream or higher APIs -
if ((flags & kSCNetworkReachabilityFl agsInterventionRequired) == 0) -
{ -
// ... and no [user] intervention is needed -
retVal = ReachableViaWiFi; -
} -
} - if ((flags & kSCNetworkReachabilityFl
agsIsWWAN) == kSCNetworkReachabilityFl agsIsWWAN)
{
if((flags & kSCNetworkReachabilityFl agsReachable) == kSCNetworkReachabilityFl agsReachable) {
if ((flags & kSCNetworkReachabilityFl agsTransientConnection) == kSCNetworkReachabilityFl agsTransientConnection) {
retVal = ReachableVia3G;
if((flags & kSCNetworkReachabilityFl agsConnectionRequired) == kSCNetworkReachabilityFl agsConnectionRequired) {
retVal = ReachableVia2G;
}
}
}
}
-
return retVal; - }
这样就可以正确的区分是2G,3G,wifi网络,这只支持中国地区,其他地区未考虑。
作者:Rush.D.Xzj
http://blog.csdn.net/zengconggen/article/details/7556007
但我使用此方法没成功。。。先做个记录吧。