iOS:可达性-startNotifier返回应用程序后失败



我的可达性与本线程中的建议完全一样。

我使用的是开源可达性。然而,我使用的不是块,而是通知,因此这个过程与苹果的可达性代码非常相似。

我第一次启动这个应用程序时,我运行了这个程序,它运行得很好。

Reachability *reachability = [reach hostReachability];
[reachability startNotifier];

可达性更改:事件正在激发:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachability_Changed:) name:kReachabilityChangedNotification object:nil];

然而,一旦我按下主页按钮并返回应用程序,startNotifier就会在内部返回NO而不是YES。

    // Set it as our reachability queue, which will retain the queue
    if(!SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue))
    {
#ifdef DEBUG
        NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError()));
#endif
      ...
      return NO;

因此上述事件再也不会被触发。

除非我错误地使用了这个,并且当可达性被实例化时,startNotifier应该只在init中调用一次,然后再也不调用了?

self.hostReachability = [Reachability reachabilityWithHostname:_HOST];

您应该只需要在init/load上调用[self.hostReachability startNotifier]一次。以下是您的基本需求概述,使用通知而不是链接线程上的块方法:

  1. 将tonymillion/可达性库添加到您的项目中。

  2. 为您的可达性对象创建属性以确保它被保留,例如

    @interface ViewController () {
      NSString *_HOST;
    }
    @property Reachability *hostReachability;
    @end
    
  3. 注册更改通知,并启动通知程序,例如

    - (void)viewDidLoad
    {
      [super viewDidLoad];
      [[NSNotificationCenter defaultCenter] addObserver:self
                                               selector:@selector(reachabilityChanged:)
                                                   name:kReachabilityChangedNotification
                                                 object:nil];
      _HOST = @"www.google.com";
      self.hostReachability = [Reachability reachabilityWithHostname:_HOST];
      [self.hostReachability startNotifier];
    }
    - (void)viewDidUnload
    {
      [super viewDidUnload];
      [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    
  4. 最后,创建一个reachabilityChanged:方法来处理您对可达性更改的响应,例如

    - (void)reachabilityChanged:(NSNotification*)notification
    {
      Reachability *notifier = [notification object];
      NSLog(@"%@", [notifier currentReachabilityString]);
    }
    

注意:如果您按下主页按钮并卸载应用程序,可访问性的更改应在返回应用程序后立即发出通知。

最新更新