接觸過(guò)ios開(kāi)發(fā)的人應(yīng)該都知道,對(duì)于檢測(cè)網(wǎng)絡(luò)連接狀態(tài)AFN基本上已經(jīng)夠用了,但是最近幾年興起的商超,大型酒店飯店等娛樂(lè)場(chǎng)所的portal認(rèn)證,需要檢測(cè)手機(jī)是否真正能上網(wǎng)!(一種偽聯(lián)網(wǎng)狀態(tài),就是已經(jīng)連接到了wifi,但是不能真正上網(wǎng)).此時(shí)原因是因?yàn)閍p設(shè)備的網(wǎng)關(guān)并沒(méi)有放行,但是這種狀態(tài)通過(guò)AF并不能檢測(cè)出來(lái).
#試過(guò)很多種方法,基于tcp協(xié)議的socket通信,基于ICMP協(xié)議的ping,基于http協(xié)議的網(wǎng)絡(luò)請(qǐng)求.
下面要講的就是基于http協(xié)議的網(wǎng)絡(luò)請(qǐng)求來(lái)辨別真正的聯(lián)網(wǎng)狀態(tài)!
以前寫(xiě)過(guò)一遍基于tcp協(xié)議的socket通信的,有興趣的可以翻翻.
#define kAppleUrlTocheckWifi @"http://captive.apple.com"
//檢測(cè)網(wǎng)絡(luò)是否可以使用
+(BOOL)checkNetworkCanUse{
// 1.將網(wǎng)址初始化成一個(gè)OC字符串對(duì)象
NSString *urlStr = kAppleUrlTocheckWifi;
// 如果網(wǎng)址中存在中文,進(jìn)行URLEncode
NSString *newUrlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 2.構(gòu)建網(wǎng)絡(luò)URL對(duì)象, NSURL
NSURL *url = [NSURL URLWithString:newUrlStr];
// 3.創(chuàng)建網(wǎng)絡(luò)請(qǐng)求
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:3];
// 創(chuàng)建同步鏈接
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString* result1 = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//解析html頁(yè)面
NSString *str = [self flattenHTML:result1];
//除掉換行符
NSString *nstr = [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];
if ([nstr isEqualToString:@"SuccessSuccess"])
{
// NSLog(@"可以上網(wǎng)了");
// [PronetwayGeneralHandle shareHandle].NetworkCanUse = YES;
return YES;
}else {
// NSLog(@"未聯(lián)網(wǎng)");
//[self showNetworkStatus:@"未聯(lián)網(wǎng)"];
// [PronetwayGeneralHandle shareHandle].NetworkCanUse = NO;
return NO;
}
}
//過(guò)濾后臺(tái)返回字符串中的標(biāo)簽
+ (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;
}
這個(gè)網(wǎng)址是后臺(tái)抓包抓到的,就是portal認(rèn)證的原理是通過(guò)重定向頁(yè)面來(lái)實(shí)現(xiàn)的,ios設(shè)備在連接wifi之后,會(huì)向這個(gè)網(wǎng)址發(fā)送一個(gè)請(qǐng)求,來(lái)檢測(cè)聯(lián)網(wǎng)狀態(tài)..所以這個(gè)是蘋(píng)果的地址 ,改變的可能性為0 其實(shí)也可以自己寫(xiě)個(gè)后臺(tái),弄一個(gè)外網(wǎng)地址,自己去請(qǐng)求,看返回結(jié)果,原理是一樣的.
#define kAppleUrlTocheckWifi @"http://captive.apple.com"
好了 ,如此就解決了.另外,這個(gè)是同步請(qǐng)求,會(huì)阻塞線程的,所以請(qǐng)求的超時(shí)時(shí)間設(shè)置的不易過(guò)長(zhǎng)!
最后推薦一個(gè)技術(shù)交流群,里面大神很多! 529043462