【问题标题】:AFNetworking 2.0. How check reachability status for socket (managerForAddress:)?AFNetworking 2.0。如何检查套接字的可达性状态(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];
【问题讨论】:
标签:
afnetworking
reachability
【解决方案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);
}
这基本上做同样的事情,但从方法参数而不是从可达性管理器的属性引用块。