如何在 iOS 中检测 wifi 或 3G 信号强度?

Posted

技术标签:

【中文标题】如何在 iOS 中检测 wifi 或 3G 信号强度?【英文标题】:How to Detect wifi or 3G signal strength in iOS? 【发布时间】:2014-12-24 05:31:19 【问题描述】:

我正在使用 ios 中的 MPMediaplayer 框架开发视频播放器,我需要在我的应用程序中播放两个视频。(即当用户有强网络信号时,我的第一个视频将播放)。 我的第二个视频播放器将在他们的网络低时播放。我需要在 wifi 或 3G 等中播放我的视频......我的第一件事是如何检测我的 iphone 手机中的 wifi 速度和 3G 速度。我需要以 MBPS 获得移动 wifi 速度。我正在尝试编写一些代码。但这对我不起作用。提前致谢。

#import "Reachability.h"

@interface NetworkViewController ()

@end

@implementation NetworkViewController

- (void)viewDidLoad

    [super viewDidLoad];    
    self.view.backgroundColor = [UIColor whiteColor];
    [self getDataCounters];

    networkLabel = [[UILabel alloc]initWithFrame:CGRectMake(20, 100, 300, 40)];
    networkLabel.textColor = [UIColor blackColor];
    networkLabel.backgroundColor = [UIColor whiteColor];
    networkLabel.userInteractionEnabled = NO;
    networkLabel.text = myNewString;

    [self.view addSubview:networkLabel];


- (NSArray *)getDataCounters

    BOOL success;
    struct ifaddrs *addrs;

    const struct ifaddrs *cursor;
    const struct if_data *networkStatisc;

    int WiFiSent = 0;
    int WiFiReceived = 0;
    int WWANSent = 0;
    int WWANReceived = 0;

    NSString *name=[[NSString alloc]init];
    success = getifaddrs(&addrs) == 0;

    if (success)
    
         cursor = addrs;

         while (cursor != NULL)
         
             name=[NSString stringWithFormat:@"%s",cursor->ifa_name];            
             NSLog(@"ifa_name %s == %@\n", cursor->ifa_name,name);

             // names of interfaces: en0 is WiFi ,pdp_ip0 is WWAN

             if (cursor->ifa_addr->sa_family == AF_LINK)
             
                 if ([name hasPrefix:@"en"])
                 
                      networkStatisc = (const struct if_data *) cursor->ifa_data;   
                      WiFiSent+=networkStatisc->ifi_obytes;   
                      WiFiReceived+=networkStatisc->ifi_ibytes;
                      NSLog(@"WiFiSent %d ==%d",WiFiSent,networkStatisc->ifi_obytes);
                      NSLog(@"WiFiReceived %d ==%d",WiFiReceived,networkStatisc->ifi_ibytes);
                      NSLog(@"wifi data is  %.2f",(float)WiFiReceived/1048576);

                    myNewString = [NSString stringWithFormat:@"%2f", (float)WiFiReceived/1048576];   
                    networkLabel.text = myNewString;
                

                if ([name hasPrefix:@"pdp_ip"])
                
                     networkStatisc = (const struct if_data *) cursor->ifa_data;     
                     WWANSent+=networkStatisc->ifi_obytes;
                     WWANReceived+=networkStatisc->ifi_ibytes;
                     NSLog(@"WWANSent %d ==%d",WWANSent,networkStatisc->ifi_obytes);
                     NSLog(@"WWANReceived %d ==%d",WWANReceived,networkStatisc->ifi_ibytes);
                
            

            cursor = cursor->ifa_next;
        

        freeifaddrs(addrs);
    

    return [NSArray arrayWithObjects:[NSNumber numberWithInt:WiFiSent], [NSNumber  numberWithInt:WiFiReceived],[NSNumber numberWithInt:WWANSent],[NSNumber numberWithInt:WWANReceived], nil];

【问题讨论】:

看看这个 - ***.com/questions/26675427/… 您似乎在暗示信号强度决定了连接速度。你问的是哪个?选择一个。 @JonathonReinhart 感谢您的回复。我需要计算信号强度..如果 wifi 具有高带宽,我需要显示高带宽视频播放器..如果 wifi 具有低带宽,那么我需要播放低带宽视频播放器..所以我需要计算 wifi 或3g 信号强度(以 MBPS 为单位) 信号强度以 MB/秒为单位。信号强度仅与无线电接收有关,以dBm 或ASU 衡量。连接的带宽通常以每秒位数(而不是字节)或千分之一(kbps、Mbps)为单位。 一个连接通常有一个理论上的带宽上限,但我们实际上关心的是一个连接的吞吐量(每这个管道可以移动的时间)。这以每秒字节数(或 1000 字节)为单位。问题是,衡量吞吐量的唯一方法是实际移动那么多数据。这就是在线速度测试的工作原理;下载一堆数据并计时。将两者分开,就可以完成。对上传执行相同的操作。 【参考方案1】:

您可以播放 wifi 的高分辨率视频和蜂窝数据的低分辨率视频。

Reachability *reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];

NetworkStatus status = [reachability currentReachabilityStatus];

if(status == NotReachable) 

    //No internet

else if (status == ReachableViaWiFi)

    //WiFi    Play high resolution video

else if (status == ReachableViaWWAN) 

    //3G    Play low resolution video

如果您将通过 3g 网络传输高分辨率视频,Apple 可以拒绝您的应用。

【讨论】:

感谢您的回复..但我需要获得设备带宽..所以请指导我如何做这件事?基于设备带宽我需要播放视频播放器。如果我有高带宽,那么需要播放高带宽视频播放器。如果我有低带宽,那么我需要播放低带宽 Apple 没有提供这种 API 或库。您已拨打网络服务电话以了解您设备的互联网连接带宽。 webservices??基于webservices是否可以获得移动wifi带宽?? 是的,这就是您如何在您的计算机上测试您的互联网速度。检查此链接testmy.net/results 或者您可以简单地下载一个小数据并找出下载速率并在此基础上进行自己的工作。

以上是关于如何在 iOS 中检测 wifi 或 3G 信号强度?的主要内容,如果未能解决你的问题,请参考以下文章

检测 3G 或 Wifi 网络恢复

如何在 iOS7 中以编程方式找到连接 3G 网络或 Wifi 的 iPhone 设备

检查手机是不是使用 WIFI 或 Data/3G

有没有办法检测我正在使用啥样的连接? WiFi、3G 还是以太网?

4G和wifi的区别

如何在手机中检查 WIFI 和 3G(数据计划)中的网络连接启用或禁用?