5

我正在尝试在我的应用程序中实现可达性。我有它applicationDidFinishLaunching。如果我的连接真的很糟糕并且我启动了应用程序,Reachability 会花费很长时间,并且经常会导致应用程序崩溃并显示The application failed to launch in time错误消息。

因此,我尝试将 Reachability 的调用放在后台线程中。但是当我这样做时,我不再收到可达性通知。

我应该在哪里调用可达性?

编辑

application failed to load in time我根据下面的建议添加了 TonyMillions 的可达性代码,但是在非常糟糕的网络条件下我仍然会遇到同样的错误。要重现我所看到的内容,请转到 Settings.app -> Developer -> Network Link Conditioner,将其打开并将其设置为 100% 丢失。

您的应用是否仍会在这种情况下加载?

4

3 回答 3

2

在 Github 上使用 Tony Millions 可达性项目。

https://github.com/tonymillion/Reachability

然后在我的应用程序委托中,我只是输入了 applicationdidfinishlaunching

self.reachability = [Reachability reachabilityForInternetConnection];

[self.reachability startNotifier];

然后当状态改变时,这将被调用

#pragma mark - Reachability

- (void)reachabilityChanged:(NSNotification *)note {

    NetworkStatus ns = [(Reachability *)[note object] currentReachabilityStatus];

    if (ns == NotReachable) {

        if (![self.networkAlert isVisible]) {

            if ([self networkAlert] == nil) {

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"\n\nNo Internet Connection" message:@"You require an internet connection to communicate with the server." delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
                [self setNetworkAlert:alert];
            }

            [self.networkAlert show];  
        }
    } else {

        if ([self networkAlert] != nil) {

            [self.networkAlert dismissWithClickedButtonIndex:0 animated:YES]; 
        }
    }
}
于 2012-11-07T15:14:16.407 回答
0

因此,我将 Reachability 的调用放在后台线程中。但是当我这样做时,我不再收到可达性通知。

当您在后台线程中调用 Reachability 时,您应该在后台运行循环中安排 Reachability,并确保后台线程运行循环正在运行。

在后台线程中执行:

  1. 创建可达性对象,

    可达性 * 可达性 = [可达性reachabilityWithHostName:@"www.google.com"];

  2. [可达性 startNotifier];

  3. [[NSRunLoop currentRunLoop] 运行];

这可能有效,但建议在主线程中调度通知程序。

于 2012-11-06T06:37:20.580 回答
0

TonyMillion 在GitHub 上帮我解决了这个问题。

如果您使用他的 Reachability 替代品,您所要做的就是startNotifier像这样包装调用:

dispatch_async(dispatch_get_global_queue(0,0), ^{
    [self.internetReach startNotifier];
});

该应用程序不会在糟糕的网络条件下启动失败,并且您仍然会在主线程上收到通知。

于 2012-11-16T05:49:55.270 回答