iOS 下不用私有 API,有办法判断 2G 和 3G 网络么?

2013-03-25 22:47:01 +08:00
 vanemu
或者说,有什么靠谱的方法可以知道当前的网络质量?
9053 次点击
所在节点    iDev
14 条回复
loveminds
2013-03-26 00:53:29 +08:00
是否可以通过下载一定数据进行测速的方式(当然,这很耗流量)
chemhack
2013-03-26 01:44:28 +08:00
截图然后看图标?
txx
2013-03-26 05:02:16 +08:00
@chemhack 碰上越狱乱改的就无解了...
弄个数据包测一下就好吧...2g和3g的网速都不是一个数量级的
chemhack
2013-03-26 05:05:21 +08:00
@txx 这个比看图标还不可靠吧。。。
txx
2013-03-26 05:10:20 +08:00
@chemhack lz的目的是判断网络质量而不是3g 2g嘛....
shellcodecow
2013-03-26 10:57:52 +08:00
中国的iphone网络是区分2G和3G,要想获取当前的网络状态一直没有一个好的方法,网上给的例子也不尽让人满意
最近闲来无事,仔细的研究Apple提供的例子:Reachability
通过如下的代码:

?
1
2
3
Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
NSLog(@"%d", [reach currentReachabilityStatus]);
return;

在currentReachabilityStatus函数中,我们注意到这样的输出:

static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* comment)
{
#if kShouldPrintReachabilityFlags

NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s\n",
(flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-',
(flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-',

(flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-',
(flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',
(flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-',
(flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-',
(flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-',
comment
);
#endif
}
当是wifi的时候输出R
当是3G的时候输出Rt
当是联通2G或者是移动的时候输出Rtc
在头文件定义如下:
?
1
2
3
4
5
6
typedef enum {
NotReachable = 0,
ReachableViaWiFi,
ReachableVia3G,
ReachableVia2G,//当前无法区分是联通的2G还是移动的2G
} NetworkStatus;


因此我就是以这个为判断条件的,重写Reachability的函数:
- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
{
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
return NotReachable;
}


BOOL retVal = NotReachable;

if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 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 & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
// ... and the connection is on-demand (or on-traffic) if the
// calling application is using the CFSocketStream or higher APIs
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
// ... and no [user] intervention is needed
retVal = ReachableViaWiFi;
}
}

?
1
2
3
4
5
6
7
8
9
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
retVal = ReachableVia3G;
if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {
if((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
retVal = ReachableVia2G;
}
}
}

return retVal;
}


这样就可以正确的区分是2G,3G,wifi网络,这只支持中国地区,其他地区未考虑。
作者:Rush.D.Xzj
shellcodecow
2013-03-26 10:58:25 +08:00
好吧 我复制黏贴了 请自行补脑。Sorry
hilenlai
2013-03-26 21:59:21 +08:00
bang590
2013-03-26 22:08:59 +08:00
测速
loveminds
2013-03-27 04:05:07 +08:00
@shellcodecow 3G还分电信联通两家呢~这个范例4G(LTE)输出什么?R么?
shellcodecow
2013-03-27 10:03:18 +08:00
@loveminds 4G我就不知道了,你要实现看目的是什么了。我个人想的是一个软件只要分清2G/3G应该就可以了吧。
darcy
2013-03-27 12:04:45 +08:00
木有可靠方法的
cloudream
2013-03-27 12:30:04 +08:00
让用户自己选择自己的网络最靠谱,默认2G,用3g的自己会打开 LOL
yuhe520521
2013-11-27 15:38:49 +08:00
@cloudream 你难道不知道公司有一个部门叫做 用户体验设计部门么 你说 让用户自己选 就用户自己选的话 你让他们吃什么?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64017

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX