diff --git a/AFNetworking/AFHTTPClient.h b/AFNetworking/AFHTTPClient.h index 8438659..3c1593d 100644 --- a/AFNetworking/AFHTTPClient.h +++ b/AFNetworking/AFHTTPClient.h @@ -38,19 +38,19 @@ extern NSString * const AFNetworkingReachabilityDidChangeNotification; #endif /** - Enum representing the reachability states to the `baseURL` of the `AFHTTPClient.` + Specifies network reachability of the client to its `baseURL` domain. */ #ifdef _SYSTEMCONFIGURATION_H -typedef enum{ - AFReachabilityStatusUnknown = 0, - AFReachabilityStatusNotReachable, - AFReachabilityStatusReachableViaWWAN, - AFReachabilityStatusReachableViaWiFi, -}AFReachabilityStatus; +typedef enum { + AFNetworkReachabilityStatusUnknown = -1, + AFNetworkReachabilityStatusNotReachable = 0, + AFNetworkReachabilityStatusReachableViaWWAN = 1 << 0, + AFNetworkReachabilityStatusReachableViaWiFi = 1 << 1, +} AFNetworkReachabilityStatus; #endif /** - Method used to encode parameters into request body. + Specifies the method used to encode parameters into request body. */ typedef enum { AFFormURLParameterEncoding, @@ -165,7 +165,7 @@ extern NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *paramete @warning This property requires the `SystemConfiguration` framework. Add it in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (Prefix.pch). */ #ifdef _SYSTEMCONFIGURATION_H -@property (readonly, nonatomic) AFReachabilityStatus reachabilityStatus; +@property (readonly, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; #endif ///--------------------------------------------- @@ -204,7 +204,7 @@ extern NSString * AFQueryStringFromParametersWithEncoding(NSDictionary *paramete @warning This method requires the `SystemConfiguration` framework. Add it in the active target's "Link Binary With Library" build phase, and add `#import ` to the header prefix of the project (Prefix.pch). */ #ifdef _SYSTEMCONFIGURATION_H -- (void)setReachabilityStatusChangeBlock:(void (^)(AFReachabilityStatus reachabilityStatus))block; +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block; #endif ///------------------------------- diff --git a/AFNetworking/AFHTTPClient.m b/AFNetworking/AFHTTPClient.m index 6a4f476..13baaa3 100644 --- a/AFNetworking/AFHTTPClient.m +++ b/AFNetworking/AFHTTPClient.m @@ -34,6 +34,11 @@ #ifdef _SYSTEMCONFIGURATION_H #import +#import +#import +#import +#import +#import #endif NSString * const AFNetworkingReachabilityDidChangeNotification = @"com.alamofire.networking.reachability.change"; @@ -57,7 +62,7 @@ static NSString * const kAFMultipartFormBoundary = @"Boundary+0xAbCdEfGbOuNdArY" #ifdef _SYSTEMCONFIGURATION_H typedef SCNetworkReachabilityRef AFNetworkReachabilityRef; -typedef void (^AFNetworkReachabilityStatusBlock)(AFReachabilityStatus reachabilityStatus); +typedef void (^AFNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status); #else typedef id AFNetworkReachabilityRef; #endif @@ -196,6 +201,7 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) { @property (readwrite, nonatomic, retain) NSOperationQueue *operationQueue; #ifdef _SYSTEMCONFIGURATION_H @property (readwrite, nonatomic, assign) AFNetworkReachabilityRef networkReachability; +@property (readwrite, nonatomic, assign) AFNetworkReachabilityStatus networkReachabilityStatus; @property (readwrite, nonatomic, copy) AFNetworkReachabilityStatusBlock networkReachabilityStatusBlock; #endif @@ -214,8 +220,8 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) { @synthesize operationQueue = _operationQueue; #ifdef _SYSTEMCONFIGURATION_H @synthesize networkReachability = _networkReachability; +@synthesize networkReachabilityStatus = _networkReachabilityStatus; @synthesize networkReachabilityStatusBlock = _networkReachabilityStatusBlock; -@synthesize reachabilityStatus = _reachabilityStatus; #endif + (AFHTTPClient *)clientWithBaseURL:(NSURL *)url { @@ -252,6 +258,7 @@ static NSString * AFPropertyListStringFromParameters(NSDictionary *parameters) { #endif #ifdef _SYSTEMCONFIGURATION_H + self.networkReachabilityStatus = AFNetworkReachabilityStatusUnknown; [self startMonitoringNetworkReachability]; #endif @@ -287,22 +294,28 @@ static void AFReachabilityCallback(SCNetworkReachabilityRef __unused target, SCN BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); BOOL isNetworkReachable = (isReachable && !needsConnection); - AFReachabilityStatus status = AFReachabilityStatusUnknown; - if(isNetworkReachable == NO){ - status = AFReachabilityStatusNotReachable; + AFNetworkReachabilityStatus status = AFNetworkReachabilityStatusNotReachable; + if(isNetworkReachable == NO) { + status = AFNetworkReachabilityStatusNotReachable; + } else { + #if TARGET_OS_IPHONE + if((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0){ + status |= AFNetworkReachabilityStatusReachableViaWWAN; + } + #endif + + struct sockaddr_in localWiFiAddress; + memset(&localWiFiAddress, '\0', sizeof(localWiFiAddress)); + localWiFiAddress.sin_len = sizeof(localWiFiAddress); + localWiFiAddress.sin_family = AF_INET; + localWiFiAddress.sin_addr.s_addr = htonl(IN_LINKLOCALNETNUM); + + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)&localWiFiAddress); + if (reachability != NULL) { + status |= AFNetworkReachabilityStatusReachableViaWiFi; + } } -#if TARGET_OS_IPHONE - else if((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0){ - status = AFReachabilityStatusReachableViaWWAN; - } - else{ - status = AFReachabilityStatusReachableViaWiFi; - } -#else - else { - status = AFReachabilityStatusReachableViaWiFi; - } -#endif + AFNetworkReachabilityStatusBlock block = (AFNetworkReachabilityStatusBlock)info; if (block) { block(status); @@ -326,13 +339,15 @@ static void AFReachabilityCallback(SCNetworkReachabilityRef __unused target, SCN } } -- (void)setReachabilityStatusChangeBlock:(void (^)(AFReachabilityStatus reachabilityStatus))block { - void (^reachabilityCallback)(AFReachabilityStatus reachabilityStatus) = ^(AFReachabilityStatus reachabilityStatus){ - _reachabilityStatus = reachabilityStatus; - if(block) - block(reachabilityStatus); +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block { + AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status){ + self.networkReachabilityStatus = status; + if (block) { + block(status); + } }; - self.networkReachabilityStatusBlock = reachabilityCallback; + + self.networkReachabilityStatusBlock = callback; [self startMonitoringNetworkReachability]; } #endif