如何确定用户在iPhone上是使用Edge还是3G

如何确定用户在iPhone上是使用Edge还是3G,iphone,Iphone,虽然在应用程序中以编程方式确定iPhone是在Wifi上还是在数据网络上相对简单,但我无法找到确定iPhone是在Edge还是3G上的方法 有人想出一个办法来确定这一点吗 注意:我不担心苹果应用商店的验收政策,所以我不介意在我的应用程序中做一些黑客行为。(不过iPhone不应该被越狱)iPhone不以编程方式向开发者提供此类信息。您所能期望的最好结果是确定与给定主机的连接是否必须通过蜂窝网络路由-有关更多信息,请参阅参考和项目。假设Tim的答案是正确的,判断用户是否使用3G或edge的一种方法是

虽然在应用程序中以编程方式确定iPhone是在Wifi上还是在数据网络上相对简单,但我无法找到确定iPhone是在Edge还是3G上的方法

有人想出一个办法来确定这一点吗


注意:我不担心苹果应用商店的验收政策,所以我不介意在我的应用程序中做一些黑客行为。(不过iPhone不应该被越狱)

iPhone不以编程方式向开发者提供此类信息。您所能期望的最好结果是确定与给定主机的连接是否必须通过蜂窝网络路由-有关更多信息,请参阅参考和项目。

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

你可以确定检测iPhone 2G的一种方法是查看操作系统报告的设备名称

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

    return returnValue;
}
#导入
+(NSString*)设备类型{
结构utsname u;
uname&u;
NSString*returnValue=[NSString stringWithFormat:@“%s”,u.machine];
返回值;
}

您要查找的返回值是“iPhone1,1”,表示为iphone2g。将此与可达性项目结合起来,告诉他们何时在蜂窝网络上,并且您有一条途径可以保证他们处于边缘连接上

尝试从状态栏检查:

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

这并不总是可靠的-一个非常差的3G连接可以具有与一个伟大的边缘连接相同的吞吐量。这将是猜测多于一切。此外,除了速度,还有其他指标;连接之间的另一大区别是第一次响应数据包的时间(EDGE在这里往往胜出)。但是基于测量数据的猜测的优势,如果3G连接速度和Edge一样慢,那么即使你认为自己在Edge上,但真的在3G上——你可能会做正确的事情,使用较低的带宽传输。我也在寻找这个问题的答案。如果你能想出一个解决方案,请张贴在这里。谢谢3G并不意味着“iPhone3G”,在这种情况下,它并不意味着iPhone3G。看看这个声明。“保证他们在iPhone 2G上处于领先地位”并没有提及iPhone 3G。