0

AppleのReachabilityの例を使用することについては非常に多くの情報があり、多くは矛盾しています。以下で正しく使用していること(Reachability 2.0)を見つけようとしています。私のアプリのユースケースは次のとおりです。インターネット接続が何らかの手段(wifi、LAN、Edge、3Gなど)で利用できる場合、UIButton(「もっと見る」)がさまざまなビューに表示されます。接続がない場合、ボタンは表示されません。「もっと見る」の部分は、アプリにとって重要ではなく、単なるアドオン機能です。「SeeMore」は、接続が確立または失われるため、アプリケーションのライフサイクル中いつでも表示される場合と表示されない場合があります。これが私がそれをした方法です-これは正しいですか、そして/またはより良い方法がありますか?

どんな助けでも大歓迎です!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
4

2 に答える 2

1

rootViewController.bConnection = (netStatus != NotReachable);別のタイプの接続を追加しても機能するのではないでしょうか?

(BOOL *)は間違いのようです ( と同等(signed char *)です)。一般的に、私boolは C99 を好みます。C99 仕様は、bool blah:1;スペースが心配な場合に特に考慮しています。

また、「インターネット接続」を確認できるという考えにも注意してください — ネットワーク接続を確認することはできますが、ISP がダウンしている可能性や、接続先のホストがダウンしている可能性、または誰かがダウンしている可能性があります。海底ケーブルに穴あけ。kHostName が接続先のホスト名である場合、それは正しいことを行います。

于 2010-05-26T13:21:42.877 に答える
0

迅速な返答に感謝致します!だから私が集めているのは、上記を次のように変更することだけです。

- (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); 
    } 
}
于 2010-05-26T14:18:07.620 に答える