【问题标题】:Check Internet connection state using AFNetworking使用 AFNetworking 检查 Internet 连接状态
【发布时间】:2016-10-26 08:42:34
【问题描述】:

我想创建一个通用类来检查互联网连接,它也应该在互联网改变状态时通知我。

我正在使用 AFNetworking 来检查互联网状态。

这是我尝试过的代码,但它不起作用请帮助我在哪里犯错??

CheckInternet 是我从NSObject 派生的通用类

CheckInternet.h

#import <Foundation/Foundation.h>

@interface CheckInternet : NSObject

+ (void)startNetworkMonitoring;
+ (BOOL)isInternetConnectionAvailable;
@end

CheckInternet.m

#import "CheckInternet.h"
#import "AFNetworking.h"

@implementation CheckInternet


+ (void)startNetworkMonitoring
{
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));

        // Check the reachability status and show an alert if the internet connection is not available
        switch (status) {
            case -1:
                // AFNetworkReachabilityStatusUnknown = -1,
                NSLog(@"The reachability status is Unknown");
                break;
            case 0:
                // AFNetworkReachabilityStatusNotReachable = 0
                NSLog(@"The reachability status is not reachable");
                break;
            case 1:
                NSLog(@"The reachability status is reachable via wan");
                [[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:nil];
                break;
            case 2:
                // AFNetworkReachabilityStatusReachableViaWiFi = 2
                NSLog(@"The reachability status is reachable via WiFi");

                [[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:nil];
                break;

            default:
                break;
        }

    }];
}

#pragma mark - Check Internet Network Status
+ (BOOL)isInternetConnectionAvailable {
    return [AFNetworkReachabilityManager sharedManager].reachable;
}

@end

在我的ViewController.m(这里我想查看互联网状态)

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];



     [CheckInternet startNetworkMonitoring];


    if ([CheckInternet isInternetConnectionAvailable])
    {
         NSLog(@"---- Internet YES------ ");
    }
    else
    {
         NSLog(@"----- Internet NO------ ");
    }
}

//This is not called...
- (void)reachabilityChanged:(NSNotification *)notification
{
    NSLog(@"---- reachabilityChanged ----");
}

提前致谢!

【问题讨论】:

    标签: ios iphone ipad afnetworking nsnotificationcenter


    【解决方案1】:

    首先,我建议您在AppDelegate 中开始监控您的网络活动。将[CheckInternet startNetworkMonitoring]; 移至didFinishLaunchingWithOptions

    其次,将以下行添加到case == 0

     [[NSNotificationCenter defaultCenter] postNotificationName:@"reachabilityChanged" object:[NSNumber numberWithInteger:one]];
    

    还要确保在通知中发布连接状态。因为它是一个整数,所以需要将它包装在一个对象中(通常是 NSNumber)。

    第三,你需要观察reachabilityChanged通知。 将此添加到您的viewDidLoad

     [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(reachabilityChanged:) 
            name:@"reachabilityChanged"
            object:nil];
    

    在您的函数- (void)reachabilityChanged:(NSNotification *)notification 中,您应该能够访问通知的 userInfo 属性并读取那里的状态代码。

    另外,一旦你的 viewController 消失了,不要忘记取消观察通知。所以在dealloc

    [NSNotificationCenter defaultCenter] removeObserver:self];
    

    【讨论】:

    • 当网络开启/关闭时如何通知?
    • 如果您在 viewController 中观察到 reachabilityChanged ,您希望收到通知,那么您的函数应该被调用。
    • awesome answer dude 完美运行....但是视图控制器的一个问题 dealloc 方法只被调用了
    • 别担心,它是由操作系统调用的,但我们无法真正跟踪它。将代码留在那里,因此当 VC 解除分配时,它也会删除观察。另外,如果它有效,也许将其标记为已接受的答案?
    猜你喜欢
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多