【问题标题】:iOS - Reachability isReachable not workingiOS - 可达性 isReachable 不起作用
【发布时间】:2017-07-01 10:03:20
【问题描述】:

我正在使用这个库:https://github.com/tonymillion/Reachability

有时当我检查以下表达式时会出现问题: [[[ReachabilityManager sharedManager] reachability] isReachable]; 在应该是 YES 时返回 NO。我知道有互联网,因为我同时调用了 Rest 服务。

另外,如果我执行 [Reachability reachabilityWithHostname:@"www.google.com"]; 并请求方法 isReachable,那么会按预期工作。

我的测试很简单,在模拟器上试一下,然后插拔网线。

@implementation ReachabilityManager

#pragma mark -
#pragma mark Default Manager
+ (ReachabilityManager *)sharedManager {
    static ReachabilityManager *_sharedManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedManager = [[self alloc] init];
    });

    return _sharedManager;
}

#pragma mark -
#pragma mark Memory Management
- (void)dealloc {
    // Stop Notifier
    if (_reachability) {
        [_reachability stopNotifier];
    }
}

#pragma mark -
#pragma mark Class Methods
+ (BOOL)isReachable {
    return [[[ReachabilityManager sharedManager] reachability] isReachable];
}

+ (BOOL)isUnreachable {
    return ![[[ReachabilityManager sharedManager] reachability] isReachable];
}

+ (BOOL)isReachableViaWWAN {
    return [[[ReachabilityManager sharedManager] reachability] isReachableViaWWAN];
}

+ (BOOL)isReachableViaWiFi {
    return [[[ReachabilityManager sharedManager] reachability] isReachableViaWiFi];
}

#pragma mark -
#pragma mark Private Initialization
- (id)init {
    self = [super init];

    if (self) {
        // Initialize Reachability
        self.reachability = [Reachability reachabilityWithHostname:@"www.google.com"];

        // Start Monitoring
        [self.reachability startNotifier];
    }

    return self;
}

@end

【问题讨论】:

标签: ios reachability


【解决方案1】:
@property (nonatomic) Reachability *hostReachability;
@property (nonatomic) Reachability *internetReachability;
@property (nonatomic) Reachability *wifiReachability;

声明一个布尔值,

BOOL _isInternetAvaliable;

初始化您的可达性,

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

    //hostReachability
    NSString *remoteHostName = @"www.apple.com";
    self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName];
    [self.hostReachability startNotifier];
    [self updateInterfaceWithReachability:self.hostReachability];

    //internetReachability
    self.internetReachability = [Reachability reachabilityForInternetConnection];
    [self.internetReachability startNotifier];
    [self updateInterfaceWithReachability:self.internetReachability];

    //wifiReachability
    self.wifiReachability = [Reachability reachabilityForLocalWiFi];
    [self.wifiReachability startNotifier];
    [self updateInterfaceWithReachability:self.wifiReachability];

}


- (void)updateInterfaceWithReachability:(Reachability *)reachability
{
    if (reachability == self.hostReachability)
    {
        [self configurereachability:reachability];
    }

   if (reachability == self.internetReachability)
   {
       [self configurereachability:reachability];
   }

   if (reachability == self.wifiReachability)
   {
       [self configurereachability:reachability];
   }
}


- (void)configurereachability:(Reachability *)reachability
    {
    NetworkStatus netStatus = [reachability currentReachabilityStatus];
    BOOL connectionRequired = [reachability connectionRequired];

    switch (netStatus)
    {
        case NotReachable:        {
            _isInternetAvaliable = NO;
            break;
        }

        case ReachableViaWWAN:        {
            _isInternetAvaliable = YES;
           break;
        }
        case ReachableViaWiFi:        {
            _isInternetAvaliable = YES;
            break;
        }
    }

    if (connectionRequired)
    {
        _isInternetAvaliable = NO;
    }
}


-(BOOL) isInternetAvailable {
    return _isInternetAvaliable;
}

现在您可以拨打电话和访问互联网状态了,

if([[ReachabilityManager sharedManager] isInternetAvailable]){
  //Internet on
}

【讨论】:

  • [[ReachabilityManager sharedManager] isInternetAvailable] 始终使用此代码返回 YES。
  • 我再次检查了我的代码在我的项目中的工作情况,检查您是否未连接到任何 Wifi 或 WAN 网络。
  • 调试configurereachability:方法,如果你没有连接到互联网netStatus应该得到NotReachable&它应该返回NO
  • 我可以上传一个要点来查看我对您的代码的改编。对我来说看起来不错,但奇怪的是为什么总是返回 yes。
  • 我已经直接从appDelegate调用initializeReachability方法didFinishLaunchingWithOptions:方法[[ReachabilityManager sharedManager] initializeReachability];
【解决方案2】:

我终于找到了一个可靠的解决方案。 https://stackoverflow.com/a/14870229/2139691

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多