IOS用戶端公用WIFI解決方案

來源:互聯網
上載者:User

IOS用戶端公用WIFI解決方案
一、公用WIFI綜述

現在很多公司都在做免費WIFI,車站、公交、地鐵、餐廳,只要是人員密集流動的地方就有WIFI,免費WIFI從最初的網頁認證方式也逐漸向用戶端認證方式位移。本文主要討論IOS認證上網的解決方案。IOS端WIFI應用的相關開發,主要存在以下問題

1.IOS系統WIFI相關的介面很少,大部分介面都是私人介面2.在裝置串連上WIFI,沒有通過路由器認證前,如果關閉IOS自動彈出的Portal頁面,Iphone的WIFI會自動斷開3.如何禁止IOS系統自動彈Portal頁面4.公用WIFI的名稱確定及不確定時的處理辦法

本文主要討論在使用公開的API,即可以提交到App Store的應用。

二、基礎資訊擷取1.擷取網卡IP
12345678910111213141516171819202122
+ (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.擷取網卡資訊
123456789101112131415161718192021222324252627282930
- (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"];}

注意事項

在實際測試時,擷取網卡資訊getWIFIDic方法,在部分路由器上耗時很長(10秒以上),如果直接放在主線程中,會導致介面卡死。在認證相關的應用中,會根據網卡上的BSSID(例如:以特定3d:e6:c3開頭的即為本公司架設網路)來判斷是否屬於本公司的路由。SSID、BSSID若為應用啟動時必須擷取的資訊(我們公司的應用,就是這種),這個時候怎樣處理呢?

放在非同步線程,擷取到網卡資訊再初使化介面,這種方法依然會導致在某些路由器下初次開啟介面超長時間的等待,我們的處理方法是,如果3秒內能夠擷取到相應的配置資訊,直接根據配置資訊初使化介面,在超過3秒時,給予預設的假WIFI資訊,初使化介面。非同步線程擷取到真實的配置資訊後,再重新更新介面。
三、認證過程中的棘手問題1、Portal禁止彈出與WIFI自動關閉的問題

正常情況,使用者使用Iphone手機串連帶有Portal認證的路由器,在串連成功後,IOS系統會在已有列表中隨機播放串連指定的網址(例如:www.itools.info)以測試當前路由器是否需要Portal認證。在需要Portal認證的網路,系統會彈出Portal頁面,這個時候,如果用關掉portal頁面,或者直接切換到其它應用,WIFI網路會直接自動斷開(根本不給用戶端認證機會^_^)。

我們的解決辦法是路由器白名單,讓路由器允許存取所有Portal測試的IP,以下為測試的網域名稱:

www.appleiphonecell.comcaptive.apple.comwww.itools.infowww.ibook.infowww.airport.uswww.thinkdifferent.us

對應的IP地址:

23.207.103.9123.33.54.1823.44.167.9123.67.183.9196.7.103.9123.42.71.9123.34.105.21123.59.167.9123.42.184.5023.47.232.19023.77.23.9123.194.87.9123.61.91.19023.218.12.5023.2.38.9523.46.135.91172.225.213.179218.205.66.9423.64.251.24923.58.250.189

將以上所有IP加到路由器的白名單中,即可解決Iphone斷開WIFI的問題,但是同時也不自動彈出Portal頁面了,使用者開啟瀏覽器才會重新導向到Portal頁面。

2、WIFI名確定解決方案

如果公司部署的公用WIFI名確定的情況,就比較簡單了,不需要配置上述白名單也可以保證WIFI不斷開,具體辦法是,在程式啟動時,向IOS系統註冊SSID,方法如下:

12345678910111213
- (void)registerNetwork:(NSString *)ssid{    NSString *values[] = {ssid};    CFArrayRef arrayRef = CFArrayCreate(kCFAllocatorDefault,(void *)values,                                        (CFIndex)1, &kCFTypeArrayCallBacks);    if( CNSetSupportedSSIDs(arrayRef)) {        NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();        CNMarkPortalOnline((__bridge CFStringRef)(ifs[0]));        NSLog(@"%@", ifs);    }}
四、總結

蘋果對於WIFI這塊公開的API非常少,在開發公用WIFI應用時會遇到各種問題,上面是在使用非私人API的一些解決方案,如果大家有更優的辦法,歡迎留言分享。如果公司有企業帳號可以通過調用私人API的辦法來處理大部分需求。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.