-
Questions
在[iOS實現WIFI傳書]中有一個獲取IP的步驟
在此順帶總結一份關于WIFI與IP的常用內容- 設備網絡IP地址
- WiFi信息
- 路由器地址
- 本機DNS服務器
- 手機的網絡IP地址
- 進入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渐苏。代碼不是最全破婆,網絡不少人已貼出來匈挖,在此不多寫兄猩。
iOS之WiFi IP相關
?著作權歸作者所有,轉載或內容合作請聯系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尝江,“玉大人涉波,你說我怎么就攤上這事√啃颍” “怎么了啤覆?”我有些...
- 正文 為了忘掉前任侨歉,我火速辦了婚禮屋摇,結果婚禮上幽邓,老公的妹妹穿的比我還像新娘炮温。我一直安慰自己,他們只是感情好牵舵,可當我...
- 文/花漫 我一把揭開白布倦挂。 她就那樣靜靜地躺著,像睡著了一般方援。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涛癌,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哥桥!你這毒婦竟也來了激涤?” 一聲冷哼從身側響起拟糕,我...
- 正文 年R本政府宣布荤牍,位于F島的核電站庆冕,受9級特大地震影響劈榨,放射性物質發(fā)生泄漏访递。R本人自食惡果不足惜同辣,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望响巢。 院中可真熱鬧,春花似錦踪古、人聲如沸券腔。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辱魁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間染簇,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 1.獲取WiFi信息 以前物聯網剛火的時候亏狰,出現過很多一體式無線路由偶摔,所以App里難免會遇到要判斷當前所連接的Wi...
- 在網上搜了好多例子,也問了好多人辰斋,最終無果,特將自己找到的資源做分享本人做智能家居的APP宫仗,智能硬件設備自帶WiF...
- 關于獲取iPhone的WiFi地址嫩码、UUID、IP相關方法 經常我們會遇到獲取iPhone的WiFi地址铸题、UUID...
- iOS 開發(fā)中難免會遇到很多與網絡方面的判斷,這里做個匯總探熔,大多可能是與WiFi相關的。 1.Ping域名诀艰、Pin...