AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?

Posted

技术标签:

【中文标题】AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?【英文标题】:AFNetworking 2.0. How check reachability status for socket (managerForAddress:)? 【发布时间】:2013-10-13 12:43:09 【问题描述】:

我使用“pod install”安装 AFNetworking 2.0,并使用 App.xcworkspace。 使用 AFNetworking 2.0,我成功发送了 POST 请求,但在可达性方面我遇到了问题。 我需要监视套接字何时打开和关闭,我的代码不起作用,我忘记了什么?

// Check server socket available
struct sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_len = sizeof(serverAddr);
serverAddr.sin_port = htons(80);
serverAddr.sin_addr.s_addr = inet_addr("192.168.1.108");

AFNetworkReachabilityManager *reachability = [AFNetworkReachabilityManager managerForAddress:&serverAddr];
[reachability setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) 
    switch (status) 
        case AFNetworkReachabilityStatusNotReachable:
            NSLog(@"No Internet Connection");
            break;
        case AFNetworkReachabilityStatusReachableViaWiFi:
            NSLog(@"WIFI");
            break;
        case AFNetworkReachabilityStatusReachableViaWWAN:
            NSLog(@"3G");
            break;
        default:
            NSLog(@"Unknown network status");
            break;
    
];
[reachability startMonitoring];

【问题讨论】:

【参考方案1】:

我想我找到了问题所在。看起来 AFNetworking 的回调机制无法正常工作 - 查看 AFNetworkReachabilityManager 的 startMonitoring 方法:有一个:

        if (strongSelf.networkReachabilityStatusBlock) ...

无论你是否设置了回调,这似乎都失败了。

为了解决这个问题,我向 AFNetworkReachabilityManager 添加了以下方法:

- (void)startMonitoringWithStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block

    [self stopMonitoring];

    if (!self.networkReachability) 
        return;
    

    __weak __typeof(self)weakSelf = self;
    AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) 
        __strong __typeof(weakSelf)strongSelf = weakSelf;

        strongSelf.networkReachabilityStatus = status;
        if (block) 
            block(status);
        
    ;

    SCNetworkReachabilityContext context = 0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL;
    SCNetworkReachabilitySetCallback(self.networkReachability, AFNetworkReachabilityCallback, &context);

    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityGetFlags(self.networkReachability, &flags);
    dispatch_async(dispatch_get_main_queue(), ^
        AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusForFlags(flags);
        callback(status);
    );

    SCNetworkReachabilityScheduleWithRunLoop(self.networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);

这基本上做同样的事情,但从方法参数而不是从可达性管理器的属性引用块。

【讨论】:

以上是关于AFNetworking 2.0。如何检查套接字的可达性状态(managerForAddress :)?的主要内容,如果未能解决你的问题,请参考以下文章

带有 OAuth2 令牌的 AFNetworking 2.0

使用 AFNetworking 2.0 如何使用 JSON 测试我的 POST 请求的大小?

AFNetworking 2.0:isReachable 总是返回 False

如何在旧的 AFNetworking 中使用 AFNetworking 2.0+?

如何设置 AFNetworking 2.0 默认标头?

如何使用 AFNetworking-2.0 执行 JSON 编码的 GET 请求?