AFNetworking 3.x Logger
6235 ワード
WBAFNetworkingLogger
使いやすいように、自分で2.x中の そして、要求と応答のキー情報を印刷する.
使用方法
およびAFNetworking 2.xの使用方法は同じです.
プログラムの起動後に直接呼び出すには、次の手順に従います.
MIT license.
WBAFNetworkingLogger
はAFNetworking 3である.xの拡張は、元のライブラリで元の2.x中のAFNetworkActivityLogger
は除去する.使いやすいように、自分で2.x中の
AFNetworkActivityLogger
の内容は、AFNetworking 3に変更する.x利用可能な補助クラスWBAFNetworkingLogger
が監視しますAFNetworkingTaskDidResumeNotification
AFNetworkingTaskDidCompleteNotification
使用方法
およびAFNetworking 2.xの使用方法は同じです.
プログラムの起動後に直接呼び出すには、次の手順に従います.
[[WBAFNetworkingLogger sharedLogger] startLogging];
デフォルトではInfoモードが使用されていますが、以下の方法で特定のモードを設定できます.一般的にDebugモードが多いです.[[WBAFNetworkingLogger sharedLogger] setLevel:WBLoggerLevelDebug];
LicenseMIT license.
//
// WBAFNetworkingLogger.h
// WBAFNetworkingLogger
//
// Created by brownfeng on 16/9/26.
// Copyright © 2016 brownfeng. All rights reserved.
//
#import
typedef NS_ENUM(NSUInteger, WBLoggerLevel) {
WBLoggerLevelOff,
WBLoggerLevelDebug,
WBLoggerLevelInfo,
WBLoggerLevelWarn,
WBLoggerLevelError,
WBLoggerLevelFatal = WBLoggerLevelOff,
};
@interface WBAFNetworkingLogger : NSObject
/**
The level of logging detail. See "Logging Levels" for possible values. `WBLoggerLevelInfo` by default.
*/
@property (nonatomic, assign) WBLoggerLevel level;
/**
Returns the shared logger instance.
*/
+ (instancetype)sharedLogger;
/**
Start logging requests and responses.
*/
- (void)startLogging;
/**
Stop logging requests and responses.
*/
- (void)stopLogging;
@end
//
// WBAFNetworkingLogger.m
// WBAFNetworkingLogger
//
// Created by brownfeng on 16/9/26.
// Copyright © 2016 brownfeng. All rights reserved.
//
#import "WBAFNetworkingLogger.h"
#import "AFNetworking.h"
#import
static NSError * WBNetworkErrorFromNotification(NSNotification *notification) {
NSError *error = nil;
if ([[notification object] isKindOfClass:[NSURLSessionTask class]]) {
error = [(NSURLSessionTask *)[notification object] error];
if (!error) {
error = notification.userInfo[AFNetworkingTaskDidCompleteErrorKey];
}
}
return error;
}
@interface WBAFNetworkingLogger()
@end
@implementation WBAFNetworkingLogger
+ (instancetype)sharedLogger {
static WBAFNetworkingLogger *_sharedLogger = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedLogger = [[self alloc] init];
});
return _sharedLogger;
}
- (id)init {
if (self = [super init]){
self.level = WBLoggerLevelInfo;
}
return self;
}
- (void)dealloc {
[self stopLogging];
}
- (void)startLogging {
[self stopLogging];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidStart:) name:AFNetworkingTaskDidResumeNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkRequestDidFinish:) name:AFNetworkingTaskDidCompleteNotification object:nil];
}
- (void)stopLogging {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma -mark notification
static void * WBNetworkRequestStartDate = &WBNetworkRequestStartDate;
- (void)networkRequestDidStart:(NSNotification *)notification {
NSURLSessionTask *task = notification.object;
NSURLRequest *request = task.currentRequest;
if (!request) {
return;
}
objc_setAssociatedObject(notification.object, WBNetworkRequestStartDate, [NSDate date], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
NSString *body = nil;
if ([request HTTPBody]) {
body = [[NSString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding];
}
switch (self.level) {
case WBLoggerLevelDebug:
NSLog(@"%@ '%@': %@ %@", [request HTTPMethod], [[request URL] absoluteString], [request allHTTPHeaderFields], body);
break;
case WBLoggerLevelInfo:
NSLog(@"%@ '%@'", [request HTTPMethod], [[request URL] absoluteString]);
break;
default:
break;
}
}
-(void)networkRequestDidFinish:(NSNotification *)notification{
NSURLSessionTask *task = notification.object;
NSURLRequest *request = task.currentRequest;
NSURLResponse *response = task.response;
NSError *error = WBNetworkErrorFromNotification(notification);
if (!request && !response) {
return;
}
NSUInteger responseStatusCode = 0;
NSDictionary *responseHeaderFields = nil;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
responseStatusCode = (NSUInteger)[(NSHTTPURLResponse *)response statusCode];
responseHeaderFields = [(NSHTTPURLResponse *)response allHeaderFields];
}
id responseObject = nil;
if (notification.userInfo) {
responseObject = notification.userInfo[AFNetworkingTaskDidCompleteSerializedResponseKey];
}
NSTimeInterval elapsedTime = [[NSDate date] timeIntervalSinceDate:objc_getAssociatedObject(notification.object, WBNetworkRequestStartDate)];
if (error) {
switch (self.level) {
case WBLoggerLevelDebug:
case WBLoggerLevelInfo:
case WBLoggerLevelWarn:
case WBLoggerLevelError:
NSLog(@"[Error] %@ '%@' (%ld) [%.04f s]: %@", [request HTTPMethod], [[response URL] absoluteString], (long)responseStatusCode, elapsedTime, error);
default:
break;
}
} else {
switch (self.level) {
case WBLoggerLevelDebug:
NSLog(@"%ld '%@' [%.04f s]: %@ %@", (long)responseStatusCode, [[response URL] absoluteString], elapsedTime, responseHeaderFields, responseObject); break;
case WBLoggerLevelInfo:
NSLog(@"%ld '%@' [%.04f s]", (long)responseStatusCode, [[response URL] absoluteString], elapsedTime);
break;
default:
break;
}
}
}
@end
具体的な情報参照https://github.com/brownfeng/WBAFNetworkingLogger