使用 AppDelegate 中的可达性块检查整个应用程序的连接性

Posted

技术标签:

【中文标题】使用 AppDelegate 中的可达性块检查整个应用程序的连接性【英文标题】:Using Reachibility block in AppDelegate to check connectivity throughout the app 【发布时间】:2013-10-02 11:11:22 【问题描述】:

我正在开发一个 ios 应用程序,它需要在它的几个 ViewController 类中检查 Internet 连接是否可用。为了检查网络连接,我使用 (Reachability library by Tony Million)。

这就是我现在正在做的事情。在需要连接检查的 ViewController 类中,我在 ViewDidLoad 处使用此代码块....

Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];
reach.reachableBlock = ^(Reachability*reach)

    NSLog(@"REACHABLE!"); // Load offline data from core data
;

reach.unreachableBlock = ^(Reachability*reach)

    NSLog(@"UNREACHABLE!"); // Fetch data from Rest Api
;

[reach startNotifier];

但是当网络状态发生变化并且我的应用程序位于此 ViewController 中时,我会遇到一些意外行为,例如有时从 api 获取数据会像循环一样一次又一次地运行。我不确定我的代码是否做错了什么,所以期待专家的 cmets。

无论如何,我正在考虑另一种解决方案来解决此问题并使代码更清洁和稳定。我想从专家那里知道这是否是好的方法。我想在 AppDelegate 中保留一个名为 isNetworkConnected 的 BOOL 变量。然后在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中,我想运行上述代码并在其中设置变量 isNetworkConnected YES/NO。所以,代码会是这样的……

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Reachability* reach = [Reachability reachabilityWithHostname:@"www.google.com"];
    reach.reachableBlock = ^(Reachability*reach)
    
        NSLog(@"REACHABLE!"); 
         isNetworkConnected = YES ;
    ;

    reach.unreachableBlock = ^(Reachability*reach)
    
        NSLog(@"UNREACHABLE!"); 
        isNetworkConnected = NO ;
    ;

    [reach startNotifier];

    // rest codes....
 

然后,在我的 ViewController 中,我会这样做......

if(appdelegate.isNetworkConnected == YES)
    // Fetch data from api
 else
   // Load offline data from Core data

就是这样。我想知道我的想法是好是坏,如果我犯了任何错误或任何更好的建议将不胜感激。提前致谢。

【问题讨论】:

查看这个答案,您可以检查所有视图控制器的可达性。 ***.com/questions/1083701/… 谢谢,我已经看过了。我正在使用上面投票最多的答案中的解决方案。我只是想在应用程序中创建连接变量 Gloabal,这样我就不需要在每个 ViewController 中一次又一次地使用整个块。 【参考方案1】:

在下面试试我的代码。

在您的AppDelegate.h 中创建如下方法。

-(void)checkNetConnection 

    bool success = false;
    const char *host_name = [@"http://***.com"
                             cStringUsingEncoding:NSASCIIStringEncoding];

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    bool isAvailable = success && (flags & kSCNetworkFlagsReachable) &&
    !(flags & kSCNetworkFlagsConnectionRequired);

    [[NSUserDefaults standardUserDefaults]setBool:isAvailable forKey:@"ISNETAVAILABLE"];

application didFinishLaunchingWithOptions调用这个方法:

[自检网络连接];

在您想要检查的任何其他视图控制器中,只需简单地定义一个Bool 变量,如下所示。

bool isAvailable = [[NSUserDefaults standardUserDefaults]boolForKey:@"ISNETAVAILABLE"];

if (isAvailable) 

    // do what you want to do if internet is available.



else 

    // internet is not available.


希望对你有所帮助。

【讨论】:

【参考方案2】:

在 AppDelegate.h 文件中定义 1 个 Bool 变量,并在整个课程中检查此 Bool。检查网络连接是否在 Bool Make true。如果互联网连接无法访问,则布尔值是错误的。

然后他们检查你想要的布尔值。

【讨论】:

这正是我在上面的问题中描述的解决方案。请检查我的代码,如果我做错了什么,请告诉我。谢谢你的回答。

以上是关于使用 AppDelegate 中的可达性块检查整个应用程序的连接性的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 中的可达性问题

无法触发 AppDelegate 中可达性的观察者

我应该啥时候检查互联网连接

始终检查 Cocoa 中的网络可达性

防止在首次启动 iOS 时调用 AFNetworking 可达性状态

检查iphone中的网络可达性后应用程序崩溃?