接觸過ios開發的人應該都知道,對于檢測網絡連接狀態AFN基本上已經夠用了,但是最近幾年興起的商超,大型酒店飯店等娛樂場所的portal認證,需要檢測手機是否真正能上網!(一種偽聯網狀態,就是已經連接到了wifi,但是不能真正上網).此時原因是因為ap設備的網關并沒有放行,但是這種狀態通過AF并不能檢測出來.
#試過很多種方法,基于tcp協議的socket通信,基于ICMP協議的ping,基于http協議的網絡請求.
下面要講的就是基于http協議的網絡請求來辨別真正的聯網狀態!
以前寫過一遍基于tcp協議的socket通信的,有興趣的可以翻翻.
#define kAppleUrlTocheckWifi @"http://captive.apple.com"
//檢測網絡是否可以使用
+(BOOL)checkNetworkCanUse{
// 1.將網址初始化成一個OC字符串對象
NSString *urlStr = kAppleUrlTocheckWifi;
// 如果網址中存在中文,進行URLEncode
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.構建網絡URL對象, NSURL
NSURL *url = [NSURL URLWithString:newUrlStr];
// 3.創建網絡請求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:3];
// 創建同步鏈接
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString* result1 = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//解析html頁面
NSString *str = [self flattenHTML:result1];
//除掉換行符
NSString *nstr = [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];
if ([nstr isEqualToString:@"SuccessSuccess"])
{
// NSLog(@"可以上網了");
// [PronetwayGeneralHandle shareHandle].NetworkCanUse = YES;
return YES;
}else {
// NSLog(@"未聯網");
//[self showNetworkStatus:@"未聯網"];
// [PronetwayGeneralHandle shareHandle].NetworkCanUse = NO;
return NO;
}
}
//過濾后臺返回字符串中的標簽
+ (NSString *)flattenHTML:(NSString *)html {
NSScanner *theScanner;
NSString *text = nil;
theScanner = [NSScanner scannerWithString:html];
while ([theScanner isAtEnd] == NO) {
// find start of tag
[theScanner scanUpToString:@"<" intoString:NULL] ;
// find end of tag
[theScanner scanUpToString:@">" intoString:&text] ;
// replace the found tag with a space
//(you can filter multi-spaces out later if you wish)
html = [html stringByReplacingOccurrencesOfString:
[NSString stringWithFormat:@"%@>", text]
withString:@""];
}
return html;
}
這個網址是后臺抓包抓到的,就是portal認證的原理是通過重定向頁面來實現的,ios設備在連接wifi之后,會向這個網址發送一個請求,來檢測聯網狀態..所以這個是蘋果的地址 ,改變的可能性為0 其實也可以自己寫個后臺,弄一個外網地址,自己去請求,看返回結果,原理是一樣的.
#define kAppleUrlTocheckWifi @"http://captive.apple.com"
好了 ,如此就解決了.另外,這個是同步請求,會阻塞線程的,所以請求的超時時間設置的不易過長!
最后推薦一個技術交流群,里面大神很多! 529043462