В поисках доступности (2.0) Проверка варианта использования - PullRequest
0 голосов
/ 26 мая 2010

Существует очень много информации об использовании примера Reachability от Apple, и многое противоречиво. Я пытаюсь выяснить, правильно ли я использую его (Reachability 2.0) ниже. Мой пример использования приложения таков: если подключение к Интернету доступно с помощью любых средств (Wi-Fi, LAN, Edge, 3G и т. Д.), Кнопка UIB («See More») отображается на различных экранах. Если нет соединения, кнопка не видна. Часть «See More» НЕ имеет никакого отношения к приложению, это просто дополнительная функция. «Подробнее» может отображаться или не отображаться в любое время в течение жизненного цикла приложения, поскольку соединение установлено или потеряно. Вот как я это сделал - это правильно и / или есть ли лучший способ?

Любая помощь высоко ценится! LQ

//  AppDelegate.h

#import "RootViewController.h"

@class Reachability;

@interface AppDelegate : NSObject <UIApplicationDelegate> 
{
    UIWindow *window;
    UINavigationController *navigationController;
    RootViewController *rootViewController;
    Reachability* hostReach;
    // NOT USED: Reachability* internetReach;
    // NOT USED: Reachability* wifiReach;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
@property (nonatomic, retain) IBOutlet RootViewController *rootViewController;

@end


//  AppDelegate.m

#import "AppDelegate.h"
#import "Reachability.h"

#define kHostName @"www.somewebsite.com"

@implementation AppDelegate

@synthesize window;
@synthesize navigationController;
@synthesize rootViewController;

- (void) updateInterfaceWithReachability: (Reachability*) curReach {

    if(curReach == hostReach) {

        NetworkStatus netStatus = [curReach currentReachabilityStatus];
        BOOL connectionRequired = [curReach connectionRequired];

        // Set a Reachability BOOL value flag in rootViewController 
        // to be referenced when opening various views

        if ((netStatus != ReachableViaWiFi) && (netStatus != ReachableViaWWAN)) {
            rootViewController.bConnection = (BOOL *)0;
        } else {
           rootViewController.bConnection = (BOOL *)1;
        }

    } 
}

- (void) reachabilityChanged: (NSNotification* )note {

     Reachability* curReach = [note object];
     NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
     [self updateInterfaceWithReachability: curReach];
}

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    // NOTE: #DEFINE in Reachability.h: 
     // #define kReachabilityChangedNotification   @"kNetworkReachabilityChangedNotification"

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

    hostReach = [[Reachability reachabilityWithHostName: kHostName] retain];
    [hostReach startNotifer];
    [self updateInterfaceWithReachability: hostReach];

    [window addSubview:[navigationController view]];
    [window makeKeyAndVisible];

}

- (void)dealloc {
    [navigationController release];
    [rootViewController release];
    [window release];
    [super dealloc];
}

@end

Ответы [ 2 ]

1 голос
/ 26 мая 2010

Почему бы не rootViewController.bConnection = (netStatus != NotReachable);, который все равно будет работать, если они добавят еще один тип подключения?

(BOOL *) выглядит как ошибка (эквивалентно (signed char *)). В общем, я предпочитаю C99 bool, а спецификация C99 специально предусматривает bool blah:1;, если вы беспокоитесь о космосе.

Кроме того, будьте осторожны с идеей, что вы можете проверить наличие «интернет-соединения» - вы можете проверить сетевое соединение, но ваш провайдер может быть неработоспособен, или хост, к которому вы хотите подключиться, может быть неработоспособен, или мог пробурить через подводный кабель. Если kHostName - это имя хоста, к которому вы хотите подключиться, тогда все будет правильно.

0 голосов
/ 26 мая 2010

Спасибо за быстрый ответ! Так что я собираю все, что мне нужно сделать, это изменить вышеприведенное на:

- (void) updateInterfaceWithReachability: (Reachability*) curReach { 

    if(curReach == hostReach) { 

        NetworkStatus netStatus = [curReach currentReachabilityStatus]; 
        BOOL connectionRequired = [curReach connectionRequired]; 

        // Set a Reachability BOOL value flag in rootViewController  
        // to be referenced when opening various views 

        rootViewController.bConnection = (netStatus != NotReachable); 
    } 
}
...