iOS客户端公共WIFI解决方案

作者: 42vio | 来源:发表于2016-04-22 14:18 被阅读884次

iOS9之后 <SystemConfiguration/CaptiveNetwork.h>
<NetworkExtension/NEHotspotHelper.h>代替

基础信息获取

1. 获取IP

用于获取ip等系列功能的头文件
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h>
#include <ifaddrs.h>
#import <dlfcn.h>
外网可见的ip地址
- (NSString *) whatismyipdotcom{    
    NSError *error;    
    NSURL *ipURL = [NSURL URLWithString:@"http://www.whatismyip.com/automation/n09230945.asp"];    
    NSString *ip = [NSString stringWithContentsOfURL:ipURL encoding:1 error:&error];    
    return ip ? ip : [error localizedDescription];
}
本地wifi的ip地址
+ (NSString *)localIPAddress
{
    NSString *localIP = nil;
    struct ifaddrs *addrs;
    if (getifaddrs(&addrs)==0) {
        const struct ifaddrs *cursor = addrs;
        while (cursor != NULL) {
            if (cursor->ifa_addr->sa_family == AF_INET && (cursor->ifa_flags & IFF_LOOPBACK) == 0)
            {
                NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
                if ([name isEqualToString:@"en0"]) // Wi-Fi adapter
                {
                    localIP = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
                    break;
                }
            }
            cursor = cursor->ifa_next;
        }
        freeifaddrs(addrs);
    }
    return localIP;
}

2. 获取网卡信息

- (NSDictionary *)getWIFIDic
{
    CFArrayRef myArray = CNCopySupportedInterfaces();
    if (myArray != nil) {
        CFDictionaryRef myDict = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(myArray, 0));
        if (myDict != nil) {
            NSDictionary *dic = (NSDictionary*)CFBridgingRelease(myDict);
            return dic;
        }
    }
    return nil;
}

- (NSString *)getBSSID
{
    NSDictionary *dic = [self getWIFIDic];
    if (dic == nil) {
        return nil;
    }
    return dic[@"BSSID"];
}

- (NSString *)getSSID
{
    NSDictionary *dic = [self getWIFIDic];
    if (dic == nil) {
        return nil;
    }
    return dic[@"SSID"];
}

认证过程中的问题

1. Portal禁止弹出与WIFI自动关闭的问题
正常情况,用户使用iPhone手机连接带有Portal认证的路由器,在连接成功后,iOS系统会在已有列表中随机选择连接指定的网址(例如:www.itools.info)以测试当前路由器是否需要Portal认证。在需要Portal认证的网络,系统会弹出Portal页面,这个时候,如果用关掉portal页面,或者直接切换到其它应用,WIFI网络会直接自动断开。

解决办法是路由器白名单,让路由器放行所有Portal测试的IP,以下为测试的域名:

www.appleiphonecell.com
captive.apple.com
www.itools.info
www.ibook.info
www.airport.us
www.thinkdifferent.us

对应的IP地址:

23.207.103.91
23.33.54.18
23.44.167.91
23.67.183.91
96.7.103.91
23.42.71.91
23.34.105.211
23.59.167.91
23.42.184.50
23.47.232.190
23.77.23.91
23.194.87.91
23.61.91.190
23.218.12.50
23.2.38.95

23.46.135.91
172.225.213.179
218.205.66.94
23.64.251.249
23.58.250.189

将以上所有IP加到路由器的白名单中,即可解决iPhone断开WIFI的问题,但是同时也不自动弹出Portal页面了,用户打开浏览器才会重定向到Portal页面。

2. 已知WIFI名解决方法
如果公司部署的公共WIFI名确定的情况,就比较简单了,不需要配置上述白名单也可以保证WIFI不断开,具体办法是,在程序启动时,向iOS系统注册SSID,方法如下:

//注册一个SSID,注意此方法多次调用时,最后一次有效
- (void)registerNetworkOnlyOneSSIDValidate:(NSString *)ssid
{
    [self registerNetwork:@[ssid]];
}
//注册多个SSID,多次调用,最后一次有效
- (void)registerNetwork:(NSArray *)ssidStringArray
{
    CFArrayRef ssidCFArray = (__bridge CFArrayRef)ssidStringArray;
    if(!CNSetSupportedSSIDs(ssidCFArray)) {
        return;
    }
    CFArrayRef interfaces = CNCopySupportedInterfaces();
    for (int i = 0; i < CFArrayGetCount(interfaces); i++) {
        CFStringRef interface = CFArrayGetValueAtIndex(interfaces, i);
        CNMarkPortalOnline(interface);
    }
}

相关文章

  • iOS--WiFi

    iOS客户端公共WIFI解决方案 转载地址

  • iOS客户端 获取WIFI ssid等信息资料

    iOS Wifi编程要点总结-获取WIFI名和IP iOS客户端公共WIFI解决方案 iOS开发中WiFi相关功能...

  • iOS客户端公共WIFI解决方案

    iOS9之后 被 代替 基础信息获取 1...

  • WiFi直连总结

    WiFi直连iOS端总结 整体流程 功能概述:客户端通过引导用户输入家庭WiFi名称以及密码,将WiFi信息发送给...

  • 扫描 wifi, 判断 位置

    在ios扫描公共区域内wifi信息中,写了实现wifi扫描的一种方法,但是那种方法扫描出来的wifi信息不全,下面...

  • WiFi

    iOS开发中WiFi相关功能总结 iOS 获取系统wifi列表,wifi信号强度,并给wifi设置密码,标签(副标...

  • iOS Wifi 打印

    iOS wifi 打印

  • 安卓抓包总结

    1.大纲 主要是从几个点来了解安卓APP通用的解决办法: wifi代理抓包 vpn抓包 客户端ssl验证解决方案 ...

  • 新能力 | 云开发基于Flutter的云端一体化探索

    导语 Flutter 框架是当下移动客户端开发最热门的解决方案,除了可以跨 Android、iOS、web 三端之...

  • iOS Cookie 基础学习

    iOS Cookie 概述 Cookie 提供服务器存储相关数据到客户端的一种解决方案, 服务器通过Respons...

网友评论

  • silence_阳:你好,看了你的“2.已知WIFI名解决方法”中的两个方法,其中“CNSetSupportedSSIDs”和“CNMarkPortalOnline”已经在iOS9中废弃了。你现在有什么好的方法吗?向iOS系统注册ssid,以保证WIFI不断开。
  • 解忧杂货店老板:三篇文章写的都非常通俗易懂,iOS9这个新API研究的人还不多,给作者赞一个。 :+1:

本文标题:iOS客户端公共WIFI解决方案

本文链接:https://www.haomeiwen.com/subject/fukxrttx.html