IOS監(jiān)聽網(wǎng)絡(luò)的變化狀況以及是否已連接可用的網(wǎng)絡(luò)


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)你告訴我。不勝感激。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容