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