AFNetworking 2.0と「AFNetworkReachabilityManager」を使用して、ユーザーがインターネットに接続されているかどうかを確認しようとしていますが、うまくいかないようです。インターネットがオフになっていても、有効なインターネット接続があることは常に返されます。これは私のコードです:
-(BOOL)connected {
__block BOOL reachable;
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"No Internet Connection");
reachable = NO;
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
NSLog(@"WIFI");
reachable = YES;
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"3G");
reachable = YES;
break;
default:
NSLog(@"Unkown network status");
reachable = NO;
break;
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
}];
return reachable;
}
このメソッドは、viewDidLoadメソッドから呼び出されます。動作していないため、コードに何か問題がありますか?
そのブロックは、到達可能性changesの場合にのみ実行されるためです。
現在のステータスを取得するには、次を実行できます。
- (BOOL)connected {
return [AFNetworkReachabilityManager sharedManager].reachable;
}
これを必要以上に難しくしている。これを試して:
- (void)viewDidLoad {
[super viewDidLoad];
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
- (BOOL)connected {
return [AFNetworkReachabilityManager sharedManager].reachable;
}
ステータスが変更されたときにも通知を受ける場合は、setReachabilityStatusChangeBlock
を実装します
お役に立てれば!
コードが機能しない2つのコードエラーがあります。
まず、到達可能性の変化に応じて起動されるブロック内で「監視を開始」する呼び出しが発生します。したがって、ブロックは起動しません(他の場所で監視を開始しない限り)。
第二に、そのブロックがいつ実行されるかについての保証はありません。その結果、初期化された値を「到達可能」が返すことが常に表示されます。明らかにこれは通常nullです。最初のエラーを修正したとしても、戻る前にブロックが起動するという保証はありません(実際にはかなりありそうにありません)。
最後に、より一般的なレベルでは、onlyを非同期で実行できるコードを同期的にテストしようとしています。つまり、到達可能性マネージャーが到達可能性を瞬時に正確に判断することは不可能です。 「私はWiFiを使用していると思う」または「3Gを使用していると思う」と言うことができますが、実際にできるかどうかを確認する必要もありますreachインターネット(したがって、名前の到達可能性)それが確実になる前に。到達可能性とは、単に「wifiを持っている」または「3gを持っている」という接続だけではなく、それを介してインターネットにアクセスできるかどうかも重要です。これは、デバイスが実際にリクエストを送信する必要があることを意味し、これは技術的には同期的に行うことができますが、本のすべてのルールはネットワークコードmustを非同期に、そして良い方法で行うことを主張しています理由。同期した場合は、ネットワークコールが返されるまでUIをブロックします。適切なタイムアウトに応じて、おそらく30秒、40秒、50秒、さらには60秒後です。
あなたがすべきことは、アプリの到達可能性シングルトン監視を開始し、アプリデリゲートのメソッドをロードし、後でそのデータを取得することです。アプリの構造を知らなくても、正確さを保証しようとはしませんが、少なくともある程度は役立つはずです。
これを試して、
AppDelegate、didFinishLaunchingWithOptionsメソッド
{ // SETUP AFNETWORKING's NETWORK INDICATOR AND REACHABILITY
[AFNetworkActivityIndicatorManager sharedManager].enabled = YES;
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
HttpManagerクラスでは、
- (BOOL)isNetworkRechable {
if ([AFNetworkReachabilityManager sharedManager].reachable) {
if ([AFNetworkReachabilityManager sharedManager].isReachableViaWiFi)
NSLog(@"Network reachable via WWAN");
else
NSLog(@"Network reachable via Wifi");
return YES;
}
else {
NSLog(@"Network is not reachable");
return NO;
}
}
yourViewControllerで、
[[HttpManager sharedObject] isNetworkRechable];
注:最初はチェックしないでくださいnetworkRechability動作しないためです。そのため、少なくとも1秒待ってから確認してください。
私の経験では、
_[[AFNetworkReachabilityManager sharedManager] startMonitoring];
_
setReachabilityStatusChangeBlock
を実行するのに少し時間がかかるので、-(BOOL)connected
から値を返す必要はありません。
そのため、ネットワークが接続/切断されたら、いくつかのタスクを実行できます。
次の関数は、その場で(同期的に)接続を確認するのに最適です。
_[AFNetworkReachabilityManager sharedManager].reachable;
_
他の答えは間違っています!これを使用して可用性を確認することをお勧めします。
if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable)
理由は、最初にステータス変更ブロックが呼び出されるまでnetworkReachabilityStatusがAFNetworkReachabilityStatusUnknownに設定され、コードがネットワークが利用できない場合に利用できないとコードが判断するのを防ぐためです。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[self checkNetworkReachability];
}
+(BOOL) isReachable{
return [AFNetworkReachabilityManager sharedManager].reachable;
}
+(void) checkNetworkReachability{
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
// Check the reachability status and show an alert if the internet connection is not available
switch (status) {
case -1:
// AFNetworkReachabilityStatusUnknown = -1,
NSLog(@"The reachability status is Unknown");
break;
case 0:
// AFNetworkReachabilityStatusNotReachable = 0
NSLog(@"The reachability status is not reachable");
break;
case 1:
NSLog(@"The reachability status is reachable via wan");
[[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
break;
case 2:
// AFNetworkReachabilityStatusReachableViaWiFi = 2
NSLog(@"The reachability status is reachable via WiFi");
[[NSNotificationCenter defaultCenter] postNotificationName:@"Network_Reachable" object:nil];
break;
default:
break;
}
}];
}