
2016年08月08日星期一
- 今天改bug的時(shí)候,測(cè)試小美眉找我說(shuō),我的app在使用的時(shí)候,突然沒(méi)有網(wǎng)絡(luò)了,卻沒(méi)有得到提醒,是個(gè)非常不好的體驗(yàn)。 尋思著這個(gè)道理,我也在網(wǎng)上找了半天教程,結(jié)果都是,抄過(guò)來(lái)抄過(guò)去,你抄我的我抄你的,而且都TM得抄的不專業(yè),連一個(gè)可以運(yùn)行的demo都沒(méi)有,簡(jiǎn)直是糟心的不行(其實(shí)我在吐槽我自己水平低,看不懂~~~(>_<)~~~)。雖然我也沒(méi)有可以運(yùn)行的demo,但是,我的代碼至少是經(jīng)過(guò)了修改的,讓各位群眾大兄弟不至于看到一個(gè)沒(méi)有聲明的變量突兀的在那里被賦值,就連最基本的變量的類型都要靠猜半天才能知道,可讀性太低。蠢得一p.
- 吐槽完畢,言歸正傳。
上個(gè) demo
網(wǎng)上大部分解決方案都是基于Reachability,但是,也許是我愚鈍或者是想的比較多。在使用中,我遇到了麻煩,如果說(shuō)是個(gè)大麻煩也不為過(guò),因?yàn)槲铱赡苷{(diào)試了有兩三個(gè)小時(shí)之久。
網(wǎng)上的基本解決方案,大部分是這樣。
NSString *urlStr = @"www.baidu.com";
Reachability *netConnect = [Reachability reachabilityWithHostName:urlStr];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
[netConnect startNotifier];
//然后監(jiān)聽reachabilityChanged:方法,網(wǎng)絡(luò)狀態(tài)一發(fā)生改變就獲取改變事件。
- 但是,這里有一個(gè)問(wèn)題,就算網(wǎng)絡(luò)發(fā)生了改變,你怎么知道發(fā)生的改變是否可用?打個(gè)比方:你手機(jī)本來(lái)用著3G網(wǎng),然后你連接到一個(gè)沒(méi)有接網(wǎng)線的無(wú)線wifi上,你是監(jiān)聽了是否發(fā)生改變。但是,不知道是不是我的手機(jī)有問(wèn)題,還是上天對(duì)我不公,總是遇到些小問(wèn)題。我就算寫了urlStr,它還是只判斷當(dāng)前是否已經(jīng)連接網(wǎng)絡(luò),而對(duì)于是否已經(jīng)能和全世界的皮薄一起開心的嗑瓜子,貌似他就不管了。
- 對(duì)于這種,只好發(fā)揮我自己的小聰明。我只需要知道什么時(shí)候網(wǎng)絡(luò)發(fā)生了改變。然后改變之后,我調(diào)用一個(gè)網(wǎng)址,看是否能得到回應(yīng),如果能得到回應(yīng),就說(shuō)明連接上了互聯(lián)網(wǎng),如果得不到回應(yīng),那么,就說(shuō)明了我沒(méi)有連接上互聯(lián)網(wǎng)。劍走偏鋒。
- 需要監(jiān)聽的事件內(nèi)這么寫。
// 通知監(jiān)聽的事件
-(void)reachabilityChanged:(NSNotification *)note{
//設(shè)置了緩沖區(qū),在1秒內(nèi)多次觸發(fā)這個(gè)函數(shù) 將會(huì)只執(zhí)行最后一次,媽的,這里有時(shí)候一次要調(diào)用兩下。
//取消的函數(shù) 必須要和 傳入的函數(shù) 帶的值一樣
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(updateInterfaceWithReachability) object:nil];
[self performSelector:@selector(updateInterfaceWithReachability) withObject:nil afterDelay:1];
}
//網(wǎng)絡(luò)連接該干活了
-(void)updateInterfaceWithReachability{
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
// 創(chuàng)建請(qǐng)求(requset)
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:2];//緩存策略:基礎(chǔ)策略,超時(shí)設(shè)置:10秒
// 連接服務(wù)器
self.connection = [[NSURLConnection alloc]initWithRequest:request delegate:self];
}
//出現(xiàn)錯(cuò)誤
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"連接出錯(cuò),判定為沒(méi)有網(wǎng)");
}
//接收到反饋信息
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"收到百度的回應(yīng),判定為有網(wǎng)");
}
- 如果Reachability也能辦到,我很樂(lè)意用他的一句代碼去代替,也許是我使用錯(cuò)了,使用的效果并不是太好,后續(xù)我準(zhǔn)備自己寫一個(gè)封裝的小控件,自己去捕捉網(wǎng)絡(luò)的變化,這樣,我就不用再用Reachability了,雖然我現(xiàn)在知道的線索僅僅是:SCNetworkReachability這個(gè)類。期待我后續(xù)的填坑吧~。如果知道我為什么沒(méi)有達(dá)到相同的效果,而使用了這個(gè)笨辦法,請(qǐng)你告訴我。不勝感激。