8之前获取wifi信息 ios_ios 为什么在ios12上获取不到wifi名称 - CSDN
  • 前段时间在开发过程中遇到一个问题,就是之前设置的获取手机连接WiFi名称的方法不起作用了,后来经查发现是因为新系统需要申请开启相对应的权限才能获取到手机连接的WiFi名称等信息,本章就来讲一下iOS12.0以上系统...

    前段时间在开发过程中遇到一个问题,就是之前设置的获取手机连接WiFi名称的方法不起作用了,后来经查发现是因为新系统需要申请开启相对应的权限才能获取到手机连接的WiFi名称等信息,本章就来讲一下iOS12.0以上系统获取WiFi名称的方法。

    一、iOS12.0以下系统获取WiFi名字和mac地址信息的方法

    在iOS有关WiFi开发中,苹果官方提供了NetworkExtension框架让iOS开发者实现VPN以及WiFi热点相应的功能,虽然在iOS9.0系统以后,这个框架的很多功能都被苹果官方屏蔽,想要使用这些被屏蔽的功能,需要开发者去申请权限才能用,但是简单的获取WiFi名字和WiFi的mac地址信息等方法还是可以正常使用的。

    1、获取WiFi相关信息的时候需要引入一下头文件

    #import <SystemConfiguration/CaptiveNetwork.h>

    #import <NetworkExtension/NetworkExtension.h>

    想要获取iPhone手机连接到的WiFi名字和WiFi的mac地址,需要用到CNCopySupportedInterfaces和CNCopyCurrentNetworkInfo两个类,具体的实现方法如下所示:

    ①获取SSID(Service Set Identifier):服务集标识,即WiFi网络的名称。

    + (NSString *)wiFiName {

        NSArray *wiFiName = CFBridgingRelease(CNCopySupportedInterfaces());

        id info1 = nil;

        for (NSString *wfName in wiFiName) {

            info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) wfName);

            if (info1 && [info1 count]) {

                break;

            }

        }

        NSDictionary *dic = (NSDictionary *)info1;

        NSString *ssidName = [[dic objectForKey:@"SSID"] lowercaseString];

        return ssidName;

    }

     

    ②获取BSSID,即WiFi的mac地址。

    + (NSString *)wifiMac {

        NSArray *wfMac = CFBridgingRelease(CNCopySupportedInterfaces());

        id info1 = nil;

        for (NSString *macName in wfMac) {

            info1 = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef) macName);

            if (info1 && [info1 count]) {

                break;

            }

        }

        NSDictionary *dic = (NSDictionary *)info1;

        NSString *wifiMac = [dic objectForKey:@"BSSID"];

        return wifiMac;

    }

     

     

    二、iOS12.0以上系统获取WiFi信息的方法

    1、苹果开发者官网官方的解释如下:

    Important

    To use this function in iOS 12 and later, enable the Access WiFi Information capability for your app in Xcode. When you enable this capability, Xcode automatically adds the Access WiFi Information entitlement to your entitlements file and App ID.

    重要提示

    要在iOS 12及以后系统中使用此功能,请在Xcode中为应用程序启用WiFi信息访问功能。当您启用此功能时,Xcode会自动将访问WiFi信息权限添加到您的权限文件和应用程序App ID中。

     

    2、步骤

    通过上面的苹果的官方解释可以知道,要想在iOS12.0及以上系统中继续使用该方法,就需要申请获取授权。若使用的是自动签名,授权之后Xcode会自动在App ID和应用的权限列表中增加WiFi使用的权限。若使用的是手动签名,则还需要去App ID中配置一下权限,并生成新的profile文件。具体的操作步骤如下所示:

    设置Xcode里面Capabilities的步骤:Target —> Capabilities —> Access WiFi Information —> ON

     

    若项目使用的是手动签名,则在上面打开Access WiFi Information选项之后,会造成Add the Access WiFi Information feature to your App ID这一项会报错,需要开发者手动去App ID账号中操作设置。具体操作步骤如下所示:

    打开添加Access WiFi Information之后,项目会在.entitlements文件中添加Access WiFi Information信息,如果创建的时候没有.entitlements文件,会同时创建该文件。

    操作以上步骤之后,在iOS12.0及以上系统中获取WiFi名字和WiFi的mac信息的方法就可以正常获使用了。若采用的是手动签名,需要在开发者账号中找到App IDs,并配置Access WiFi Information,编辑App ID,勾选相应的选项,然后保存即可。具体操作步骤如下所示:

     

    最后再重新生成项目的Provisioning Profiles文件,包括Distribution的和Development两个不同的模式,下载双击打开,项目就可正常签名,就可以正常的获取到手机连接的WiFi的相关信息了。

    3、使用场景实例

    以下实例是按照实际使用场景来说明的,具体如下所示:

     

    以上就是本章全部内容,欢迎关注三掌柜的微信公众号、微博,欢迎关注!

    三掌柜的微信公众号:

    三掌柜的新浪微博:

     

    展开全文
  • 前段时间在开发蓝牙功能,蓝牙功能开发结束之后最近又在开发WiFi功能。WiFi功能也算简单,主需要导入使用苹果系统自带的框架即可,仅仅... 苹果在iOS9.0以后提供了获取WiFi列表的API,但是需要开发人员主动发邮件...

          前段时间在开发蓝牙功能,蓝牙功能开发结束之后最近又在开发WiFi功能。WiFi功能也算简单,主需要导入使用苹果系统自带的框架即可,仅仅单纯的获取手机当前连接的WiFi名称,或者获取手机系统显示的WiFi列表,那就so easy了。这里我介绍一下WiFi开发主要的步骤和流程,一些其他的使用细节不再一一阐述。

    苹果在iOS9.0以后提供了获取WiFi列表的API,但是需要开发人员主动发邮件给苹果,等待审核通过之后打开获取WiFi列表权限才能使用;但是在iOS9.0之前,只能获取到手机当前连接的WiFi名称等信息。


    一、iOS9.0之前获取WiFi权限

    1、导入头文件

            #import<SystemConfiguration/CaptiveNetwork.h>

    2、获取手机当前连接的WiFi信息的方法

    //获取手机当前连接WiFi信息

    - (NSString *)getWifiName {

        NSString *wifiName = nil;

        CFArrayRef wifiInterfaces = CNCopySupportedInterfaces();

        if (!wifiInterfaces) {

            return @"未知";

        }

        NSArray *interfaces = (__bridge NSArray *)wifiInterfaces;

        for (NSString *interfaceName in interfaces) {

            CFDictionaryRef dictRef = CNCopyCurrentNetworkInfo((__bridge CFStringRef)(interfaceName));

            if (dictRef) {

                NSDictionary *networkInfo = (__bridge NSDictionary *)dictRef;

                wifiName = [networkInfo objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];

                CFRelease(dictRef);

            }

        }

        CFRelease(wifiInterfaces);

        return wifiName;

    }

    3、直接使用第2步的方法,进一步操作


            比如,这里我直接获取使用WiFi的名字,然后赋值给UItextfieldself.networkTF.text = [self getWifiName];


    二、iOS9.0之后获取WiFi权限

           iOS9.0之后获取WiFi权限需要以下几个主要步骤:

    1、向 Apple 申请开发 Network Extension 权限;

           写封邮件给 networkextension@apple.com ,向苹果要开发 Network Extension 的权限。申请邮件内容如下所示,仅供参考:

    Hi, I am a personal developer on ios9, I am using xcode8.0 to develop app, AppleID:XXXXXXXXXX, I want to get SSID and BSSID and RSSI by scanning near WiFi, I hope to get the NetworkExtension permission, please approve!


    苹果收到邮件后会自动回复邮件,然后根据苹果回复的邮件提供的链接,打开连接根据选项逐一填写,然后提交之后14天左右就可以收到苹果的确认回复邮件。

    2、申请包含 Network Extension 的描述文件;


         申请获取WiFi权限通过之后,需要进入开发者账号里面配置创建Network Extension的描述文件,配置成功之后点击下载,下载完成双击打开描述文件。

    3、配置 Info.plist


         打开项目,在XcodeInfo.plistRequired background modes 添加一个 network-authentication(item)

    4、配置 entitlements


         在XcodeInfo.plistEntitlements File下添加一个键值对: com.apple.developer.networking.HotspotHelper -> YES

    5iOS 获取 Wifi 列表代码实现;

         导入头文件:

         #import <NetworkExtension/NetworkExtension.h>  


          //实现部分

    - (void)getWifiList {
    if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;}
    dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0);
    [NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
    //kNEHotspotHelperCommandTypeFilterScanList:表示扫描到 Wifi 列表信息。
    if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
    //NEHotspotNetwork 里有如下信息:SSIDWifi 名称;BSSID:站点的 MAC 地址;signalStrength Wifi信号强度,该值在0.0-1.0之间;secure:网络是否安全 (不需要密码的 Wifi,该值为 false)autoJoined 设备是否自动连接该 Wifi,目前测试自动连接以前连过的 Wifi 的也为 false justJoined:网络是否刚刚加入;chosenHelperHotspotHelper是否为网络的所选助手
    for (NEHotspotNetwork* network  in cmd.networkList) {
    NSLog(@“+++++%@“,network.SSID);
    }
    }
    }];

    }


    6、获取Wifi列表回调


    以上的五个步骤操作之后,运行项目,会发现没有WiFi列表的回调,那是因为没有刷新WiFi列表,这时候就需要你手动打开手机系统设置—>WLAN—>系统WiFi列表加载出来的时候,上面的代码才会执行回调,才获取到WiFi列表。


    三、代理方法

    #pragma mark —Register a Hotspot Helper—


    + (BOOL)registerWithOptions:(NSDictionary*)options queue:(dispatch_queue_t)queue handler:(NEHotspotHelperHandler)handler


    @param options


    kNEHotspotHelperOptionDisplayName WIFI注释tag字符串// 这里设置的内容将会在WiFi列表中每个WiFi下边展示


    @param queue dispatch_queue_t 用来调用handleblock

    @param handler NEHotspotHelperHandler block 用于执行处理helper commands.


    @return 注册成功为YES, 否则NO.

    @discussion 这个API一旦调用成功,应用程序有资格在后台启动,并参与各种热点相关的功能。 当应用程序启动此方法,应该调用一次,再次调用它,就不会产生影响,并且返回NO


    #pragma mark —Manage Hotspot Networks—


    + (BOOL)logoff:(NEHotspotNetwork *)network


    @param network 对应当前关联的WiFi网络NEHotspotNetwork


    @return 注销命令已成功进入队列为YES, 否则NO.

    @discussion 调用这个方法使kNEHotspotHelperCommandTypeLogoff型的NEHotspotHelperCommand向应用程序发出的“handler”模块,网络参数须符合当前关联的WiFi网络,必须来自对NEHotspotHelperCommand网络属性或者方法supportedInterfaces


    + (NSArray *)supportedNetworkInterfaces


    @return 如果没有网络接口被管理就返回nil,否则就返回NEHotspotNetwork对象数组。

    @discussion 每个网络接口由NEHotspotNetwork对象表示,当前返回的数组包含一个NEHotspotNetwork对象,代表Wi-Fi接口。


    四、具体实现调用的方法,获取wifi列表,并给指定ssid做标记

    - (void)getWifiList {

        NSMutableDictionary* options = [[NSMutableDictionary alloc] init];

        [options setObject:@“上网” forKey:kNEHotspotHelperOptionDisplayName];

        dispatch_queue_t queue = dispatch_queue_create("com.myapp.ex", NULL);

        BOOL returnType = [NEHotspotHelper registerWithOptions:options queue:queue handler: ^(NEHotspotHelperCommand * cmd) {

            NEHotspotNetwork* network;

            NSLog(@"COMMAND TYPE:   %ld", (long)cmd.commandType);

            [cmd createResponse:kNEHotspotHelperResultAuthenticationRequired];

            if (cmd.commandType == kNEHotspotHelperCommandTypeEvaluate || cmd.commandType ==kNEHotspotHelperCommandTypeFilterScanList) {

                NSLog(@"WIFILIST:   %@", cmd.networkList);

                for (network  in cmd.networkList) {

                    //NSLog(@"COMMAND TYPE After:   %ld", (long)cmd.commandType);

                    if ([network.SSID isEqualToString:@"ssid"]|| [network.SSID isEqualToString:@"test"]) {

                        double signalStrength = network.signalStrength;

                        NSLog(@"Signal Strength: %f", signalStrength);

                        [network setConfidence:kNEHotspotHelperConfidenceHigh];

                        [network setPassword:@"password"];

                        NEHotspotHelperResponse *response = [cmd createResponse:kNEHotspotHelperResultSuccess];

                        NSLog(@"Response CMD %@", response);

                        [response setNetworkList:@[network]];

                        [response setNetwork:network];

                        [response deliver];

                    }

                }

            }

        }];

        NSLog(@"result :%d", returnType);

        NSArray *array = [NEHotspotHelper supportedNetworkInterfaces];

        NSLog(@"wifiArray:%@", array);

        NEHotspotNetwork *connectedNetwork = [array lastObject];

        NSLog(@"supported Network Interface: %@", connectedNetwork);

    }



            以上就是本节的全部内容,欢迎关注山掌柜的微信公众号,更多精彩等你来!



    展开全文
  • 链接: 解决iOS13 无法获取WiFi名称(SSID)问题 链接: 6.iOS13 获取不到WiFi ssid 的问题 链接: 关于 iOS 13 CNCopyCurrentNetworkInfo 不再返回Wi-Fi SSID and BSSID

    升级到iOS13以后,发现之前获取WiFi名称的接口失效了,返回的都是固定值"WLAN"。这里可能是因为苹果对用户隐私保护问题,因为通过wifi信息可以定位到用户地理位置。所以iOS13以后如果想要继续获取WiFi名称,需要在调用接口前判断用户是否同意app使用地理位置信息。

    1.添加定位库

    在这里插入图片描述

    2.在Info.plist文件中配置,我把关于定位的4个都配上了

    在这里插入图片描述

    3.在控制中引入头文件,遵守代理

    在这里插入图片描述

    4.实现代理弹出框获取用户的定位授权

    #pragma mark - 定位授权代理方法
    - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
        if (status == kCLAuthorizationStatusAuthorizedWhenInUse ||
            status == kCLAuthorizationStatusAuthorizedAlways) {
            //再重新获取ssid
            [self getSSID];
        }
    }
    
    - (void)getLocation
    {
        if (!self.locManager) {
            self.locManager = [[CLLocationManager alloc] init];
            
        }
        
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
            //这句代码会在app的设置中开启位置授权的选项,只有用户选择了允许一次,下次用户调用这个方法才会弹出询问框,选择不允许或是使用期间允许,下次调用这个方法都不会弹出询问框
            [self.locManager requestAlwaysAuthorization];
            
        }
        
        self.locManager.delegate = self;
        //如果用户第一次拒绝了,弹出提示框,跳到设置界面,要用户打开位置权限
        //如果用户跳到设置界面选择了下次询问,再回到app,[CLLocationManager authorizationStatus]的值会是nil,所以要||后面的判断
        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied || ![CLLocationManager authorizationStatus]) {
            [self alertMy];
        }
    }
    
    - (void)alertMy{
           //1.创建UIAlertControler
           UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"app需要获取您的位置权限,以获取wifi信息,给机器人配网" preferredStyle:UIAlertControllerStyleAlert];
         
           UIAlertAction *conform = [UIAlertAction actionWithTitle:@"设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
               //使用下面接口可以打开当前应用的设置页面
               [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
               NSLog(@"点击了确认按钮");
           }];
           //2.2 取消按钮
           UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
               NSLog(@"点击了取消按钮");
           }];
        
           //3.将动作按钮 添加到控制器中
           [alert addAction:conform];
           [alert addAction:cancel];
           
           //4.显示弹框
           [self presentViewController:alert animated:YES completion:nil];
    }
    
    

    4.获取wifi信息

    - (void)getSSID{
        ssidStr = [JMAirKissShareTools fetchSSIDInfo][@"SSID"];
        
        if ([StringHelper isNilOrEmpty:ssidStr]) {
            [self showHint:@"请加入Wi-Fi网络后搜索"];
            ssidStr = @"未连接到WiFi";
        }
        _wifiLab.text = ssidStr;
    
    }
    
    #import "JMAirKissShareTools.h"
    
    #import <SystemConfiguration/SystemConfiguration.h>
    #import <SystemConfiguration/CaptiveNetwork.h>
    
    #include <inttypes.h>
    
    #define CRC8INIT 0x00
    #define CRC8POLY 0x31 // = X^8+X^5+X^4+X^0
    
    @implementation JMAirKissShareTools
    /**
     *  获取SSID信息
     *
     *  @return id
     */
    + (id)fetchSSIDInfo {
        
        
        NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
        id info = nil;
        for (NSString *ifnam in ifs) {
            info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
            
            if (info && [info count]) {
                break;
            }
        }
        return info;
    }
    
    @end
    

    参考博客:
    链接: 6.iOS13 获取不到WiFi ssid 的问题
    链接: OC 源生获取当前位置经纬度
    链接: 解决iOS13 无法获取WiFi名称(SSID)问题

    展开全文
  • 升级到iOS13以后,发现之前获取WiFi名称的接口失效了,返回的都是固定值"WLAN"。这里可能是因为苹果对用户隐私保护问题,因为通过wifi信息可以定位到用户地理位置。所以iOS13以后如果想要继续获取WiFi名称,需要在...

    升级到iOS13以后,发现之前获取WiFi名称的接口失效了,返回的都是固定值"WLAN"。这里可能是因为苹果对用户隐私保护问题,因为通过wifi信息可以定位到用户地理位置。所以iOS13以后如果想要继续获取WiFi名称,需要在调用接口前判断用户是否同意app使用地理位置信息。

    我这里只在第一次使用时提示:

    NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
        CGFloat version = [phoneVersion floatValue];
        // 如果是iOS13 未开启地理位置权限 需要提示一下
        if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined && version >= 13) {
           self.locationManager = [[CLLocationManager alloc] init];
           [self.locationManager requestWhenInUseAuthorization];
        }

     

    展开全文
  • 之前我在做一个项目时遇到一个问题就是要获取wifi的网关,但是在网上搜了一下发现使用CNCopyCurrentNetWorkInfo这种方法只能获取wifi的名称和mac地址,其他的都获取不到,而我所需要的是网关等信息,终于找了很久...

    之前我在做一个项目时遇到一个问题就是要获取wifi的网关,但是在网上搜了一下发现使用CNCopyCurrentNetWorkInfo这种方法只能获取到wifi的名称和mac地址,其他的都获取不到,而我所需要的是网关等信息,终于找了很久才找到解决方法,用C语言直接从底层获取这些信息,整个iOS的工程我已经放到github上了,大家可以到GitHub上下载,链接是 https://github.com/WrathLi/iOS_WIFI_Information

    废话不多说,这里我们直接上代码。

    首先,我新建了一个WifiManager的.h和.m文件,大家不要在意名字,我这人很懒,名字都是随便写的。

    //返回广播地址,利用广播地址获取网关
    - (NSString *) routerIp {
    	
    	NSString *address = @"error";
    	struct ifaddrs *interfaces = NULL;
    	struct ifaddrs *temp_addr = NULL;
    	int success = 0;
    	
    	// retrieve the current interfaces - returns 0 on success
    	success = getifaddrs(&interfaces);
    	if (success == 0)
    	{
    		// Loop through linked list of interfaces
    		temp_addr = interfaces;
    		while(temp_addr != NULL)
    		{
    			if(temp_addr->ifa_addr->sa_family == AF_INET)
    			{
    				// Check if interface is en0 which is the wifi connection on the iPhone
    				if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"])
    				{
    					// Get NSString from C String //ifa_addr
    					//ifa->ifa_dstaddr is the broadcast address, which explains the "255's"
    					//                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)];
    					
    					address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
    					
    					//routerIP----192.168.1.255 广播地址
    					NSLog(@"broadcast address--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]);
    					_wifiBroadcastAddress = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)];
    					
    					//--192.168.1.106 本机地址
    					NSLog(@"local device ip--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]);
    					_wifiIP = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
    					
    					//--255.255.255.0 子网掩码地址
    					NSLog(@"netmask--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]);
    					_wifiNetMast = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)];
    					
    					//--en0 端口地址
    					NSLog(@"interface--%@",[NSString stringWithUTF8String:temp_addr->ifa_name]);
    					_wifiInterface = [NSString stringWithUTF8String:temp_addr->ifa_name];
    				}
    			}
    			
    			temp_addr = temp_addr->ifa_next;
    		}
    	}
    	
    	// Free memory
    	freeifaddrs(interfaces);
    	
    	return address;
    }
    

    上面这个方法是获取除网关之外的wifi信息的,网关的获取要在C文件下获取,这里返回广播地址,利用广播地址来获取网关。

    char * getdefaultgateway(in_addr_t * addr)
    {
    #if 0
        /* net.route.0.inet.dump.0.0 ? */
        int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET,
            NET_RT_DUMP, 0, 0/*tableid*/};
    #endif
        /* net.route.0.inet.flags.gateway */
        int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET,
            NET_RT_FLAGS, RTF_GATEWAY};
        size_t l;
        char * buf, * p;
        struct rt_msghdr * rt;
        struct sockaddr * sa;
        struct sockaddr * sa_tab[RTAX_MAX];
        int i;
        int r = -1;
    	 static char tmp[20];
    
        if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) {
            return tmp;
        }
        if(l>0) {
            buf = malloc(l);
            if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) {
                return tmp;
            }
            for(p=buf; p<buf+l; p+=rt->rtm_msglen) {
                rt = (struct rt_msghdr *)p;
                sa = (struct sockaddr *)(rt + 1);
                for(i=0; i<RTAX_MAX; i++) {
                    if(rt->rtm_addrs & (1 << i)) {
                        sa_tab[i] = sa;
                        sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len));
                    } else {
                        sa_tab[i] = NULL;
                    }
                }
                
                if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY))
                   && sa_tab[RTAX_DST]->sa_family == AF_INET
                   && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) {
                    
                    unsigned char octet[4]  = {0,0,0,0};
                    for (int i=0; i<4; i++){
                        octet[i] = ( ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr >> (i*8) ) & 0xFF;
                    }
                    
                    if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) {
    						 
    						*addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr;
    						r = 0;
    						 sprintf(tmp,"%d.%d.%d.%d",octet[0],octet[1],octet[2],octet[3]);
    						 printf("gateway : %s\n",tmp);
    						 printf("gateway address--%d.%d.%d.%d\n",octet[0],octet[1],octet[2],octet[3]);
                    }
                }
            }
            free(buf);
        }
    	return tmp;
    }
    

    getgateway这个方法返回了网关,不过是char * 类型的,如果你要把它转化成NSString类型,只要使用[[NSString alloc] initWithFormat:@"%s",gateway];这段代码就可以了。

    好了,这是我第一次在CSDN上写博客,就写到这里吧。希望对有需要的人有帮助。

    展开全文
  • 比如我们连接了某个WiFi,测试ping www.baidu.com,如果能ping 通,基本可以断定可以上网了,但是如果我们做了一个get 请求(url 是www.baidu.com),路由器可能重定向这个WiFi内的某网页了,依然没有错误返回,就会...
  • ios 获取当前wifi名称

    2016-02-03 19:07:52
    ios5之前可以通过读取配置文件获取ios5以后苹果修改wifi列表文件位置,只有root权限才可以读取. ios4:/System/Library/SystemConfiguration/WiFiManager.bundle/WiFiManager ios5:/System/Library/System...
  • 本文主要介绍怎样使用其中的 NEHotspotHelper 进行设备 WiFi 列表的获取。 Demo 地址:https://github.com/EyreFree/EFNEHotspotHelperDemo 一. 注意事项 首先,NEHotspotHelper 只在 i
  • iOS wifi开发

    2018-03-12 15:55:42
    一、简介首先放上苹果官方文档:https://developer.apple.com/reference/networkextension/nehotspothelperNEHotspotHelper 是 ...1.+ supportedNetworkInterfaces 可以获取到当前扫描到的WIFI列表,包含SSI...
  • 开发APP一般都会用到设备配网,获取当前设备的Wi-Fi的SSID。那么如何获取呢?下面直接上代码: 第一步: 添加SystemConfiguration.framework这个框架 第二步:头文件//导入框架头文件 #import <System...
  • iOS 9 发布之后,苹果推出了 NetworkExtension...如果你只是想获取当前设备正在连接的 WiFi 信息,有更加便捷的方法,可参考我的另一篇文章:iOS 获取当前已连接 WiFi 信息。 Demo 地址:github.com/EyreFree/EF… ...
  • 使用之前先到这里看申请方法https://forums.developer.apple.com/message/30657#30657,申请成功后就可以使用这个框架NetworkExtension #import NSArray * networkInterfaces = [NEHotspotHelper ...
  • 比如视频播放,需要线判断是Wifi还是4G,Wifi直接播放,4G先提示用户。获取网络状态的方法大概有三种: 1. Reachability 这是苹果的官方演示demo中使用到的方法,我们可以到苹果官方文档里下载Demo(点击左上角...
  • 关于ios如何扫描wifi热点,网上一搜一大把,看完之后估计你很崩溃,因为所有的文章,其实都来自一处,转来转去的毫无新意,很多时候也不能解决问题. 这里就说一下 我在做扫描时遇到的一些问题.(关于怎么扫描,自己google吧...
  • 目前很多智能设备配置网络的时候都有app内部直连Wi-Fi的功能(iOS11之前需要用户跳到Wi-Fi设置界面去连),iOS11后苹果提供 NEHotspotConfigurationManager 类用于app内直连周边的Wi-Fi;具体步骤: 1、向开发者中心...
  • Android 获取wifi列表

    2019-12-06 10:23:48
    记录一次Android端获取WiFi列表,并实现连接的过程。 需求: 获取WiFi列表,并连接无密码的指定wifiwifi状态连接成功之后调取第三方接口进行验证,接口请求类型GET。 牢骚:没做锅啊,小白一个。怎么办?,群里...
  • 源码地址: ... 扫描wifi信息的参考资料:http://code.google.com/p/uwecaugmentedrealityproject/和http://code.google.com/p/iphone-wireless/ 源代码参考:http://easymorse-iph
  • ios获取设备信息总结

    2014-12-08 20:38:54
    总结ios获取一些设备信息的做法
  • 获取收集WiFi信息

    2017-05-19 15:36:58
    姿势一。这么干可能不会通过审核 #import - (void)viewDidLoad {  [super viewDidLoad];  NSDictionary *dict = [self SSIDInfo];  NSLog(@"dict:%@",dict);... NSString *SSID = dict[@"SSID
1 2 3 4 5 ... 20
收藏数 8,290
精华内容 3,316
关键字:

8之前获取wifi信息 ios