Использование NSAlerts и NSNotifications с достижимостью 2.2 - PullRequest
1 голос
/ 23 января 2011

Я реализовал класс Apple Reachability 2.2 в новом проекте iOS 4.2. Я просто хочу, чтобы окно предупреждения отображалось, когда устройство теряет сетевое подключение. (И, следовательно, соблюдайте требование юзабилити интерфейса для App Store.) Я использовал этот предыдущий вопрос SO в качестве отправной точки. Приложение, кажется, уведомляет правильно (когда соединение прерывается или восстанавливается), но я получаю цикл с моими представлениями NS Alert. Я думаю, что моя ошибка должна быть несколько базовой, но я не могу ее уловить. Если есть более чистый способ сделать это без NS AlertView, я также открыт для этого. Я оставил некоторые методы из кода ниже, но приложение довольно простое, имея только один ViewController.

ViewController.h:

#import <UIKit/UIKit.h>
#import "Reachability.h"

@class Reachability;

@interface ViewController : UIViewController   {

IBOutlet UITextView *liveOutputTextView;
IBOutlet UITextView *textView;
Reachability* internetReachable;
    Reachability* hostReachable;

}

-(IBAction)action1:(id)sender;
-(IBAction)action2:(id)sender;

-(void)textFieldDidUpdate:(id)sender;
-(void)checkNetworkStatus:(NSNotification *)notice;

@end

ViewController.m

#import "ViewController.h"
#import "Reachability.h"

@implementation ViewController

@synthesize liveOutputTextField;

- (void)checkNetworkStatus:(NSNotification *)notice

{
// called after network status changes

NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];

switch (internetStatus)

case NotReachable:
    {
        NSLog(@"The internet is inaccessible.");


        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Internet inaccessible."
                                                         message:@"Internet inaccessible."
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"  
       otherButtonTitles:nil];

        [alert show];
        [alert release];

        break;

    }
    case ReachableViaWiFi:

    {
        NSLog(@"Internet Connetion is UP.");


        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Internet is Up"
                                                         message:@"Internet Up"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
        [alert show];
        [alert release];

        break;
    }


    case ReachableViaWWAN:
    {
        NSLog(@"The internet is working via WWAN.");

        break;
    }

}


NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)

{
    case NotReachable:
    {
        NSLog(@"A gateway to the host server is down.");


        UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Host is Down"
                                                         message:@"Host Down"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles:nil];
        [alert show];
        [alert release];

        break;

    }
    case ReachableViaWiFi:
    {
        NSLog(@"A gateway to the host server is working via WIFI.");

        break;

    }
    case ReachableViaWWAN:
    {
        NSLog(@"A gateway to the host server is working via WWAN.");

        break;
    }
}

}



- (void)viewDidLoad {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
                                                       selector:@selector(checkNetworkStatus:)
                                             name:kReachabilityChangedNotification
                                                     object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain ];
[internetReachable startNotifier];


// check if a pathway to a random host exists

hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"]retain ];
[hostReachable startNotifier];

// now patiently wait for the notification


}

- (void)viewDidAppear:(BOOL)animated {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];


internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification

}


-(IBAction) action1:(id)sender {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(checkNetworkStatus:)
                                             name:kReachabilityChangedNotification
                                           object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification

//  ** LEFT OUT ACTUAL CODE FOR BREVITY  ** 

}

-(IBAction) action2:(id)sender {

// check for internet connection
[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(checkNetworkStatus:)
                                             name:kReachabilityChangedNotification
                                                object:nil];

internetReachable = [[Reachability reachabilityForInternetConnection] retain];
[internetReachable startNotifier];

// check if a pathway to a random host exists
hostReachable = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
[hostReachable startNotifier];

// now patiently wait for the notification

//  ** LEFT OUT ACTUAL CODE FOR BREVITY  ** 

}

 - (void)viewDidUnload {

// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;


  [[NSNotificationCenter defaultCenter] removeObserver:self];   
}


- (void)dealloc {

[super dealloc];

}

Ответы [ 2 ]

1 голос
/ 23 января 2011

Помните, что после отправки и обработки уведомления это уведомление необходимо удалить из Центра уведомлений.В противном случае, когда что-то в вашем статусе доступности меняется, вы получите предупреждение.

Например, для удаления уведомления вы можете сделать:надо.

0 голосов
/ 22 июня 2013

Добавление представления уведомления действительно оказалось достаточным для обработки ответа. Если вы добавите больше раз, то обратный вызов будет повторяться много раз.

...