Как да получите известие за промяна в мрежовата връзка от iOS Reachability Class?

Здравейте, искам да заснема всеки път, когато потребителят получи мрежова свързаност в моето приложение, за това добавих клас за достъпност на ябълки и по-долу е фрагментът, който използвам в моя клас appDelegate didFinishLaunchingWithOptions метод,

Reachability* reachability = [Reachability reachabilityForInternetConnection];
        [reachability startNotifier];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil];

и моят метод за селектор на reachabilityChanged е както по-долу

- (void)reachabilityChanged:(NSNotification*)notification
{
    Reachability* reachability = notification.object;
    if(reachability.currentReachabilityStatus == NotReachable)
        NSLog(@"Internet off");
    else
        NSLog(@"Internet on");
}

но тук не получавам никакво известие, когато изключа своя самолетен режим и когато получа мрежова връзка в телефона си.

Пропускам ли нещо?


person Mobile Coe    schedule 23.07.2013    source източник
comment
Вижте това stackoverflow.com/a/10184617/1635315. Това наистина ще ви помогне.   -  person Kirti Nikam    schedule 15.12.2014


Отговори (5)


Използвам променлива в appdelegate, за да съхранявам текущото мрежово състояние като bool

@property (nonatomic, assign) BOOL hasInet;

.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self setUpRechability];
}


-(void)setUpRechability
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkChange:) name:kReachabilityChangedNotification object:nil];

    reachability = [Reachability reachabilityForInternetConnection];
    [reachability startNotifier];

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

    if          (remoteHostStatus == NotReachable)      {NSLog(@"no");      self.hasInet-=NO;   }
    else if     (remoteHostStatus == ReachableViaWiFi)  {NSLog(@"wifi");    self.hasInet-=YES;  }
    else if     (remoteHostStatus == ReachableViaWWAN)  {NSLog(@"cell");    self.hasInet-=YES;  }

}

- (void) handleNetworkChange:(NSNotification *)notice
{
    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

    if          (remoteHostStatus == NotReachable)      {NSLog(@"no");      self.hasInet-=NO;   }
    else if     (remoteHostStatus == ReachableViaWiFi)  {NSLog(@"wifi");    self.hasInet-=YES;  }
    else if     (remoteHostStatus == ReachableViaWWAN)  {NSLog(@"cell");    self.hasInet-=YES;  }

//    if (self.hasInet) {
//        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Net avail" message:@"" delegate:self cancelButtonTitle:OK_EN otherButtonTitles:nil, nil];
//        [alert show];
//    }
}
person Lithu T.V    schedule 23.07.2013
comment
handleNetworkChange, извикан многократно вероятно липсата на налични wifi връзки, Как да контролирате същото - person Jitesh Upadhyay; 01.03.2018

Може би трябва да добавите наблюдателя преди startnotifier

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNetworkChange:) name: kReachabilityChangedNotification object: nil];
reachability = [Reachability reachabilityForInternetConnection];
[reachability startNotifier];
person Jeremy Piednoel    schedule 23.07.2013

Можете да използвате тази обвивка за достъпност, за да получите базирано на блок обратно извикване, когато има промяна в състоянието на свързаност.

GitHub: UHBConnectivityManager

Ако използвате какаоподи.

pod 'UHBConnectivityManager'
person Umair    schedule 25.08.2016

Най-простият начин:

reach = [Reachability reachabilityWithHostName:@"www.google.com"];
 reach.reachableBlock = ^(Reachability *reach){
    NSLog(@"Reachable");
};

reach.unreachableBlock = ^(Reachability *reach){
    NSLog(@"Unreachable");
};
[reach startNotifier];

Всеки път, когато има промяна в мрежата, съответните блокове ще бъдат извикани.

person Reckoner    schedule 18.02.2017

Направете достъпността като свое свойство вместо локална променлива. Щеше да работи.

person Ritu    schedule 09.03.2017