2

这是我在应用程序中使用可达性的代码:

- (void) handleNetworkChange:(NSNotification *)notice
{

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

    if(remoteHostStatus == NotReachable) {
        UIAlertView *alertnew = [[UIAlertView alloc] initWithTitle:@"No Internet Connection!" message:@"Your device lost internet connection!"
                                                       delegate:self
                                              cancelButtonTitle:@"Close"
                                              otherButtonTitles:@"Dismiss", nil];
        [alertnew show];
    } else if (remoteHostStatus == ReachableViaWWAN) {
        //if connected to the Network
        UIAlertView *alertre = [[UIAlertView alloc] initWithTitle:@"Internet Connection!" message:@"Your device re-connected to the internet!"
                                                         delegate:self
                                                cancelButtonTitle:nil
                                                 otherButtonTitles:@"Ok!", nil];
        [alertre show];
    } else if (remoteHostStatus == ReachableViaWiFi) {
        //if connected to Wi-Fi
        UIAlertView *alertre = [[UIAlertView alloc] initWithTitle:@"Internet Connection!" message:@"Your device re-connected to the internet!"
                                                         delegate:self
                                                cancelButtonTitle:nil
                                                otherButtonTitles:@"Ok!", nil];
        [alertre show];
    }

}

我想在用户失去互联网以及重新获得互联网时提醒他们。但是我遇到的问题是,当用户使用 iPhone(具有持续的网络连接)并且他们连接到 Wi-Fi 时,他们会在已经连接时收到警报。所以我只想在他们没有互联网连接并连接到 Wi-Fi 时提醒他们。此代码适用于没有数据计划的 iPod 和 iPad,但问题出在 iPhone 上。我可以做些什么来编辑它并让它只显示一个或另一个的警报吗?

我为最后一个警报尝试了这段代码:

else if (remoteHostStatus == ReachableViaWiFi && !(remoteHostStatus == ReachableViaWWAN)) {
        //if connected to Wi-Fi but without Network
        UIAlertView *alertre = [[UIAlertView alloc] initWithTitle:@"Internet Connection!" message:@"Your device re-connected to the internet!"
                                                         delegate:self
                                                cancelButtonTitle:nil
                                                otherButtonTitles:@"Ok!", nil];
        [alertre show];
    }

但这并没有解决问题...

4

1 回答 1

3

代码逻辑中的基本错误是您将三个单独的状态视为两个状态。NetworkStatus在 Apple 的Reachability示例中,由enum此处看到的定义:

typedef enum {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableViaWWAN
} NetworkStatus;

因为你本质上想要一个BOOL(Reachable or Not)。只需将当前网络状态与NotReachable. 因此,在 anyReachableViaWiFiReachableViaWWANthe的情况BOOLYES

BOOL reachable = (_reachability.currentReachabilityStatus != NotReachable); // underbar added for good ivar style.

现在您只需要处理您拥有 WiFi 并转移到蜂窝网络或反之亦然的情况。对于这种情况,您必须跟踪调用之间的状态。添加一个BOOL名为_reachable. 然后在您的观察者方法中比较您的新值。

-(void)reachabilityDidChange:(NSNotification *)note{
    BOOL reachable = (_reachability.currentReachabilityStatus != NotReachable);
    if (reachable != _reachable){
        // State Changed. Inform the user if necessary.
        if (reachable){
            // Connected.
        } else {
            // Lost connection.
        }
    }
    _reachable = reachable;
}

警告:下面不请自来的建议

关于这些UIAlertViews 的一般概念的最后一点说明。警报本质上是在向用户尖叫。重新连接的警报本质上是大喊“嘿!现在一切都好!”。我想推荐观看 WWDC2012 的第 221 场会议,他们谈到了常见的设计陷阱。大约 35 分钟后,他们开始谈论警报。很明显,他们正试图引导开发人员尽可能远离使用警报。

于 2012-09-25T22:28:05.970 回答