在網上搜了好多例子,也問了好多人,最終無果,特將自己找到的資源做分享本人做智能家居的APP,智能硬件設備自帶WiFi(局域網)。如果用戶沒有連接設備的WiFi進入APP時,需要提示用戶去設置界面連接WiFi。需求一、APP內部跳轉到系統WIFi 界面手動連接實現info里面設置在項目中的info.plist中添加 URL types 并設置一項URL Schemes為prefs,如下圖:wifi1實現代碼NSURL *url = [NSURL URLWithString:@"prefs:root=WIFI"];if ([[UIApplication sharedApplication] canOpenURL:url]){? ? [[UIApplication sharedApplication] openURL:url];}需求二、在APP內部做切換網絡iOS端WIFI應用的相關開發,主要存在以下問題:iOS系統WIFI相關的接口很少,大部分接口都是私有接口在設備連接上WIFI,沒有通過路由器認證前,如果關閉iOS自動彈出的Portal頁面,iPhone的WIFI會自動斷開如何禁止iOS系統自動彈Portal頁面公共WIFI的名稱確定及不確定時的處理辦法獲取路由器Ip的方法1.添加getgateway.c文件,和route.h文件2.導入這些頭文件#import#include#import#import#import#import#include#import "getgateway.h"#import3.獲取網絡IP
//獲取路由器地址
-(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)];
//廣播地址--10.22.70.255
NSLog(@"廣播地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]);
//本機地址--10.22.70.111
NSLog(@"本機地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)]);
//子網掩碼地址--255.255.255.0
NSLog(@"子網掩碼地址--%@",[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)]);
//端口地址--en0
NSLog(@"端口地址--%@",[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]];
//路由器地址-----10.22.70.1
NSLog(@"路由器地址-----%@",ip);
return ip;
}
4.獲取SSID
-(NSDictionary *)fetchNetInfo{
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;
}
}
return SSIDInfo;
}
注意:iOS 10以后對調用系統權限更高,WiFi那塊也做了新的協議
至此未完,有誰知道如何在程序內部連接指定熱點之后斷開連接在重新連接其他的網絡的,敬請告知