防止在首次启动 iOS 时调用 AFNetworking 可达性状态

Posted

技术标签:

【中文标题】防止在首次启动 iOS 时调用 AFNetworking 可达性状态【英文标题】:Prevent AFNetworking Reachability Status Getting Called at First Launch for iOS 【发布时间】:2013-06-22 20:21:29 【问题描述】:

我只想知道如何防止每次打开已连接到 Internet 的应用程序时出现警报视图。如果有帮助,我正在使用 ARC。

这是我在 AppDelegate 中的 didFinishLaunchingWithOptions 方法中的代码:

__weak id myself = self; // to silence warning for retain cycle
_httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://apple.com"]];
    [_httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) 
        switch (status) 
            case AFNetworkReachabilityStatusNotReachable:
            
                // Not reachable
                NSLog(@"Not connected to the internet");
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Not connected to the internet" delegate:myself cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil];
                [alert show];

                break;
            
            case AFNetworkReachabilityStatusReachableViaWiFi:
            
                NSLog(@"Connected to the internet via WiFi");
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Connected to the internet via WiFi" delegate:myself cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil];
                [alert show];

                break;
            
            case AFNetworkReachabilityStatusReachableViaWWAN:
            
                NSLog(@"Connected to the internet via WWAN");
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Connected to the internet" delegate:myself cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil];
                [alert show];

                break;
            
            default:
                break;
        
    ];

【问题讨论】:

连接到 Internet 时是否有理由调用 UIAlertView?我想我有点困惑,如果你不想要它,为什么它会在那里。 我现在有这个 alertviews 只是为了测试可达性,特别是当网络出现故障并恢复时。如果用户已连接到网络,我想通知他,并根据我正在开发的应用程序的要求,从上面的通知中以微妙的幻灯片呈现它。 【参考方案1】:

呼应@D80Buckeye:只是不要弹出可达性警报。这是完全没有必要的,并且不会为用户体验增加任何东西(用户不能做任何事情来解决这种缺乏可达性的问题)。如果有的话,您可以显示网络可达性的非模态指示。

【讨论】:

当应用程序从网络断开并再次连接时,这正是我想要做的。我现在只是在做 alertviews 来测试可达性是否有效。即使我使用了一个微妙的可访问性指示,我怎样才能防止它在每次启动应用程序时显示?【参考方案2】:

创建一个全局标志怎么样

static BOOL g_FirstTime = YES;

并在显示警报视图之前检查它

if (g_FirstTime) 
    g_FirstTime = NO;
    break;


NSLog(@"Connected to the internet via WiFi");
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Connected to the internet via WiFi" delegate:myself cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil];
[alert show];
break;

【讨论】:

【参考方案3】:

在不了解您的项目范围的情况下,很难提出可靠的建议。我全心全意的建议是,您不希望每次最终用户在网络上反弹时都弹出一个窗口。如果您实现的代码可以可靠地检测刷新的网络连接,如果我是您,我会在屏幕上放置一些微妙(但明显)的指示器,例如小图标/图像,甚至可能是显示“已连接”的 UILabel或“断开连接”或任何适合您的措辞。正如其他人所建议的那样,我将完全避免为该警报实例化任何类型的弹出窗口。

关于代码本身 - 非常熟悉 View Controller Programming 和 ios App Programming Guide。在这两个文档之间,您可以正确地绘制出如何检测和响应应用程序何时进入和退出后台状态、何时启动、何时变为活动状态、何时出现/加载视图等。结合这些方法和调用有一些全局状态驱动的变量,你应该一切顺利。

底线是你想熟悉那些应用状态文档以及[[NSNotificationCenter defaultCenter] addObserver:<#(id)#> selector:<#(SEL)#> name:<#(NSString *)#> object:<#(id)#>]

如果这没有意义,请告诉我。

【讨论】:

实际上我的项目的旧版本使用了来自 Tony Million 的 NSNotificationCenter 和 Reachability,它的工作原理和我想的一样。我也尝试在 AFNetworking 的可达性中这样做,它没有相同的行为,即当应用程序启动时,可达性标志不会被调用,只有当它从网络断开恢复时才被调用。 您使用什么作为触发器来搜索可达性?这些方法只会在你调用它们时被调用——它们不是监听器。

以上是关于防止在首次启动 iOS 时调用 AFNetworking 可达性状态的主要内容,如果未能解决你的问题,请参考以下文章

React Native 应用程序在首次启动时询问 iOS 位置权限,但 0 引用内部任何位置的地理/位置代码

如何使用 SwiftUI 在首次应用启动时启动教程?

应用程序在首次启动后关闭

Foundation 兜风仅在首次加载问题时启动

为啥谷歌地图在首次启动时不会自动缩放到用户位置?

应用内购买仅在首次应用启动时失败