ios - 可达性通知多个警报

Posted

技术标签:

【中文标题】ios - 可达性通知多个警报【英文标题】:ios - Reachability notifications multiple alerts 【发布时间】:2014-11-25 21:43:44 【问题描述】:

我正在使用 Tony Million 的 Reachability 版本(问题与 Apple 的 Reachability 版本相同)来检查我的应用程序是否有活动的互联网连接。

这就是我想要的: 当视图加载或出现时,它会检查是否有互联网连接。如果没有,如果显示警报,单击时会再次尝试,直到有活动连接。

如果有连接,则视图正常加载。当 Reachability 通知连接丢失时,它会再次显示相同的警报。 这是我的实际代码:

//in the implementation:
BOOL internetActivated;

- (void)viewDidLoad

    [super viewDidLoad];
    [self testInternetConnection];
    NSLog(@"%d", internetActivated);
    if(internetActivated == NO)
    
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Pas de connexion internet" message:@"Une connexion est requise pour utiliser l'application" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Réessayer", nil];
        [alert show]; 
    
    else 
        [self onAppearFunction];
    



- (void)viewDidAppear:(BOOL)animated

    [self testInternetConnection];
    if(internetActivated == NO)
    
        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Pas de connexion internet" message:@"Une connexion est requise pour utiliser l'application" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Réessayer", nil];
        [alert show]; 
    
    else 
        [self onAppearFunction];
    


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    if (buttonIndex == 0)
    
        [self viewDidLoad];
    


- (void)testInternetConnection

    __unsafe_unretained typeof(self) weakSelf = self;
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^
            internetActivated = YES;
            NSLog(@"Yayyy, we have the interwebs!");
        );
    ;

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^
            internetActivated = NO;
            UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Pas de connexion internet" message:@"Une connexion est requise pour utiliser l'application" delegate:weakSelf cancelButtonTitle:nil otherButtonTitles:@"Réessayer", nil];
            [alert show];
            NSLog(@"Someone broke the internet :(");
        );
    ;

    [internetReachableFoo startNotifier];

多个问题: 1) InternetActivated 以“NO”开头,即使我在测试 if 条件之前调用了[self testInternetConnection]。它应该更新为YES,不是吗?

2) 即使我有互联网连接,testInternetConnection 方法中的UIAlertView 也会不断被调用。实际上:第二个警报被调用了三到四次(在 testInternet 方法中),然后第一个警报视图被调用了三到四次,即viewDidLoad 方法中的那个。

顺便说一句,我注意到这个 NSLog:NSLog(@"Yayyy, we have the interwebs!"); 每次 [self testInternetConnection] 调用都会被调用不止一次。

我完全搞乱了警报调用,这让我发疯了!

感谢您的帮助

更新:

我设法通过在加载时将 BOOL 设置为 true 并在单击离开时将其设置为 false 来避免多个警报,以避免多个警报堆积。唯一的问题是,我希望 internetActivated BOOL 在我检查它之前更新 if...

【问题讨论】:

当然我会,一旦它运作良好!感谢您的帮助。 【参考方案1】:

从 viewdidload 中删除代码

Bool alertIsShowing = NO;

- (void)viewDidAppear:(BOOL)animated

    if (! alertIsShowing)
        [self testInternetConnection];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    alertIsShowing = NO;
    if (buttonIndex == 0)
    
        [self testInternetConnection];
    


- (void)testInternetConnection

    __unsafe_unretained typeof(self) weakSelf = self;
    internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];

    // Internet is reachable
    internetReachableFoo.reachableBlock = ^(Reachability*reach)
    
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^
            NSLog(@"Yayyy, we have the interwebs!");
            [self onAppearFunction];
        );
    ;

    // Internet is not reachable
    internetReachableFoo.unreachableBlock = ^(Reachability*reach)
    
        // Update the UI on the main thread
        dispatch_async(dispatch_get_main_queue(), ^
            UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Pas de connexion internet" message:@"Une connexion est requise pour utiliser l'application" delegate:weakSelf cancelButtonTitle:nil otherButtonTitles:@"Réessayer", nil];
            [alert show];
            alertIsShowing = YES;
            NSLog(@"Someone broke the internet :(");
        );
    ;

    [internetReachableFoo startNotifier];

【讨论】:

我为所有的编辑道歉。现在试试这个。你得到了什么? 你正在调用 [self viewDidLoad];在 clickedButtonAtIndex 上! 几件事。当用户按下“再试一次”(法语)时,警报视图中的 [self viewDidLoad] 会再次尝试。当我把它拿走时,它不会再次加载。在有互联网连接之前,我不希望加载视图。两个问题:当我第一次加载视图时,它会显示警报(因为 internetActivated 是 NO,我无法更改它......)。第二个问题:当互联网关闭并再次打开时,它再次显示来自 testInternetConnection 方法的警报视图四次...... 谢谢。当我禁用互联网并再次打开它时,我得到了七个 (!!!!) NSLog 告诉我“有人破坏了互联网:(”。这就是我收到这么多警报的原因!但我不明白这怎么可能。 这是您的解释。你加载页面。警报显示,然后你去连接互联网。当您返回视图时再次出现。那是另一个警报。您单击第一个警报上的按钮。它调用 viewdidload 方法。然后你点击警报按钮和另一个电话。等等。这是错误的做法。

以上是关于ios - 可达性通知多个警报的主要内容,如果未能解决你的问题,请参考以下文章

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

iOS voip 应用程序休眠和可达性已更改,我可以收到通知吗?

检查可达性和 App Store 提交提示的正确方法

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

Apple 可达性未显示警报

AFNetworking 2.0 可达性警报始终显示