使用Reachability类检查ios中整个应用程序的活动Internet连接

时间:2014-10-08 07:02:52

标签: ios ipad ios7 reachability

我正在建立一个应用,只要互联网连接处于活动状态,就需要将离线数据与服务器同步。所以目前如果在将数据推送到服务器的过程中互联网连接丢失,它将被保存在数据库中,每当连接处于活动状态时,它就会将数据推送到服务器。我正在使用来自apple的新的可达性类版本:3.5。根据他们对特定视图控制器的示例,我可以这样做

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

    self.internetReachability = [Reachability reachabilityForInternetConnection];
    [self.internetReachability startNotifier];
    [self updateInterfaceWithReachability:self.internetReachability];

}

/*!
 * Called by Reachability whenever status changes.
 */
- (void) reachabilityChanged:(NSNotification *)note
{
    Reachability* curReach = [note object];
    NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
    [self updateInterfaceWithReachability:curReach];
}


- (void)updateInterfaceWithReachability:(Reachability *)reachability
{
   if (reachability == self.internetReachability)
    {
     //Internet is active again- call api to push data to server
     }
}

这适用于特定的视图控制器。在新的Reachability类中是否有任何其他方法可以检查整个应用程序运行?或者我是否必须在每个viewcontroller中检查以检查活动的Internet连接?

4 个答案:

答案 0 :(得分:4)

您可以通过appdelegate进行检查。我之前做过这样的事。

@property (strong,nonatomic)Reachability *reach;
@property(nonatomic)NetworkStatus netStatus;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(checkNetworkStatus:)
                                                 name:kReachabilityChangedNotification object:nil];
    reach = [Reachability reachabilityForInternetConnection];
    [reach startNotifier];

    [self checkNetworkStatus:nil];
}

- (void)checkNetworkStatus:(NSNotification *)notice
{
    netStatus = [reach currentReachabilityStatus];
    if (netStatus == NotReachable)
    {
          NSLog(@"The internet is down.");
         // do stuff when network gone. 
    }
    else
    {
          NSLog(@"The internet is working!");
          // do stuff when internet comes active 
          [[NSNotificationCenter defaultCenter] postNotificationName:@"INTERNET_AVAILABLE" object:nil];
    }
}

现在,当互联网出现时,它会通知。在您需要检查互联网连接的所有视图中添加观察者通知。它正在整个应用程序检查互联网。并且合成了属性。

========编辑

app appate.h中的

+ (BOOL)isActiveInternet;

并在app delegate.m

+ (BOOL)isActiveInternet
    {
        netStatus = [reach currentReachabilityStatus];
        if (netStatus == NotReachable)
        {
              NSLog(@"The internet is down.");
             // do stuff when network gone. 
              return FALSE;
        }
        else
        {
              NSLog(@"The internet is working!");
              // do stuff when internet comes active 
              [[NSNotificationCenter defaultCenter] postNotificationName:@"INTERNET_AVAILABLE" object:nil];
              return TRUE;
        }
    }

这样您就可以直接在项目中的任何位置调用此方法,例如

if([appdelegate isActiveInternet]) {
      //yes net available do your stuff
}

答案 1 :(得分:0)

将数据推送到服务器在app委托中执行,而不是在特定的视图控制器中执行。这样你的aptibily代码将在Appdelegate中,你可以简单地从视图控制器调用Appdelegate的方法来保存数据或推送到服务器。

如果你不想;为了这个目的,我想使用Appdelegate使用单例类

答案 2 :(得分:0)

我与其他人合作的项目使用ReachabilityManager,它使用单例模式,如Reachability所述

你可以创建一个UIViewController的子类,它在viewdidload中添加通知观察,并且所有视图控制器都是这个viewcontroller的子类。

答案 3 :(得分:0)

一种方法是创建一个 UIViewController类来处理可达性更改,父类将由其余的viewController类继承。

另一种方法是创建一个处理可达性的类,在应用程序启动时实例化,并通过通知或委托或阻止对可访问性感兴趣的viewControllers,通信和数据库处理程序进行通知。

您还可以通过将子视图直接添加到UIApplication的keyWindow来通知离线用户。