iOS 真·實(shí)時(shí)監(jiān)聽(tīng)網(wǎng)絡(luò)變化

項(xiàng)目中常常需要監(jiān)聽(tīng)程序的網(wǎng)絡(luò)變化搔驼,判斷用戶(hù)是以哪種上網(wǎng)方式囊榜,在網(wǎng)上搜索了一番舅柜,找到了兩個(gè)常用的監(jiān)聽(tīng)網(wǎng)絡(luò)的方法瞒窒,第一種是使用AFNetworking中的AFNetworkReachabilityManager,第二種是使用蘋(píng)果推薦的Reachability恋技,如果你以為我這里在寫(xiě)下它倆的用法拇舀,那你就錯(cuò)了(好吧,是我錯(cuò)了蜻底,還是要寫(xiě)下這兩個(gè)的用法)骄崩。請(qǐng)看標(biāo)題,為什么叫真·實(shí)時(shí)監(jiān)聽(tīng)網(wǎng)絡(luò)變化,這兩種方法確實(shí)能監(jiān)聽(tīng)到網(wǎng)絡(luò)的狀態(tài)刁赖,但是有一種情況搁痛,就是鏈接上了WiFi长搀,但是這個(gè)WiFi是沒(méi)有網(wǎng)的宇弛,此時(shí)用那兩種方法只能判斷當(dāng)前設(shè)備鏈接的WiFi,無(wú)法判斷能不能連接到互聯(lián)網(wǎng)源请。努力上午搜尋了一下枪芒,發(fā)現(xiàn)一個(gè)開(kāi)源的三方挺好用,這里分享下(先貼下AFNetworkReachabilityManager和Reachability谁尸,有些情況下還是需要它倆的舅踪,做個(gè)記錄)。

以下都是在AppDelegate文件中編寫(xiě)的良蛮,有添加通知的是實(shí)時(shí)監(jiān)聽(tīng)網(wǎng)絡(luò)抽碌,未添加通知的地方如需要實(shí)時(shí)監(jiān)聽(tīng)請(qǐng)自行添加,添加完別忘移除通知(有點(diǎn)啰嗦决瞳,誰(shuí)讓我記性差)货徙。

AFNetworkReachabilityManager

-下載AFNetworking

  • 包含頭文件#import "AFNetworking.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [self listenNetWorkingStatus];  //監(jiān)聽(tīng)網(wǎng)絡(luò)是否可用
}
-(void)listenNetWorkingStatus{
   //1:創(chuàng)建網(wǎng)絡(luò)監(jiān)聽(tīng)者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager manager];
    //2:獲取網(wǎng)絡(luò)狀態(tài)
    /*
     AFNetworkReachabilityStatusUnknown          = 未知網(wǎng)絡(luò),
     AFNetworkReachabilityStatusNotReachable     = 沒(méi)有聯(lián)網(wǎng)
     AFNetworkReachabilityStatusReachableViaWWAN = 蜂窩數(shù)據(jù)
     AFNetworkReachabilityStatusReachableViaWiFi = 無(wú)線網(wǎng)
     */
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知網(wǎng)絡(luò)");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"沒(méi)有聯(lián)網(wǎng)");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窩數(shù)據(jù)");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"無(wú)線網(wǎng)");
                break;
            default:
                break;
        }
    }];
    
    //開(kāi)啟網(wǎng)絡(luò)監(jiān)聽(tīng)
    [manager startMonitoring];
}

Reachability

  • 下載Reachability皮胡,把Reachability.h Reachability.m文件導(dǎo)入工程
  • 包含頭文件#import "Reachability.h"
  • 生成兩個(gè)全局對(duì)象
@property (nonatomic) Reachability *hostReachability;
@property (nonatomic) Reachability *internetReachability;     
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     [self listenNetWorkingStatus]; //監(jiān)聽(tīng)網(wǎng)絡(luò)是否可用
}
-(void)listenNetWorkingStatus{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];
     // 設(shè)置網(wǎng)絡(luò)檢測(cè)的站點(diǎn)
     NSString *remoteHostName = @"www.apple.com";
 
     self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
     [self.hostReachability startNotifier];
     [self updateInterfaceWithReachability:self.hostReachability];
 
     self.internetReachability = [Reachability reachabilityForInternetConnection];
     [self.internetReachability startNotifier];
     [self updateInterfaceWithReachability:self.internetReachability];
}

- (void) reachabilityChanged:(NSNotification *)note
 {
     Reachability* curReach = [note object];
     [self updateInterfaceWithReachability:curReach];
 }
 
 - (void)updateInterfaceWithReachability:(Reachability *)reachability
 {
 
     NetworkStatus netStatus = [reachability currentReachabilityStatus];
     switch (netStatus) {
       case 0:
         NSLog(@"NotReachable----無(wú)網(wǎng)絡(luò)");
         break;
 
       case 1:
         NSLog(@"ReachableViaWiFi----WIFI");
         break;
 
       case 2:
         NSLog(@"ReachableViaWWAN----蜂窩網(wǎng)絡(luò)");
         break;
 
       default:
         break;
 }
 
 }
 - (void)dealloc
 {
     [[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
 }

真·實(shí)時(shí)監(jiān)聽(tīng)網(wǎng)絡(luò)變化 RealReachability

  • 點(diǎn)上面的名稱(chēng)下載
  • 把RealReachability文件夾拷貝到項(xiàng)目中
  • 包含頭文件#import "RealReachability.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     [self listenNetWorkingStatus]; //監(jiān)聽(tīng)網(wǎng)絡(luò)是否可用
}
-(void)listenNetWorkingStatus{
    [GLobalRealReachability startNotifier];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(networkChanged:)
                                                 name:kRealReachabilityChangedNotification
                                               object:nil];
    ReachabilityStatus status = [GLobalRealReachability currentReachabilityStatus];
    [self realNetworkingStatus:status];
}

- (void)networkChanged:(NSNotification *)notification
{
    RealReachability *reachability = (RealReachability *)notification.object;
    ReachabilityStatus status = [reachability currentReachabilityStatus];
    [self realNetworkingStatus:status];
}
-(void)realNetworkingStatus:(ReachabilityStatus)status{
    switch (status)
    {
        case RealStatusUnknown:
        {
            NSLog(@"~~~~~~~~~~~~~RealStatusUnknown");
            [self showNetworkStatusAlert:@"當(dāng)前網(wǎng)絡(luò)不可用"];
            break;
        }
            
        case RealStatusNotReachable:
        {
            NSLog(@"~~~~~~~~~~~~~RealStatusNotReachable");
            [self showNetworkStatusAlert:@"無(wú)網(wǎng)絡(luò),請(qǐng)檢查網(wǎng)絡(luò)鏈接"];
            break;
        }
            
        case RealStatusViaWWAN:
        {
            NSLog(@"~~~~~~~~~~~~~RealStatusViaWWAN");
            [self showNetworkStatusAlert:@"流量上網(wǎng)"];
            break;
        }
        case RealStatusViaWiFi:
        {
            NSLog(@"~~~~~~~~~~~~~RealStatusViaWiFi");
//            [self showNetworkStatusAlert:@"WIFI上網(wǎng),盡情揮霍吧小寶貝~"];
            break;
        }
        default:
            break;
    }
}

-(void)showNetworkStatusAlert:(NSString *)str{
    //我這里是網(wǎng)絡(luò)變化彈出一個(gè)警報(bào)框痴颊,由于不知道怎么讓widow加載UIAlertController,所以這里用UIAlertView替代了
    UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"提示" message:str delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

幫助到你的話請(qǐng)點(diǎn)喜歡并來(lái)波關(guān)注屡贺,點(diǎn)關(guān)注蠢棱,不迷路(個(gè)人原創(chuàng))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市甩栈,隨后出現(xiàn)的幾起案子泻仙,更是在濱河造成了極大的恐慌,老刑警劉巖量没,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玉转,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡允蜈,警方通過(guò)查閱死者的電腦和手機(jī)冤吨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饶套,“玉大人漩蟆,你說(shuō)我怎么就攤上這事〖寺” “怎么了怠李?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捺癞,道長(zhǎng)夷蚊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任髓介,我火速辦了婚禮惕鼓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唐础。我一直安慰自己箱歧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布一膨。 她就那樣靜靜地躺著呀邢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豹绪。 梳的紋絲不亂的頭發(fā)上价淌,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音瞒津,去河邊找鬼蝉衣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仲智,可吹牛的內(nèi)容都是我干的买乃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钓辆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼剪验!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起前联,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤功戚,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后似嗤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體啸臀,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年烁落,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乘粒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伤塌,死狀恐怖灯萍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情每聪,我是刑警寧澤旦棉,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布齿风,位于F島的核電站,受9級(jí)特大地震影響绑洛,放射性物質(zhì)發(fā)生泄漏救斑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一真屯、第九天 我趴在偏房一處隱蔽的房頂上張望脸候。 院中可真熱鬧,春花似錦讨跟、人聲如沸纪他。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梯刚,卻和暖如春凉馆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亡资。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工澜共, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锥腻。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓嗦董,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瘦黑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子京革,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容