可达性 + UIAlertView + 误报

Posted

技术标签:

【中文标题】可达性 + UIAlertView + 误报【英文标题】:Reachability + UIAlertView + false-positive 【发布时间】:2012-11-12 19:35:55 【问题描述】:

大家好,我在使用 Apple 的可达性代码时遇到了一些问题。 我发现,即使设备正确连接到互联网,最初可达性代码也会发出 1 个错误通知(Networkstatus = NotReachable),然后是几个正确通知(Networkstatus = ReachableViaWiFi)。 因此,当我收到“NotReachable”通知时,我正在显示 UIAlertView,即使设备已连接到互联网,应用程序仍会输出 uialertview,通知用户设备未连接。

有没有办法避免这种不便?

任何帮助将不胜感激。

这是我的代码:

在我的 .h 文件中:

@property (nonatomic, retain) Reachability *hostReach;

在我的 .m 文件中:

- (void)viewDidLoad

    self.hostReach = [Reachability reachabilityWithHostname:@"www.google.com"];

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

    [_hostReach startNotifier];


    NetworkStatus netStatus = [self.hostReach currentReachabilityStatus];


    if(netStatus == NotReachable && _alertShowing==NO)

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:@"No internet connection found"

                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles: nil];

        _alertShowing = YES;

        [alert show];

    

    ...




-(void)reachabilityChanged:(NSNotification *)note 

    Reachability* curReach = [note object];

NSParameterAssert([curReach isKindOfClass: [Reachability class]]);    

    NetworkStatus netStatus = [curReach currentReachabilityStatus];


    if(netStatus == NotReachable && _alertShowing==NO)

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                    message:@"No internet connection found"

                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles: nil];

        _alertShowing = YES;

        [alert show];

    


-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
    _alertShowing = NO;


【问题讨论】:

【参考方案1】:

你为什么使用reachabilityWithHostname:@"www.google.com"?此方法检查特定主机的可达性(在您的情况下为 google.com)。如果 Google 可用或不可用,您会收到通知。 Google 可能会阻止您,您将收到NotReachable 状态。

尝试使用:

//reachabilityForInternetConnection- checks whether the default route is available.  
//  Should be used by applications that do not connect to a particular host
+ (Reachability*) reachabilityForInternetConnection;

还可以看看方法描述here。

【讨论】:

非常感谢@EugeneK,我认为解决了它。但是谷歌会出于什么原因阻止我呢? Ps 我使用的是reachabilityWithHostname:@"www.google.com" 因为在Apple 的示例代码中他们使用的是reachabilityWithHostname:@"www.apple.com" 我认为谷歌会有更可靠的服务器。 好吧,如果 google 认为您或您的用户试图通过向他们的服务器发送大量数据包来对他们进行 DDOS,那么您可能会三思而后行。 好的,我理解你的观点@CodaFi。但如果是这样的话,为什么苹果在他们的可达性示例代码中使用reachabilityWithHostname:@"www.apple.com? 不知道。可达性是一种过时的控制野兽。改用 NPReachability,它会让您的生活更轻松。

以上是关于可达性 + UIAlertView + 误报的主要内容,如果未能解决你的问题,请参考以下文章

在 UIAlertView 中使用滑块?

没有互联网时重复 UIAlertView

检测 Internet 连接并显示 UIAlertview Swift 3

iOS UIAlertView 给出 EXC_BAD_ACCESS

为啥在我的视图被推送到导航堆栈之前我的 UIAlertView 没有在屏幕上消失?

设置可达性以监控连接并显示警报