Использование доступности для уведомления пользователя о подключении к Интернету

Я пытаюсь использовать доступность в Xcode 4.4, чтобы предупредить пользователя, если он/она не подключен к Интернету. В моем начальном контроллере представления есть кнопка, которая загружает таблицу (которая заполняется из онлайн-списка). Я выполнил несколько примеров в Stack Overflow, но не смог заставить его работать. Вот фрагмент моего файла .h:

#import <UIKit/UIKit.h>
#import "Reachability.h"

@interface MainPageViewController : UIViewController
{
  Reachability *internetReachable;
  Reachability *hostReachable;
}

-(void) checkNetworkStatus: (NSNotification *)notice;
@property BOOL internetActive;
@property BOOL hostActive;

@end

Вот мой файл .m:

#import "MainPageViewController.h"
#import "Reachability.h"

@implementation MainPageViewController
@synthesize internetActive;
@synthesize hostActive;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
  self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
  if (self) {
    // Custom initialization
  }
 return self;
}

- (void) viewWillAppear:(BOOL)animated
  {
    [[NSNotificationCenter defaultCenter] addObserver: self selector:
    @selector(checkNetworkStatus:) name: kReachabilityChangedNotification object: nil];

    internetReachable = [Reachability reachabilityForInternetConnection];
    [internetReachable startNotifier];

    hostReachable = [Reachability reachabilityWithHostname: @"sites.google.com"];
    [hostReachable startNotifier];
  }

- (void) checkNetworkStatus:(NSNotification *)notice
  {
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];

    if((internetStatus == NotReachable) && (hostStatus == NotReachable))
    {
       UIAlertView *internetAlert = [[UIAlertView alloc] initWithTitle:@"Network Error!"
       message: @"You are not connected to the internet!" delegate: self
       cancelButtonTitle: @"Ok" otherButtonTitles: nil];
       [internetAlert show];
       self.internetActive = NO;
       self.hostActive = NO;
    }
  }

-(void) dealloc
  {
    [[NSNotificationCenter defaultCenter] removeObserver: self];
  }

- (void)viewDidLoad
  {
    [super viewDidLoad];
// Do any additional setup after loading the view.
  }

- (void)viewDidUnload
  {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
  }

- (BOOL)shouldAutorotateToInterfaceOrientation(UIInterfaceOrientation)interfaceOrientation
   {
   return YES;
   }

@end

Поскольку я использую кнопку, должен ли я использовать IBAction для проверки наличия Интернета перед переходом на следующую страницу?


person bumpfox    schedule 23.08.2012    source источник


Ответы (1)


Вы можете проверить наличие интернета в любом удобном месте. Попробуйте проверить его в методах viewDidLoad или didFinishLaunching или прямо перед тем, как вам понадобится подключение к Интернету. Может быть не так удобно иметь «Доступен ли Интернет?» кнопка без каких-либо дополнительных действий, связанных с ней.

Вот функция, которая вернет, подключены ли вы. Обычно я запускаю это время от времени во время процесса приложения (или перед каждым запросом, если я параноик).

- (BOOL) connectedToNetwork
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];
    BOOL internet;
    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN)) {
        internet = NO;
    } else {
        internet = YES;
    }
    return internet;
} 

Затем вы можете использовать его следующим образом (при условии, что вы ссылаетесь на него из текущего объекта):

if(![self connectedToNetwork]) {
    //Do whatever you need to if you're not connected
} else {
    // You're connected so let the games begin
}
person Benjamin Oman    schedule 23.08.2012
comment
Итак, я помещаю второй блок операторов if в метод viewDidLoad? - person bumpfox; 24.08.2012