我正在尝试在我的应用中实现可达性。我在applicationDidFinishLaunching
中有。如果我的连接非常糟糕并且我启动了应用程序,则Reachability将永远耗尽并经常使用The application failed to launch in time
错误消息使应用程序崩溃。
所以相反,我尝试在后台线程中调用Reachability。但是当我这样做时,我不再收到Reachability通知。
我应该在哪里打电话给Reachability?
修改:
我根据下面的建议添加了TonyMillions的可达性代码,但在非常糟糕的网络条件下,我仍然遇到相同的application failed to load in time
错误。要重现我所看到的内容,请转到Settings.app - >开发者 - >网络链接调节器,将其打开并将其设置为100%损失。
您的应用仍然在这种情况下加载吗?
答案 0 :(得分:2)
在Github上使用Tony Millions可达性项目。
https://github.com/tonymillion/Reachability
然后在我的app委托中,我只是放入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];
}
}
}
答案 1 :(得分:0)
相反,我在后台线程中调用了Reachability。但 当我这样做时,我不再收到可达性通知。
当你在后台线程中调用Reachability时,你应该在后台运行循环中安排Reachability并确保后台线程runloop正在运行。
在后台线程中执行:
创建可达性对象,
可达性*可达性= [Reachability reachabilityWithHostName:@“www.google.com”];
[可达性startNotifier];
[[NSRunLoop currentRunLoop] run];
这可能有用,但建议在主线程中安排通知程序。
答案 2 :(得分:0)
TonyMillion帮助我在GitHub上解决了这个问题。
如果你正在使用他的Reachability替换,你所要做的就是包裹startNotifier
这样的呼叫:
dispatch_async(dispatch_get_global_queue(0,0), ^{
[self.internetReach startNotifier];
});
该应用程序将无法在恶劣的网络条件下启动,您仍然会在主线程上收到通知。