使用可达性通知用户互联网连接

Posted

技术标签:

【中文标题】使用可达性通知用户互联网连接【英文标题】:Using reachability to notify the user about internet connection 【发布时间】:2012-08-23 05:20:53 【问题描述】:

我正在尝试使用 Xcode 4.4 中的可达性来提醒用户,如果他/她没有连接到互联网。我的初始视图控制器有一个加载表格的按钮(从 plist 在线填充)。我在 Stack Overflow 中遵循了一些示例,但无法使其正常工作。这是我的 .h 文件的 sn-p:

#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 来检查互联网?

【问题讨论】:

【参考方案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

【讨论】:

那么我是否将第二个 if 语句块放在 viewDidLoad 方法中?

以上是关于使用可达性通知用户互联网连接的主要内容,如果未能解决你的问题,请参考以下文章

通知用户可达性(Ashley Mills 的可达性)

应用程序处于后台时的 iOS 可达性

通知哪个调用与可达性无关

如何从 iOS 可达性类中获取网络连接通知的变化?

Mac OS X 可可应用程序中的 Internet 连接通知

如何在 iOS 中测试可达性并重试连接?