天天看點

iOS AFNetworking封裝使用 網絡監聽

podfile

pod 'SVProgressHUD', '~> 2.2.3'
    pod 'AFNetworking', '~> 3.2.0'
           

AppDelegate

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

//是否有網
@property (nonatomic, assign) BOOL hasNetwork;

+ (AppDelegate *)shared;

@end
           

啟動網絡監聽:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [AFNetworkingManager listenNetWorkingStatus];
    return YES;
}
           

請求資料:

__weak typeof(self) weakSelf = self;
    [AFNetworkingManager.shared postRequest:URL_Config parameter:param success:^(NSDictionary *result) {

	} failure:^(NSError *error) {
        
    }];
           

AFNetworkingManager檔案

#import <Foundation/Foundation.h>

@interface AFNetworkingManager : NSObject

+ (instancetype)shared;

// 監聽網絡狀态
+ (void)listenNetWorkingStatus;
+ 
- (void)getRequest:(NSString *)urlString
         parameter:(NSDictionary *)param
           success:(void(^)(NSDictionary *result))successBlock
           failure:(void(^)(NSError *error))failureBlock;

- (void)postRequest:(NSString *)urlString
         parameter:(NSDictionary *)param
           success:(void(^)(NSDictionary *result))successBlock
           failure:(void(^)(NSError *error))failureBlock;

// 狀态欄加載提示
- (void)showActivityIndicator;
- (void)hideActivityIndicator;

@end
           
#import "AFNetworkingManager.h"
#import "AFNetworking.h"
#import <SVProgressHUD/SVProgressHUD.h>
#import "AppDelegate.h"

typedef enum {
    RequestTypeGet,
    RequestTypePost
} RequestType;

@interface AFNetworkingManager()

@property (nonatomic, strong) AFHTTPSessionManager *sessionManager;

@end

@implementation AFNetworkingManager

- (AFHTTPSessionManager *)sessionManager {
    if (!_sessionManager) {
        _sessionManager = [[AFHTTPSessionManager alloc] init];
        _sessionManager.requestSerializer.timeoutInterval = 30;
        _sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript",@"text/plain", nil];
    }
    return _sessionManager;
}

+ (id)shared {
    static  dispatch_once_t once;
    static   id instance;
    dispatch_once(&once, ^{
        instance = [self new];
    });
    return instance;
}

// 網絡監聽
+ (void)listenNetWorkingStatus {
    /* 函數調用傳回的枚舉值 */
    /**
     AFNetworkReachabilityStatusUnknown          = -1,  // 未知
     AFNetworkReachabilityStatusNotReachable     = 0,   // 無連接配接
     AFNetworkReachabilityStatusReachableViaWWAN = 1,   // 3G 花錢
     AFNetworkReachabilityStatusReachableViaWiFi = 2,   // 區域網路絡,
     */
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                [SVProgressHUD showSuccessWithStatus:@"未知網絡"];
                [SVProgressHUD dismissWithDelay:2];
                break;
            case AFNetworkReachabilityStatusNotReachable:
                [SVProgressHUD showSuccessWithStatus:@"未連接配接網絡"];
                [SVProgressHUD dismissWithDelay:2];
                AppDelegate.shared.hasNetwork = NO;
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                if (!AppDelegate.shared.hasNetwork) {
                    AppDelegate.shared.hasNetwork = YES;
                    [SVProgressHUD showSuccessWithStatus:@"已連接配接蜂窩移動網絡"];
                    [SVProgressHUD dismissWithDelay:2];
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_GetNetwork" object:@"4G"];
                }
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                if (!AppDelegate.shared.hasNetwork) {
                    AppDelegate.shared.hasNetwork = YES;
                    [SVProgressHUD showSuccessWithStatus:@"已連接配接WiFi"];
                    [SVProgressHUD dismissWithDelay:2];
                    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_GetNetwork" object:@"WIFI"];
                }
                break;
            default:
                break;
        }
    }];
    
    /**
     * 由于檢測網絡有一定的延遲, 是以在啟動APP的時候如果不設定網絡的延遲, 直接調用[AFNetworkReachabilityManager sharedManager].networkReachabilityStatus有可能得到的是status 傳回的值是 AFNetworkReachabilityStatusUnknown;
     這個時候雖然有網, 但是也會因為網絡的延遲, 直接做出錯誤的判斷.
     一般建議設定延時調用 */
    /** 0.35秒後再執行surveyNetworkConcatenate:方法. */
    [self performSelector:@selector(startMonitoring) withObject:nil afterDelay:0.35f];
    
    //有網的時候預設啟動提示已連接配接,設定這個第一次不會提示
    AppDelegate.shared.hasNetwork = YES;
}

+ (void)startMonitoring {
    /** 1. 開啟監聽 */
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
}

- (void)request:(RequestType)requestType
      urlString:(NSString *)urlString
      parameter:(NSDictionary *)param
        success:(void (^)(NSDictionary *))successBlock
        failure:(void (^)(NSError *))failureBlock {
    
    NSLog(@"\nurl = %@\n param = %@", urlString, param);
    
    void(^tempSuccessBlock)(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) = ^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        NSError *error;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:responseObject options:NSJSONWritingPrettyPrinted error:&error];
        if (jsonData) {
            NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
            NSLog(@"\nresult = %@", jsonString);
        }
        
        NSString *ret = responseObject[@"ret"];
        NSDictionary *result = responseObject[@"data"][@"Databody"];
        if (responseObject && ret && result) {
            if (ret.integerValue == 200) {
                successBlock(result);
            } else {
                [SVProgressHUD showErrorWithStatus:responseObject[@"msg"]];
                [SVProgressHUD dismissWithDelay:2];
                NSDictionary * userInfo = [NSDictionary dictionaryWithObject:responseObject[@"msg"] forKey:NSLocalizedDescriptionKey];
                error = [[NSError alloc] initWithDomain:@"An Error Has Occurred" code:ret.integerValue userInfo:userInfo];
                failureBlock(error);
            }
        } else {
            [SVProgressHUD showErrorWithStatus:@"資料解析失敗"];
            [SVProgressHUD dismissWithDelay:2];
            NSDictionary * userInfo = [NSDictionary dictionaryWithObject:@"資料解析失敗" forKey:NSLocalizedDescriptionKey];
            error = [[NSError alloc] initWithDomain:@"An Error Has Occurred" code:0 userInfo:userInfo];
            failureBlock(error);
        }
        [self hideActivityIndicator];
    };

    void(^tempFailureBlock)(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) = ^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"\ncode = %zd, error = %@", error.code, error.localizedDescription);
        if (AppDelegate.shared.hasNetwork == NO) {
            [SVProgressHUD showErrorWithStatus:@"未連接配接網絡"];
            [SVProgressHUD dismissWithDelay:2];
        } else {
            [SVProgressHUD showErrorWithStatus:@"連接配接伺服器失敗"];
            [SVProgressHUD dismissWithDelay:2];
        }
        failureBlock(error);
        [self hideActivityIndicator];
    };

    [self showActivityIndicator];
    if (requestType == RequestTypeGet) {
        [self.sessionManager GET:urlString
                      parameters:param
                        progress:nil
                         success:tempSuccessBlock
                         failure:tempFailureBlock];
    } else {
        [self.sessionManager POST:urlString
                       parameters:param
                         progress:nil
                          success:tempSuccessBlock
                          failure:tempFailureBlock];
    }
    
}

- (void)showActivityIndicator {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}

- (void)hideActivityIndicator {
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)getRequest:(NSString *)urlString
         parameter:(NSDictionary *)param
           success:(void (^)(NSDictionary *))successBlock
           failure:(void (^)(NSError *))failureBlock {
    [self request:RequestTypeGet urlString:urlString
        parameter:param
          success:successBlock
          failure:failureBlock];
}

- (void)postRequest:(NSString *)urlString
          parameter:(NSDictionary *)param
            success:(void (^)(NSDictionary *))successBlock
            failure:(void (^)(NSError *))failureBlock {
    [self request:RequestTypePost
        urlString:urlString
        parameter:param
          success:successBlock
          failure:failureBlock];
}


@end

           

github位址:https://github.com/ColdChains/ListenNetwork