16

このメソッドを使用して、アクティブな接続を確認するために Apple からダウンロードした到達可能性:

-(BOOL)isReachable{

    Reachability *r = [Reachability reachabilityWithHostName:@"http://www.google.com"];

    if(NotReachable == [r currentReachabilityStatus]) {
        NSLog(@"Not Reachable");
        return NO;
    }

    NSLog(@"Reachable");
    return YES;  

}

接続しているのに毎回NOを返す?理由がわかりません...

何か案は?ありがとう。

余談ですが、きれいな到達可能性シングルトンクラスを推奨できる人はいますか?

4

6 に答える 6

30

編集済み:http呼び出しからプロトコルを削除する必要があるため、次のreachabilityWithHostNameように更新しました

 Reachability *reachability = [Reachability reachabilityWithHostname:@"www.google.com"];
 NetworkStatus netStatus = [reachability currentReachabilityStatus];
于 2012-07-01T17:53:37.807 に答える
1

一般的に、デバイスがインターネットに接続できるかどうかを確認しようとしている場合は、reachabilityWithHostName: ではなく、reachabilityForInternetConnection を使用する必要があります。また、これらの呼び出しはどちらも起動に少し時間がかかります (それでもミリ秒単位ですが、次の行の if 条件に到達するのにかかる時間よりも長くなります)。到達可能性を使用します。

static NetworkManager* sharedInstance = nil;

@interface NetworkManager()
@property (nonatomic, strong) Reachability* reachability;
@end

@implementation NetworkManager
@synthesize reachability;

+ (NetworkManager*)sharedInstance
{
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[NetworkManager alloc] init];
        }
    }
    return sharedInstance;
}

- (id)init
{
    reachability = [WYReachability reachabilityForInternetConnection];
}

- (BOOL)isNetworkReachable
{
    return ([self.reachability currentReachabilityStatus] != NotReachable);
}
@end

使用できる他のクラスで到達可能なネットワークを確認するには。

[[NetworkManager sharedInstance] isNetworkReachable];
于 2012-07-01T20:53:17.890 に答える
1

私はKSReachabilityを使用しています。NSNotification、ブロック、KVO、および ARC の有無にかかわらず動作します。

KSReachability *reachability = [KSReachability reachabilityToHost:@"www.google.com"];
reachability.onReachabilityChanged = ^(KSReachability* reachability) {
    NSLog(@"Update: network is %@", reachability.reachable ? @"up." : @"down.");
};
于 2012-07-01T18:04:21.467 に答える