如何确定iPhone用户是在Edge还是3G网络上?

7

虽然在你的应用程序中编程确定iPhone是否在Wifi或数据网络上相对简单,但我无法找到一种方法来确定iPhone是否处于Edge或3G上。

有人找到了一种确定这一点的方法吗?

注意:我不担心苹果AppStore的接受政策,所以我不介意在我的应用程序中做一些hacky的事情。(iPhone不应该被越狱)


1
我也在寻找这个问题的答案。如果您能够找到解决方案,请在此处发布。谢谢! - AJ.
4个回答

4
iPhone不会以编程的方式向开发人员提供这种信息。你能做到的最好的办法就是确定一个连接是否必须通过蜂窝网络路由到达给定的主机 - 请参见SCNetworkReachability参考和Reachability项目获取更多信息。

1
假设Tim的答案是正确的,你可以通过启动一个计时器让应用程序从网络下载一些文件并计算速度来测试连接速度,从而判断用户是否在3G或Edge上。你应该能够通过速度的差异来判断他们是否在3G或Edge上。

1
这并不总是可靠的 - 一个非常差的3G连接可能会有与良好的EDGE连接相同的吞吐量。这更多是猜测而不是确定性。此外,除了速度之外还有其他指标; 连接之间的另一个重大区别是首个响应数据包的时间(在这里EDGE往往胜出)。 - Tim
1
但是基于测量的猜测的优点在于,即使您认为自己处于Edge状态,但实际上处于3G状态,如果3G连接速度与Edge一样慢,那么您可能会正确地使用较低带宽传输。 - Kendall Helmstetter Gelner

0

试着从状态栏检查它:

UIApplication *app = [UIApplication sharedApplication];
NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"]    subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}
int connectivity;
connectivity =  [dataNetworkItemView valueForKey:@"dataNetworkType"];

到目前为止,我找到的值键:

0 = No wifi or cellular

1 = 2G and earlier? (not confirmed)

2 = 3G? (not yet confirmed)

3 = 4G

4 = LTE

5 = Wifi

-3

有一种方法可以确定iPhone 2G,那就是查看操作系统报告的设备名称。

#import <sys/utsname.h>
+ (NSString *)deviceType {
    struct utsname u;
    uname(&u);
    NSString *returnValue = [NSString stringWithFormat:@"%s", u.machine];

    return returnValue;
}

你要寻找的返回值是 "iPhone1,1",表示 iPhone 2G。将其与 Reachability 项目结合使用,以确定他们是否在蜂窝网络上,这样你就有了一条途径来确保他们处于 EDGE 连接状态。


1
在这种情况下,3G并不意味着“iPhone 3G”。 - Manni
并不意味着iPhone 3G。看看这个语句。“保证他们和iPhone 2G一样先进”,并没有提到iPhone 3G。 - scootklein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接