我应该在哪里执行可达性检查?

Posted

技术标签:

【中文标题】我应该在哪里执行可达性检查?【英文标题】:Where should I perform a Reachability check? 【发布时间】:2010-10-17 14:54:07 【问题描述】:

我想检查有效的网络连接。我遵循了 Apple 的 Reachability 示例并将我的支票放入 applicationDidFinishLaunching

#pragma mark -
#pragma mark Application lifecycle

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

        if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
        
            NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
        

        // Override point for customization after application launch.
        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

        //Check for connectivity
        internetReach = [[Reachability reachabilityForInternetConnection] retain];
        [internetReach startNotifer];
        [self updateInterfaceWithReachability: internetReach];

        [window addSubview:navigationController.view];
        [window makeKeyAndVisible];

        return YES;
    

但是,我的应用程序有时会崩溃并显示错误 Application Failed to Launch in Time

我在这里发布了我的崩溃问题:Application Failed to Launch in Time

我不确定应该在哪里执行可达性检查?

【问题讨论】:

【参考方案1】:

根据网络状况,可达性检查可能需要很长时间(30 秒或更长时间)。但是,如果您的应用程序的 UI 在几秒钟内(远少于 30 秒)没有响应,则操作系统会假定它已死并杀死它。

如果您在后台线程而不是 UI 线程中进行可达性检查,那么您的 UI 将保持响应状态,操作系统和用户都不会认为您的应用已锁定或崩溃。

【讨论】:

我在后台线程中执行它仍然得到同样的错误:***.com/questions/3979065/…【参考方案2】:

-applicationDidBecomeActive 中,您可以在后台调用一个方法,该方法使用带有-performSelectorInBackground:withObject: 的可达性代码。

【讨论】:

为什么我不能把它放在ApplicationDidFinishLaunching中? 您不想在每次应用程序激活时对其进行测试吗?在 ios 4 多任务处理中,这种情况经常发生。

以上是关于我应该在哪里执行可达性检查?的主要内容,如果未能解决你的问题,请参考以下文章

实时检查网络可达性

Swift - 可达性崩溃

使用 SWIFT 检查 IP 地址可达性

使用多个视图控制器时的可达性检查

有没有办法在 jQuery 中检查服务器的可达性测试

在运行方法之前使用可达性检查连接