iOS之WiFi IP相關

  • Questions

    在[iOS實現WIFI傳書]中有一個獲取IP的步驟
    在此順帶總結一份關于WIFI與IP的常用內容

    1. 設備網絡IP地址
    2. WiFi信息
    3. 路由器地址
    4. 本機DNS服務器
    5. 手機的網絡IP地址
    6. 進入WiFi設置
  • Code

    • 設備網絡IP地址
    // 獲取設備網絡Ip地址
    + (NSString *)deviceNetIp {
        int sockfd =socket(AF_INET,SOCK_DGRAM,0);
        // if (sockfd < 0) return nil;
        NSMutableArray *ips = [NSMutableArray array];
        int BUFFERSIZE = 4096;
        struct ifconf ifc;
        char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr;
        struct ifreq *ifr, ifrcopy;
        ifc.ifc_len= BUFFERSIZE;
        ifc.ifc_buf= buffer;
        if(ioctl(sockfd, SIOCGIFCONF, &ifc) >= 0){
            for(ptr = buffer; ptr < buffer + ifc.ifc_len; ){
                ifr = (struct ifreq*)ptr;
                int len =sizeof(struct sockaddr);
                if(ifr->ifr_addr.sa_len > len) {
                    len = ifr->ifr_addr.sa_len;
                }
                ptr +=sizeof(ifr->ifr_name) + len;
                if(ifr->ifr_addr.sa_family != AF_INET)
                    continue;
                if((cptr = (char*)strchr(ifr->ifr_name,':')) != NULL)
                    *cptr =0;
                if(strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0)
                    continue;
                memcpy(lastname, ifr->ifr_name, IFNAMSIZ);
                ifrcopy = *ifr;
                ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy);
                if((ifrcopy.ifr_flags&IFF_UP) == 0)
                    continue;
                NSString *ip = [NSString stringWithFormat:@"%s", inet_ntoa(((struct sockaddr_in*)&ifr->ifr_addr)->sin_addr)];
                [ips addObject:ip];
            }
        }
        close(sockfd);
        NSString *deviceIP = @"";
        for(int i = 0; i < ips.count; i++) {
            if(ips.count > 0) {
                deviceIP = [NSString stringWithFormat:@"%@", ips.lastObject];
            }
        }
        return deviceIP;
    }
    
    • WiFi信息
    /*
     * 獲取wifi信息
     * iOS12以上的版本獲取wifi信息糕韧,需在中設Capability置Access WIFI Infomation = ON
     * iOS13獲取之前需獲判斷是否同意app適用地理位置信息
     */
    - (void)wifi:(void(^)(NSDictionary *sender))handler {
        if (@available(iOS 13.0, *)) {
            if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
                // 設置定位權限
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
            } else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
                self.manager = [[CLLocationManager alloc] init];
                self.manager.delegate = self;
                [self.manager requestWhenInUseAuthorization];
                self.wifiBlock = handler;
            } else {
                [self fetchWifi:handler];
            }
        } else {
            [self fetchWifi:handler];
        }
    }
    - (void)fetchWifi:(void(^)(NSDictionary *sender))handler {
        NSArray *interfaceNames = CFBridgingRelease(CNCopySupportedInterfaces());
        NSDictionary *SSIDInfo;
        for (NSString *interfaceName in interfaceNames) {
            SSIDInfo = CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)interfaceName));
            BOOL isNotEmpty = (SSIDInfo.count > 0);
            if (isNotEmpty) {
                break;
            }
        }
        // ssid信息 即wifi名稱
        NSString *ssid = [SSIDInfo objectForKey:@"SSID"];
        // bssid信息 即mac地址
        NSString *bssid = [SSIDInfo objectForKey:@"BSSID"];
        NSLog(@"ssid = %@, mac地址 = %@", ssid, bssid);
        if (handler) {
            handler(SSIDInfo);
        }
    }
    
    
    • 路由器信息
    + (NSString *)routerIp {
        NSString *address = @"error";
        struct ifaddrs *interfaces = NULL;
        struct ifaddrs *temp_addr = NULL;
        int success = 0;
        success = getifaddrs(&interfaces);
        if (success == 0) {
            temp_addr = interfaces;
            while(temp_addr != NULL){
                if(temp_addr->ifa_addr->sa_family == AF_INET) {
                    if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                        address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                        NSLog(@"廣播地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]);
                        NSLog(@"本機地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]);
                        NSLog(@"子網掩碼地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]);
                        NSLog(@"interface--%@",[NSString stringWithUTF8String:temp_addr->ifa_name]);
                    }
                }
                temp_addr = temp_addr->ifa_next;
            }
        }
        
        // Free memory
        freeifaddrs(interfaces);
        
        in_addr_t i = inet_addr([address cStringUsingEncoding:NSUTF8StringEncoding]);
        in_addr_t* x = &i;
        unsigned char *s = getdefaultgateway(x);
        NSString *ip=[NSString stringWithFormat:@"%d.%d.%d.%d",s[0],s[1],s[2],s[3]];
        free(s);
    
        return ip;
    }
    
    • DNS服務器
    // 獲取本機DNS服務器
    + (NSString *)dnsServers {
        res_state res = malloc(sizeof(struct __res_state));
        int result = res_ninit(res);
        NSMutableArray *dnsArray = @[].mutableCopy;
        if ( result == 0 ) {
            for ( int i = 0; i < res->nscount; i++ ) {
                NSString *s = [NSString stringWithUTF8String :  inet_ntoa(res->nsaddr_list[i].sin_addr)];
                [dnsArray addObject:s];
            }
        } else {
            NSLog(@"%@",@" res_init result != 0");
        }
        res_nclose(res);
        return dnsArray.firstObject;
    }
    
    • 手機的網絡IP地址
    + (NSString *)phoneInNetIp {
        BOOL success;
        struct ifaddrs * addrs;
        const struct ifaddrs * cursor;
        success = getifaddrs(&addrs) == 0;
        if (success) {
            cursor = addrs;
            while (cursor != NULL) {
                // the second test keeps from picking up the loopback address
                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
                        NSLog(@"IP:%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)]);
                    return [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)cursor->ifa_addr)->sin_addr)];
                }
                cursor = cursor->ifa_next;
            }
            freeifaddrs(addrs);
        }
        return nil;
    }
    
    • WiFi設置
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
    }
    
  • Over

    多說兩句:多數時候解決問題需要找思路跪腹,一旦確定有解拦坠,要實現的就是Code渐苏。代碼不是最全破婆,網絡不少人已貼出來匈挖,在此不多寫兄猩。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市半开,隨后出現的幾起案子隔披,更是在濱河造成了極大的恐慌,老刑警劉巖寂拆,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢米,死亡現場離奇詭異,居然都是意外死亡纠永,警方通過查閱死者的電腦和手機鬓长,發(fā)現死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尝江,“玉大人涉波,你說我怎么就攤上這事√啃颍” “怎么了啤覆?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惭聂。 經常有香客問我窗声,道長,這世上最難降的妖魔是什么嫌佑? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任侨歉,我火速辦了婚禮屋摇,結果婚禮上幽邓,老公的妹妹穿的比我還像新娘炮温。我一直安慰自己,他們只是感情好牵舵,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布倦挂。 她就那樣靜靜地躺著,像睡著了一般方援。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涛癌,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天犯戏,我揣著相機與錄音,去河邊找鬼拳话。 笑死,一個胖子當著我的面吹牛弃衍,可吹牛的內容都是我干的。 我是一名探鬼主播镜盯,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哥桥!你這毒婦竟也來了激涤?” 一聲冷哼從身側響起拟糕,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤倦踢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后犁嗅,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡褂微,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年园爷,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片求厕。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呀癣,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情浦辨,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布荤牍,位于F島的核電站庆冕,受9級特大地震影響劈榨,放射性物質發(fā)生泄漏访递。R本人自食惡果不足惜同辣,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望响巢。 院中可真熱鬧,春花似錦踪古、人聲如沸券腔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辱魁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間染簇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工卵洗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人过蹂。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像本橙,于是被迫代替她去往敵國和親脆诉。 傳聞我的和親對象是個殘疾皇子甚亭,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內容