Достижимость не работает должным образом
Скачанный Reachability от 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 каждый раз, несмотря на то, что он подключен? Не могу понять, почему...
Есть идеи? Благодарю.
На стороне примечания, может ли кто-нибудь порекомендовать хороший чистый класс одноэлементного повышения?
Ответы
Ответ 1
EDITED: вы должны удалить протокол, http
из вашего запроса на reachabilityWithHostName
, поэтому обновите его до
Reachability *reachability = [Reachability reachabilityWithHostname:@"www.google.com"];
NetworkStatus netStatus = [reachability currentReachabilityStatus];
Ответ 2
Используйте этот код, чтобы проверить, подключено ли устройство к Интернету или нет.
используйте этот код в viewDidLoad:
Reachability* internetReachable; = [Reachability reachabilityForInternetConnection];
[internetReachable startNotifier];
hostReachable = [Reachability reachabilityWithHostName: @"www.apple.com"] ;
[hostReachable startNotifier];
и добавьте эту функцию в свой код:
-(void) checkNetworkStatus:(NSNotification *)notice
{
recheabilityBool=FALSE;
nonrecheabilityBool=FALSE;
// called after network status changes
NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
switch (internetStatus)
{
case NotReachable:
{
nonrecheabilityBool=TRUE;
internetCon=0;
//NSLog(@"The internet is down.");
break;
}
case ReachableViaWiFi:
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
internetCon=404;
[prefs setInteger:internetCon forKey:@"conKey"];
//NSLog(@"The internet is working via WIFI.");
break;
}
case ReachableViaWWAN:
{
//NSLog(@"The internet is working via WWAN.");
break;
}
}
NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
switch (hostStatus)
{
case NotReachable:
{
internetCon=0;
if( nonrecheabilityBool==FALSE)
{
//NSLog(@"A gateway to the host server is down.");
}
break;
}
case ReachableViaWiFi:
{
if(recheabilityBool==FALSE)
{
recheabilityBool=TRUE;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
internetCon=404;
[prefs setInteger:internetCon forKey:@"conKey"];
//NSLog(@"The internet is working via WIFI.");
break;
}
//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;
}
}
}
- (BOOL)connected
{
Reachability *reachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [reachability currentReachabilityStatus];
return !(networkStatus == NotReachable);
}
Ответ 3
У меня такая же проблема с Tony Million Reachability: статус сети всегда был установлен NotReachable. Я исправляю это с добавлением Framework SystemConfiguration
Надеюсь, поможет
Ответ 4
Я использую KSReachability. Он работает с NSNotification, блоками, KVO и с ARC или без него.
KSReachability *reachability = [KSReachability reachabilityToHost:@"www.google.com"];
reachability.onReachabilityChanged = ^(KSReachability* reachability) {
NSLog(@"Update: network is %@", reachability.reachable ? @"up." : @"down.");
};
Ответ 5
Если вы пытаетесь выяснить, может ли устройство подключиться к Интернету в целом, вы, вероятно, должны использовать доступность дляInternetConnection вместо достижимостиWithHostName :. Кроме того, для обоих этих вызовов потребуется немного времени для запуска (оно все равно будет в миллисекундах, но дольше, чем время, необходимое для достижения условия 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];
Ответ 6
Еще один полный ответ:
-(BOOL) isReachable:(NSString *)url
{
//Retrieve the host name by given url address.
NSString *hostName = [[NSURL URLWithString:url] host];
Reachability *r = [Reachability reachabilityWithHostName:hostName];
if(NotReachable == [r currentReachabilityStatus]) {
NSLog(@"Not Reachable");
return NO;
}
NSLog(@"Reachable");
return YES;
}