diff --git a/YH_Analytics/YH_Analytics.xcodeproj/project.pbxproj b/YH_Analytics/YH_Analytics.xcodeproj/project.pbxproj
index e688687..75ec3ad 100644
--- a/YH_Analytics/YH_Analytics.xcodeproj/project.pbxproj
+++ b/YH_Analytics/YH_Analytics.xcodeproj/project.pbxproj
@@ -15,9 +15,9 @@
 		194EDC841A7F52D100421E6C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 194EDC821A7F52D100421E6C /* LaunchScreen.xib */; };
 		194EDC901A7F52D100421E6C /* YH_AnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */; };
 		194EDC9C1A7F555800421E6C /* YH_Analytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 194EDC9B1A7F555800421E6C /* YH_Analytics.m */; };
+		CA5FDA2A1AEE302F00F86398 /* YHNetworkService.m in Sources */ = {isa = PBXBuildFile; fileRef = CA5FDA291AEE302F00F86398 /* YHNetworkService.m */; };
 		CA7AC7831ADE06F300F30791 /* YHCrashReporterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */; };
 		CA7AC7851ADE073200F30791 /* NSString+YHAnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */; };
-		CA7AC7871ADE075E00F30791 /* YHNetworkAssistantTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7861ADE075E00F30791 /* YHNetworkAssistantTests.m */; };
 		CA7AC7891ADE078200F30791 /* YHAssemblyAssistantTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */; };
 		CA7AC78B1ADE079800F30791 /* YHNetworkUserAgentTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */; };
 		CA7AC78F1ADE08CA00F30791 /* YHDeviceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC78E1ADE08CA00F30791 /* YHDeviceTests.m */; };
@@ -31,6 +31,7 @@
 		CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */; };
 		CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */; };
 		CA7AC7A41ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */; };
+		CA873DAA1AEF51AE008095A4 /* YHNetworkServiceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA873DA91AEF51AE008095A4 /* YHNetworkServiceTests.m */; };
 		CAA6BD371AE4E857006C3332 /* FakeLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */; };
 		CAA6BD3E1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */; };
 		CABC32831AD7CEB8002A4260 /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CABC32821AD7CEB8002A4260 /* libOCMock.a */; };
@@ -63,7 +64,6 @@
 		E7ADAE551AB94EBD00C9DD0B /* YHEventFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE541AB94EBD00C9DD0B /* YHEventFactory.m */; };
 		E7ADAE581AB94ED400C9DD0B /* YHStatusFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE571AB94ED400C9DD0B /* YHStatusFactory.m */; };
 		E7ADAE5B1AB95BC800C9DD0B /* YHAssemblyAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */; };
-		E7ADAE5E1AB95D2800C9DD0B /* YHNetworkAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE5D1AB95D2800C9DD0B /* YHNetworkAssistant.m */; };
 		E7B8DE221A81D68600102CC4 /* NSString+YHAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE211A81D68600102CC4 /* NSString+YHAnalytics.m */; };
 		E7B8DE421A81DCBD00102CC4 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE3A1A81DCBD00102CC4 /* Reachability.m */; };
 		E7B8DE461A81ED8F00102CC4 /* YHNetworkUserAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE451A81ED8F00102CC4 /* YHNetworkUserAgent.m */; };
@@ -114,9 +114,10 @@
 		194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsTests.m; sourceTree = "<group>"; };
 		194EDC9A1A7F555800421E6C /* YH_Analytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YH_Analytics.h; sourceTree = "<group>"; };
 		194EDC9B1A7F555800421E6C /* YH_Analytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_Analytics.m; sourceTree = "<group>"; };
+		CA5FDA281AEE302F00F86398 /* YHNetworkService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHNetworkService.h; sourceTree = "<group>"; };
+		CA5FDA291AEE302F00F86398 /* YHNetworkService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkService.m; sourceTree = "<group>"; };
 		CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHCrashReporterTests.m; sourceTree = "<group>"; };
 		CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+YHAnalyticsTests.m"; sourceTree = "<group>"; };
-		CA7AC7861ADE075E00F30791 /* YHNetworkAssistantTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkAssistantTests.m; sourceTree = "<group>"; };
 		CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantTests.m; sourceTree = "<group>"; };
 		CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkUserAgentTests.m; sourceTree = "<group>"; };
 		CA7AC78E1ADE08CA00F30791 /* YHDeviceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHDeviceTests.m; sourceTree = "<group>"; };
@@ -130,6 +131,7 @@
 		CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHEventFactoryTests.m; sourceTree = "<group>"; };
 		CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactoryTests.m; sourceTree = "<group>"; };
 		CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsLogicTests.m; sourceTree = "<group>"; };
+		CA873DA91AEF51AE008095A4 /* YHNetworkServiceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkServiceTests.m; sourceTree = "<group>"; };
 		CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeLocationManager.h; sourceTree = "<group>"; };
 		CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeLocationManager.m; sourceTree = "<group>"; };
 		CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantLogicTests.m; sourceTree = "<group>"; };
@@ -203,8 +205,6 @@
 		E7ADAE571AB94ED400C9DD0B /* YHStatusFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactory.m; sourceTree = "<group>"; };
 		E7ADAE591AB95BC800C9DD0B /* YHAssemblyAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHAssemblyAssistant.h; sourceTree = "<group>"; };
 		E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistant.m; sourceTree = "<group>"; };
-		E7ADAE5C1AB95D2800C9DD0B /* YHNetworkAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHNetworkAssistant.h; sourceTree = "<group>"; };
-		E7ADAE5D1AB95D2800C9DD0B /* YHNetworkAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkAssistant.m; sourceTree = "<group>"; };
 		E7B8DE201A81D68600102CC4 /* NSString+YHAnalytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+YHAnalytics.h"; sourceTree = "<group>"; };
 		E7B8DE211A81D68600102CC4 /* NSString+YHAnalytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+YHAnalytics.m"; sourceTree = "<group>"; };
 		E7B8DE391A81DCBD00102CC4 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };
@@ -335,10 +335,10 @@
 		CA7AC78C1ADE088D00F30791 /* UtilsTest */ = {
 			isa = PBXGroup;
 			children = (
-				CA7AC7861ADE075E00F30791 /* YHNetworkAssistantTests.m */,
 				CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */,
 				CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */,
 				CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */,
+				CA873DA91AEF51AE008095A4 /* YHNetworkServiceTests.m */,
 			);
 			name = UtilsTest;
 			sourceTree = "<group>";
@@ -512,8 +512,8 @@
 				E7B8DE451A81ED8F00102CC4 /* YHNetworkUserAgent.m */,
 				E7ADAE591AB95BC800C9DD0B /* YHAssemblyAssistant.h */,
 				E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */,
-				E7ADAE5C1AB95D2800C9DD0B /* YHNetworkAssistant.h */,
-				E7ADAE5D1AB95D2800C9DD0B /* YHNetworkAssistant.m */,
+				CA5FDA281AEE302F00F86398 /* YHNetworkService.h */,
+				CA5FDA291AEE302F00F86398 /* YHNetworkService.m */,
 			);
 			path = Utils;
 			sourceTree = "<group>";
@@ -651,7 +651,6 @@
 			buildActionMask = 2147483647;
 			files = (
 				E74D45B71ABA7C6300EFE12E /* AFURLConnectionOperation.m in Sources */,
-				E7ADAE5E1AB95D2800C9DD0B /* YHNetworkAssistant.m in Sources */,
 				194EDC7C1A7F52D100421E6C /* ViewController.m in Sources */,
 				E74D45BC1ABA7C6300EFE12E /* UIActivityIndicatorView+AFNetworking.m in Sources */,
 				E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */,
@@ -667,6 +666,7 @@
 				E7ADAE431AB9479600C9DD0B /* YHDataFactory.m in Sources */,
 				E74D45B61ABA7C6300EFE12E /* AFSecurityPolicy.m in Sources */,
 				E74D45BA1ABA7C6300EFE12E /* AFURLSessionManager.m in Sources */,
+				CA5FDA2A1AEE302F00F86398 /* YHNetworkService.m in Sources */,
 				E7ADAE3E1AB946C100C9DD0B /* YHStatus.m in Sources */,
 				E74D45BE1ABA7C6300EFE12E /* UIButton+AFNetworking.m in Sources */,
 				194EDC791A7F52D100421E6C /* AppDelegate.m in Sources */,
@@ -696,13 +696,13 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				CA7AC7871ADE075E00F30791 /* YHNetworkAssistantTests.m in Sources */,
 				CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */,
 				CAA6BD3E1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m in Sources */,
 				194EDC901A7F52D100421E6C /* YH_AnalyticsTests.m in Sources */,
 				CA7AC7951ADE090800F30791 /* YHStatusTests.m in Sources */,
 				CA7AC78B1ADE079800F30791 /* YHNetworkUserAgentTests.m in Sources */,
 				CA7AC7831ADE06F300F30791 /* YHCrashReporterTests.m in Sources */,
+				CA873DAA1AEF51AE008095A4 /* YHNetworkServiceTests.m in Sources */,
 				CA7AC78F1ADE08CA00F30791 /* YHDeviceTests.m in Sources */,
 				CA7AC7891ADE078200F30791 /* YHAssemblyAssistantTests.m in Sources */,
 				CA7AC7931ADE08F000F30791 /* YHEventTests.m in Sources */,
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Model/YHDevice.m b/YH_Analytics/YH_Analytics/YH_Analytics/Model/YHDevice.m
index 4398103..861ed22 100644
--- a/YH_Analytics/YH_Analytics/YH_Analytics/Model/YHDevice.m
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/Model/YHDevice.m
@@ -14,7 +14,6 @@
 #include <sys/socket.h>
 #import <UIKit/UIKit.h>
 #import <AdSupport/AdSupport.h>
-//#import "YHNetworkUserAgent.h"
 #import "OpenUDID.h"
 
 #import "YHDevice.h"
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.h b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.h
index 4cc73b4..a5525a8 100644
--- a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.h
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.h
@@ -7,8 +7,6 @@
 //
 
 #import <Foundation/Foundation.h>
-#import <CoreLocation/CoreLocation.h>
-#import "YHNetworkAssistant.h"
 #import "YHAnalyItemData.h"
 
 
@@ -31,7 +29,7 @@ extern NSString * const JsonKeyDataTypeErrors;
     用于组装数据
  */
 
-@interface YHAssemblyAssistant : NSObject <CLLocationManagerDelegate>
+@interface YHAssemblyAssistant : NSObject
 
 + (instancetype)sharedInstance;
 
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.m b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.m
index b13fa69..e37618a 100644
--- a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.m
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHAssemblyAssistant.m
@@ -6,9 +6,10 @@
 //  Copyright (c) 2015年 YOHO. All rights reserved.
 //
 
+#import <CoreLocation/CoreLocation.h>
 #import <CoreTelephony/CTCarrier.h>
 #import <CoreTelephony/CTTelephonyNetworkInfo.h>
-#import "Reachability.h"
+#import "YHNetworkService.h"
 #import "YHAssemblyAssistant.h"
 //#import "YHErrorFactory.h"
 //#import "YHEventFactory.h"
@@ -20,6 +21,7 @@
 #import "YHDevice.h"
 #import "YHStatus.h"
 
+
 #define kPathCaches             [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
 #define kPathLogSystem          [kPathCaches stringByAppendingPathComponent:@"YHLogSystem"]
 #define kYASApiMethod           @"yas_mobile"
@@ -46,7 +48,7 @@ static dispatch_queue_t persisting_queue() {
     return persisting_queue;
 }
 
-@interface YHAssemblyAssistant ()
+@interface YHAssemblyAssistant () <CLLocationManagerDelegate>
 
 /**
  *  定位服务
@@ -285,10 +287,12 @@ static dispatch_queue_t persisting_queue() {
         if (event) {
             [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:event.jsonDictionary, nil] forKey:JsonKeyDataTypeEvents];
 
-            [[YHNetworkAssistant sharedInstance] postWithAPI:kYASApiMethod parameters:self.immediUploadItemDic from:self success:^(id responseObject) {
-
-            } failure:^(NSError *error) {
-                NSLog(@"error = %@", error.localizedDescription);
+            [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
+                if (success) {
+                    NSLog(@"upload immedialite data success.");
+                } else {
+                    NSLog(@"error = %@", error.localizedDescription);
+                }
             }];
         }
     } else if(itemData.dataType == YHItemDataTypeError) {
@@ -296,10 +300,12 @@ static dispatch_queue_t persisting_queue() {
         if (error) {
             [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:error.jsonDictionary, nil] forKey:JsonKeyDataTypeErrors];
 
-            [[YHNetworkAssistant sharedInstance] postWithAPI:kYASApiMethod parameters:self.immediUploadItemDic from:self success:^(id responseObject) {
-
-            } failure:^(NSError *error) {
-                NSLog(@"error = %@", error.localizedDescription);
+            [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
+                if (success) {
+                    NSLog(@"upload immedialite data success.");
+                } else {
+                    NSLog(@"error = %@", error.localizedDescription);
+                }
             }];
         }
     } else {
@@ -317,11 +323,14 @@ static dispatch_queue_t persisting_queue() {
     
     if (uploadData) {
         
-        [[YHNetworkAssistant sharedInstance] postWithAPI:kYASApiMethod parameters:uploadData from:self success:^(id responseObject) {
-
-            [self removeLocalFile];
-        } failure:^(NSError *error) {
-            NSLog(@"error = %@", error.localizedDescription);
+        [[YHNetworkService sharedInstance] uploadLogData:uploadData completionBlock:^(BOOL success, NSError *error) {
+            if (success) {
+                NSLog(@"upload immedialite data success.");
+                // 删除已发送的本地文件
+                [self removeLocalFile];
+            } else {
+                NSLog(@"error = %@", error.localizedDescription);
+            }
         }];
     }
 }
@@ -344,11 +353,12 @@ static dispatch_queue_t persisting_queue() {
      CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE)
      CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above)
      */
-    [[YHNetworkAssistant sharedInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) {
+    
+    [[YHNetworkService sharedInstance] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
         NSString *net = kNetWorkStatusUnknow;
         
         CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
-        switch (networkStatus) {
+        switch (status) {
             case AFNetworkReachabilityStatusUnknown:
             case AFNetworkReachabilityStatusNotReachable:
                 net = kNetWorkStatusUnknow;
@@ -382,6 +392,7 @@ static dispatch_queue_t persisting_queue() {
         if ([self updateNetWorkStatus:net]) {
             [self updateImmediUploadDic];
         }
+
     }];
 }
 
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHCrashReporter.m b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHCrashReporter.m
index 5a9bcac..e3edb34 100644
--- a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHCrashReporter.m
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHCrashReporter.m
@@ -125,17 +125,21 @@ void uncaughtCrashExceptionHandler(NSException *exception)
 - (void)handleSignal:(NSDictionary*)userInfo
 {
     NSLog(@"crash============:\n%@", userInfo);
-    if (userInfo) {
-        [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
+    if (!userInfo || ![userInfo isKindOfClass:[NSDictionary class]]) {
+        return;
     }
+    
+    [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
 }
 
 - (void)handleNSException:(NSDictionary*)userInfo
 {
     NSLog(@"crash============:\n%@", userInfo);
-    if (userInfo) {
-        [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
+    if (!userInfo || ![userInfo isKindOfClass:[NSDictionary class]]) {
+        return;
     }
+    
+    [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
 }
 
 @end
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkAssistant.h b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkAssistant.h
deleted file mode 100644
index 4d5dc61..0000000
--- a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkAssistant.h
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-//  YHNetworkAssistant.h
-//  YH_Analytics
-//
-//  Created by Arthur on 15/3/18.
-//  Copyright (c) 2015年 YOHO. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-#import "AFNetworking.h"
-
-#define kSafeValue(X)                       (!(X) ? [NSNull null] : (X))
-
-static NSString * const YHEAPIErrorDomain = @"YHEAPIErrorDomain";
-/**
- *  Responsible for the task of handling networks
- */
-@interface YHNetworkAssistant : NSObject
-
-#pragma mark - Init
-
-+ (instancetype)sharedInstance;
-
-/**
- *  Initializes your network engine with a hostname
- *
- *  @param hostName The host name
- *
- *  @return
- */
-- (instancetype)initWithHostName:(NSString *)hostName;
-
-/**
- *  Initializes your network engine with a hostname and custom header fields
- *
- *  @param hostName The host name
- *  @param headers  HTTP Header
- *
- *  @return
- */
-- (id)initWithHostName:(NSString *)hostName customHeaderFields:(NSDictionary *)headers;
-
-/**
- *  Initializes your network engine with a hostname, api path and custom header fields
- *
- *  @param hostName The host name
- *  @param apiPath  You can use this method if your server's API location is not at the root (/)
- *  @param headers  HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
- *
- *  @return
- */
-- (id)initWithHostName:(NSString *)hostName apiPath:(NSString *)apiPath customHeaderFields:(NSDictionary *)headers;
-
-
-#pragma mark - Operation
-/**
- *  Enqueues your operation into the shared queue
- *
- *  @param requestOperation A requestOperation that will be add to the queue
- */
-- (void)enqueueOperation:(AFHTTPRequestOperation *)requestOperation;
-
-/**
- *  Remove your operation out of the shared queue
- *
- *  @param aAperation A requestOperation that will be remove from the queue
- */
-+ (void)removeOperation:(AFHTTPRequestOperation *)aAperation;
-
-/**
- *  Cancel your operation
- *
- *  @param requester 
- */
-+ (void)cancelOperationsFrom:(id)requester;
-
-/**
- *  using the `GET`
- *
- *  @param api        The api string used to create the request URL string
- *  @param parameters The parameters to be encoded according to the client request serializer.
- *  @param requester
- *  @param success    A block object to be executed when the request operation finishes successfully
- *  @param failure    A block object to be executed when the request operation finishes unsuccessfully
- */
-- (void)getWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;
-
-/**
- *  using the `POST`
- *
- *  @param api        The api string used to create the request URL string
- *  @param parameters The parameters to be encoded according to the client request serializer.
- *  @param requester  requester
- *  @param success    A block object to be executed when the request operation finishes successfully
- *  @param failure    A block object to be executed when the request operation finishes unsuccessfully
- */
-- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;
-
-/**
- *  using the `POST`
- *
- *  @param api        The api string used to create the request URL string
- *  @param parameters The parameters to be encoded according to the client request serializer.
- *  @param files      Post files
- *  @param requester  requester
- *  @param success    A block object to be executed when the request operation finishes successfully
- *  @param failure    A block object to be executed when the request operation finishes unsuccessfully
- */
-- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters files:(NSDictionary *)files from:(id)requester success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;
-
-#pragma mark - Network Reachability
-
-/**
- *  Checks current reachable status
- *  This method is a handy helper that you can use to check for network reachability.
- */
-- (BOOL)isReachable;
-
-/**
- *  Check that the network status for wifi
- *
- *  @return
- */
-- (BOOL)isReachableWifi;
-
-/**
- *  The current network reachability status.
- *
- *  @param reachabilityChangedHandler A block object to be executed when the network availability was changed
- */
-- (void)addReachabilityChangedHandler:(void (^)(AFNetworkReachabilityStatus networkStatus))reachabilityChangedHandler;
-@end
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkAssistant.m b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkAssistant.m
deleted file mode 100644
index 2c86d37..0000000
--- a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkAssistant.m
+++ /dev/null
@@ -1,404 +0,0 @@
-//
-//  YHNetworkAssistant.m
-//  YH_Analytics
-//
-//  Created by Arthur on 15/3/18.
-//  Copyright (c) 2015年 YOHO. All rights reserved.
-//
-
-#import "YHNetworkAssistant.h"
-#import "NSString+YHAnalytics.h"
-
-//#define IS_TEST 0
-
-#define kAnalizedURL            @"http://analytics.yhurl.com/"
-
-
-static NSMutableSet     *_allOperations;
-NSMutableArray          *_reachabilityChangedHandlers;
-AFNetworkReachabilityStatus _currentNetworkStatus;
-
-static dispatch_queue_t network_assistant_queue() {
-    static dispatch_queue_t network_assistant_queue;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        network_assistant_queue = dispatch_queue_create("cn.yoho.analytics.network.queue", DISPATCH_QUEUE_SERIAL);
-    });
-    
-    return network_assistant_queue;
-}
-
-@implementation YHNetworkAssistant
-{
-    NSString                    *_hostName;
-    NSString                    *_apiPath;
-    NSMutableDictionary         *_customHeaders;
-}
-
-#pragma mark - Init
-
-+ (instancetype)sharedInstance
-{
-    static YHNetworkAssistant *_sharedInstance;
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        _allOperations = [NSMutableSet new];
-        _reachabilityChangedHandlers = [NSMutableArray array];
-        _sharedInstance = [[YHNetworkAssistant alloc] initWithHostName:kAnalizedURL apiPath:nil customHeaderFields:nil];
-        
-        // 监听网络状态
-        [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
-            NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
-            _currentNetworkStatus = status;
-            
-            for (int i  = 0; i < [_reachabilityChangedHandlers count]; i++) {
-                void(^aHandler)(AFNetworkReachabilityStatus status) = [_reachabilityChangedHandlers objectAtIndex:i];
-                aHandler(status);
-            }
-        }];
-        
-
-        [[AFNetworkReachabilityManager sharedManager] startMonitoring];
-    });
-
-    return _sharedInstance;
-}
-
-
-- (id)init
-{
-    return [self initWithHostName:nil apiPath:nil customHeaderFields:nil];
-}
-
-- (instancetype)initWithHostName:(NSString *)hostName
-{
-    return [self initWithHostName:hostName apiPath:nil customHeaderFields:nil];
-}
-
-- (instancetype)initWithHostName:(NSString *)hostName customHeaderFields:(NSDictionary *)headers
-{
-    return [self initWithHostName:hostName apiPath:nil customHeaderFields:headers];
-}
-
-- (instancetype)initWithHostName:(NSString *)hostName apiPath:(NSString *)apiPath customHeaderFields:(NSDictionary *)headers
-{
-    if ((self = [super init])) {
-        _hostName = hostName;
-        _apiPath = apiPath;
-        
-        if(headers && !headers[@"User-Agent"])
-        {
-            NSMutableDictionary *newHeadersDict = [headers mutableCopy];
-            NSString *userAgentString = [NSString stringWithFormat:@"%@/%@",
-                                         [[NSBundle mainBundle] infoDictionary][(NSString *)kCFBundleNameKey],
-                                         [[NSBundle mainBundle] infoDictionary][(NSString *)kCFBundleVersionKey]];
-            newHeadersDict[@"User-Agent"] = userAgentString;
-            _customHeaders = newHeadersDict;
-        }
-        else
-        {
-            _customHeaders = [headers mutableCopy];
-        }
-        
-        if (!_customHeaders)
-        {
-            _customHeaders = [NSMutableDictionary dictionary];
-        }
-
-    }
-    
-    return self;
-}
-
-#pragma mark - Network Reachability
-- (BOOL)isReachable
-{
-    return  _currentNetworkStatus > AFNetworkReachabilityStatusNotReachable;
-}
-
-- (BOOL)isReachableWifi
-{
-    return _currentNetworkStatus == AFNetworkReachabilityStatusReachableViaWiFi;
-}
-
-- (void)addReachabilityChangedHandler:(void (^)(AFNetworkReachabilityStatus))reachabilityChangedHandler
-{
-    dispatch_sync(network_assistant_queue(), ^{
-        [_reachabilityChangedHandlers addObject:[reachabilityChangedHandler copy]];;
-    });
-}
-#pragma mark - Operation
-
-- (void)enqueueOperation:(AFHTTPRequestOperation *)requestOperation
-{
-    dispatch_sync(network_assistant_queue(), ^{
-        [_allOperations addObject:requestOperation];
-    });
-}
-
-+ (void)removeOperation:(AFHTTPRequestOperation *)aAperation
-{
-    dispatch_sync(network_assistant_queue(), ^{
-        [_allOperations removeObject:aAperation];
-    });
-}
-
-+ (void)cancelOperationsFrom:(id)requester
-{
-    dispatch_sync(network_assistant_queue(), ^{
-        NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
-            if (![evaluatedObject isKindOfClass:[AFHTTPRequestOperation class]]) {
-                return NO;
-            }
-            
-            AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)evaluatedObject;
-            if (operation.identifier == requester) {
-                return YES;
-            }
-            
-            return NO;
-        }];
-        
-        NSSet *operationsToCancel = [_allOperations filteredSetUsingPredicate:predicate];
-        [operationsToCancel enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
-            AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)obj;
-            [operation cancel];
-        }];
-         
-         [_allOperations minusSet:operationsToCancel];
-    });
-}
-
-#pragma mark - `GET`
-
-- (void)getWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
-{
-    
-    NSMutableDictionary *actualParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];
-    
-    /*
-     actualParameters 里可以添加一些公用的参数,如平台等
-     */
-    
-    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
-    
-
-    AFHTTPRequestOperation *reqOperation = [manager GET:[self assemblyURLWhithApi:api] parameters:actualParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
-        if (success) {
-            [self operationSucceeded:operation responseObject:responseObject succeededHandler:success failedHandler:failure];
-        }
-    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
-        NSLog(@"Error :%@", error);
-        [YHNetworkAssistant removeOperation:operation];
-        
-        if (failure) {
-            failure(error);
-        }
-    }];
-    
-    // 标识operation, 并加入处理队列
-    reqOperation.identifier = requester;
-    [self enqueueOperation:reqOperation];
-}
-
-#pragma mark - `POST`
-
-- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
-{
-    [self postWithAPI:api parameters:parameters files:nil from:requester success:success failure:failure];
-}
-
-- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters files:(NSDictionary *)files from:(id)requester success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
-{
-    [self postWithAPI:api parameters:parameters files:files from:requester progressBlock:nil success:success failure:failure];
-}
-
-/**
- *  @param progressBlock 添加处理进度的回调
- */
-- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters files:(NSDictionary *)files from:(id)requester progressBlock:(void(^)(float progress))progressBlock success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
-{
-    NSError *error = nil;
-    NSMutableDictionary *actualParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];
-    
-    /*
-     actualParameters 里可以添加一些公用的参数,如平台,权限信息等
-     */
-    
-    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:actualParameters options:0 error:&error];
-    if (error) {
-        NSLog(@"json parsing, connot convert to json for: %@\n code: %ld\n reason: %@", actualParameters, (long)[error code], [error localizedDescription]);
-        if (failure) {
-            failure(error);
-        }
-        return;
-    }
-    
-    if (![self assemblyURLWhithApi:api]) {
-        if (failure) {
-            failure(error);
-        }
-        return;
-    }
-    
-    NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
-    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
-    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
-    AFHTTPRequestOperation *requestOperation = nil;
-    
-    NSDictionary *pars = @{@"_mlogs": kSafeValue(parsJsonStr)};
-    
-    // 有文件
-    if (files && [files count]) {
-        requestOperation = [manager POST:[self assemblyURLWhithApi:api] parameters:pars constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
-            // 上传文件
-            for (NSString *key in files) {
-                NSURL *filePath = [NSURL fileURLWithPath:files[key]];
-                [formData appendPartWithFileURL:filePath name:key error:nil];
-            }
-        } success:^(AFHTTPRequestOperation *operation, id responseObject) {
-            // 成功回调
-            if (success) {
-                [self operationSucceeded:operation responseObject:responseObject succeededHandler:success failedHandler:failure];
-            }
-        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
-            // 失败回调
-#ifdef IS_TEST
-            
-            NSString *parsJsonStr = [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding];
-            parsJsonStr = [parsJsonStr urlDecodedString];
-            NSLog(@"\nrequest url \n%@\n pars \n%@", operation.request.URL, parsJsonStr);
-            NSLog(@"接口请求出错 Error: %@", error);
-#endif
-            
-            [YHNetworkAssistant removeOperation:operation];
-            
-            if (failure) {
-                failure(error);
-            }
-        }];
-        
-    } else {
-     // 没有文件
-        requestOperation = [manager POST:[self assemblyURLWhithApi:api] parameters:pars success:^(AFHTTPRequestOperation *operation, id responseObject) {
-            if (success) {
-                [self operationSucceeded:operation responseObject:responseObject succeededHandler:success failedHandler:failure];
-            }
-        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
-            
-#ifdef IS_TEST
-            
-            NSString *parsJsonStr = [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding];
-            parsJsonStr = [parsJsonStr urlDecodedString];
-            NSLog(@"\nrequest url \n%@\n pars \n%@", operation.request.URL, parsJsonStr);
-            NSLog(@"接口请求出错 Error: %@", error);
-#endif
-            [YHNetworkAssistant removeOperation:operation];
-            
-            if (failure) {
-                failure(error);
-            }
-        }];
-    }
-    
-    // 设置上传进度的回调
-    [requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
-        if (progressBlock) {
-            CGFloat progress = 0.0f;
-            if (totalBytesExpectedToWrite!=0) {
-                progress = ((CGFloat)totalBytesWritten)/((CGFloat)totalBytesExpectedToWrite);
-            }
-            progressBlock(progress);
-        }
-    }];
-    
-    requestOperation.identifier = requester;
-    [self enqueueOperation:requestOperation];
-}
-
-#pragma mark - 成功请求后统一解析数据
-- (void)operationSucceeded:(AFHTTPRequestOperation *)operation responseObject:(NSDictionary *)responseObject
-          succeededHandler:(void (^)(id responseObject))succeededHandler failedHandler:(void (^)(NSError *error))failedHandler
-{
-    [YHNetworkAssistant removeOperation:operation];
-    
-#ifdef IS_TEST
-    
-    NSString *parsJsonStr = [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding];
-    parsJsonStr = [parsJsonStr urlDecodedString];
-    NSLog(@"\nrequest url \n%@\n pars \n%@", operation.request.URL, parsJsonStr);
-    NSLog(@"Success: %@", responseObject);
-#endif
-    
-    if (![responseObject isKindOfClass:[NSDictionary class]]) {
-        succeededHandler(responseObject);
-        return;
-    }
-    
-    /*
-     此处可以对一些公用的返回字段进行处理,如status, code, message等,需和服务器人员共同制定
-     
-     •••
-     
-     */
-    NSInteger responseStatus = 0;
-    if ([responseObject.allKeys containsObject:@"status"])
-    {
-        responseStatus = [[responseObject objectForKey:@"status"] integerValue];
-    }
-    
-    if (responseStatus != 0 ) {
-        NSInteger responseCode = 0;
-        if ([responseObject.allKeys containsObject:@"code"]) {
-            responseCode = [[responseObject objectForKey:@"code"] integerValue];
-        }
-        NSString *localizedDescription = [responseObject objectForKey:@"message"];
-        
-        NSDictionary* dataDic = [responseObject objectForKey:@"data"];
-        
-        NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:localizedDescription, NSLocalizedDescriptionKey, kSafeValue(dataDic), @"data", nil];
-        NSError *error = [NSError errorWithDomain:YHEAPIErrorDomain code:responseCode userInfo:userInfo];
-        
-        if (failedHandler) {
-            failedHandler(error);
-        }
-    } else {
-        NSDictionary *responseJSON = [responseObject objectForKey:@"data"];
-        
-        if([responseJSON isKindOfClass:[NSArray class]] && 0 == [(NSArray*)responseJSON count]) {
-            responseJSON = nil;
-        }
-        
-        succeededHandler(responseJSON);
-    }
-
-    
-}
-
-
-#pragma mark - Pravite method
-
-- (NSString *)assemblyURLWhithApi:(NSString *)api
-{
-    NSMutableString *apiUrl = [NSMutableString stringWithString:@""];
-    if (_hostName && _hostName.length) {
-        [apiUrl appendFormat:@"%@%@", _hostName, (_apiPath.length) ? @"/" : @""];
-    }
-    
-    if (_apiPath && _apiPath.length) {
-        [apiUrl appendFormat:@"%@%@", _apiPath, (api.length) ? @"/" : @""];
-    }
-    
-    if (api && api.length) {
-        [apiUrl appendFormat:@"%@", api];
-    }
-    
-    if (apiUrl.length < 1 || ![apiUrl hasPrefix:@"http"]) {
-        NSLog(@"ERROR YHENetworkEngine: 接口请求的URL不正确: %@", apiUrl);
-        NSLog(@"调用堆栈 %@", [NSThread callStackSymbols]);
-        return nil;
-    }
-    return apiUrl;
-}
-
-@end
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkService.h b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkService.h
new file mode 100644
index 0000000..656847e
--- /dev/null
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkService.h
@@ -0,0 +1,22 @@
+//
+//  YHNetworkService.h
+//  YH_Analytics
+//
+//  Created by Zhou Rongjun on 15/4/27.
+//  Copyright (c) 2015年 YOHO. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "AFNetworking.h"
+
+typedef void (^YHNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status);
+
+@interface YHNetworkService : NSObject
+
++ (instancetype)sharedInstance;
+
+- (void)setReachabilityStatusChangeBlock:(YHNetworkReachabilityStatusBlock)block;
+
+- (AFHTTPRequestOperation *)uploadLogData:(NSDictionary *)parameters completionBlock:(void (^)(BOOL success, NSError *error))block;
+
+@end
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkService.m b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkService.m
new file mode 100644
index 0000000..95d54bd
--- /dev/null
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/Utils/YHNetworkService.m
@@ -0,0 +1,103 @@
+//
+//  YHNetworkService.m
+//  YH_Analytics
+//
+//  Created by Zhou Rongjun on 15/4/27.
+//  Copyright (c) 2015年 YOHO. All rights reserved.
+//
+
+#import "YHNetworkService.h"
+
+#define kSafeValue(X)                   (!(X) ? [NSNull null] : (X))
+#define kURLAnalyticsService            @"http://analytics.yhurl.com/"
+#define kYASApiMethod                   @"yas_mobile"
+
+@interface YHNetworkService ()
+
+@property (strong, nonatomic) AFHTTPRequestOperationManager *httpClient;
+@property (readwrite, nonatomic, copy) YHNetworkReachabilityStatusBlock networkReachabilityStatusBlock;
+
+@end
+
+@implementation YHNetworkService
+
++ (instancetype)sharedInstance
+{
+    static YHNetworkService *_sharedInstance;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        _sharedInstance = [[YHNetworkService alloc] init];
+    });
+    
+    return _sharedInstance;
+}
+
+- (id)init
+{
+    self = [super init];
+    if (self) {
+        self.httpClient = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:kURLAnalyticsService]];
+        self.httpClient.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
+        self.httpClient.securityPolicy.allowInvalidCertificates = YES;
+        self.httpClient.operationQueue.maxConcurrentOperationCount = 6;
+    }
+    return self;
+}
+
+- (void)dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+    [self.httpClient.reachabilityManager stopMonitoring];
+    self.networkReachabilityStatusBlock = nil;
+    self.httpClient = nil;
+}
+
+- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block
+{
+    self.networkReachabilityStatusBlock = block;
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkReachabilityStatusChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
+    
+    [self.httpClient.reachabilityManager startMonitoring];
+}
+
+- (AFHTTPRequestOperation *)uploadLogData:(NSDictionary *)parameters completionBlock:(void (^)(BOOL success, NSError *error))block
+{
+    NSError *error = nil;
+    NSMutableDictionary *actualParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];
+    
+    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:actualParameters options:0 error:&error];
+    if (error) {
+        NSLog(@"json parsing, connot convert to json for: %@\n code: %ld\n reason: %@", actualParameters, (long)[error code], [error localizedDescription]);
+        
+        if (block) {
+            block(NO, error);
+        }
+        return nil;
+    }
+    
+    NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
+    NSDictionary *newParameters = @{@"_mlogs": kSafeValue(parsJsonStr)};
+    
+    return [self.httpClient POST:kYASApiMethod parameters:newParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
+        
+        if (block) {
+            block(YES, nil);
+        }
+    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
+        if (block) {
+            block(NO, error);
+        }
+    }];
+}
+
+- (void)handleNetworkReachabilityStatusChanged:(NSNotification *)notification
+{
+    AFNetworkReachabilityStatus status = [[notification.userInfo objectForKey:AFNetworkingReachabilityNotificationStatusItem] integerValue];
+    
+    if (self.networkReachabilityStatusBlock) {
+        self.networkReachabilityStatusBlock(status);
+    }
+}
+
+@end
diff --git a/YH_Analytics/YH_Analytics/YH_Analytics/YH_Analytics.h b/YH_Analytics/YH_Analytics/YH_Analytics/YH_Analytics.h
index 205e3bd..ebac661 100644
--- a/YH_Analytics/YH_Analytics/YH_Analytics/YH_Analytics.h
+++ b/YH_Analytics/YH_Analytics/YH_Analytics/YH_Analytics.h
@@ -7,6 +7,7 @@
 //
 
 #import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
 #import "YHError.h"
 #import "YHEvent.h"
 
diff --git a/YH_Analytics/YH_AnalyticsTests/NSString+YHAnalyticsTests.m b/YH_Analytics/YH_AnalyticsTests/NSString+YHAnalyticsTests.m
index 0326ece..26bf799 100644
--- a/YH_Analytics/YH_AnalyticsTests/NSString+YHAnalyticsTests.m
+++ b/YH_Analytics/YH_AnalyticsTests/NSString+YHAnalyticsTests.m
@@ -37,15 +37,21 @@
 
 - (void)testMd5Method {
     NSLog(@"%@ start", self.name);
-    [[mock stub] md5];
+    
+    [[mock expect] md5];
     [mock md5];
+    [mock verify];
+    
     NSLog(@"%@ end", self.name);
 }
 
 - (void)testUrlDecodedStringMethod {
     NSLog(@"%@ start", self.name);
-    [[mock stub] urlDecodedString];
+    
+    [[mock expect] urlDecodedString];
     [mock urlDecodedString];
+    [mock verify];
+    
     NSLog(@"%@ end", self.name);
 }
 
diff --git a/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantLogicTests.m b/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantLogicTests.m
index 48a418a..f629b71 100644
--- a/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantLogicTests.m
+++ b/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantLogicTests.m
@@ -16,6 +16,7 @@
 #import "YHEvent.h"
 #import "YHError.h"
 #import "FakeLocationManager.h"
+#import "YHNetworkService.h"
 
 @interface YHAssemblyAssistant (XCTestCase)
 
@@ -63,7 +64,7 @@
     
     partialMock = OCMPartialMock(assembly);
     
-    networkMock = OCMClassMock([YHNetworkAssistant class]);
+    networkMock = OCMClassMock([YHNetworkService class]);
     OCMStub([networkMock sharedInstance]).andReturn(networkMock);
 }
 
@@ -179,7 +180,7 @@
 - (void)testPrepareImmediUploadDicWithNetworkReachabilityStatus {
     NSLog(@"%@ start", self.name);
     
-    OCMExpect([networkMock addReachabilityChangedHandler:[OCMArg any]]);
+    OCMExpect([networkMock setReachabilityStatusChangeBlock:[OCMArg any]]);
     
     [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
     
@@ -355,7 +356,7 @@
     [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
     YHEvent *data = [YHEvent new];
     data.op = @"testEvent";
-    OCMExpect([networkMock postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]);
+    OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
     
     [assembly uploadImmedilyWithEvent:data];
     
@@ -374,7 +375,7 @@
     
     [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
     YHError *data = [YHError new];
-        OCMExpect([networkMock postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]);
+    OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
     
     [assembly uploadImmedilyWithEvent:data];
     
@@ -416,7 +417,7 @@
     
     NSDictionary *uploadData = [NSDictionary dictionary];
     OCMExpect([partialMock getUploadData]).andReturn(uploadData);
-    OCMExpect([networkMock postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]);
+    OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
     
     [assembly uploadDiskData];
     
@@ -430,7 +431,7 @@
     NSLog(@"%@ start", self.name);
 
     OCMExpect([partialMock getUploadData]).andReturn(nil);
-    [[networkMock reject] postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]];
+    [[networkMock reject] uploadLogData:[OCMArg any] completionBlock:[OCMArg any]];
     
     [assembly uploadDiskData];
     
@@ -495,7 +496,7 @@
     assembly.locationManager.delegate = assembly;
     CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
     
-    [[[partialMock expect] andReturnValue:@YES] updateLocation:newLocation];
+    OCMExpect([partialMock updateLocation:newLocation]).andReturn(YES);
     OCMExpect([partialMock updateImmediUploadDic]);
 
     [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"];
@@ -513,7 +514,7 @@
     assembly.locationManager.delegate = assembly;
     CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
     
-    [[[partialMock expect] andReturnValue:@NO] updateLocation:newLocation];
+    OCMExpect([partialMock updateLocation:newLocation]).andReturn(NO);
     [[partialMock reject] updateImmediUploadDic];
     
     [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"];
diff --git a/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantTests.m b/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantTests.m
index 91f9a58..8fdc869 100644
--- a/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantTests.m
+++ b/YH_Analytics/YH_AnalyticsTests/YHAssemblyAssistantTests.m
@@ -34,7 +34,7 @@
     [super setUp];
     // Put setup code here. This method is called before the invocation of each test method in the class.
     NSLog(@"%@ setUp", self.name);
-    mock = [OCMockObject mockForClass:[YHAssemblyAssistant class]];
+    mock = OCMClassMock([YHAssemblyAssistant class]);
     XCTAssertNotNil(mock, @"Cannot create YHAssemblyAssistant mock");
 }
 
@@ -82,9 +82,13 @@
 - (void)testCanPersistingMethod {
     NSLog(@"%@ start", self.name);
     
-    [[[mock expect] andReturnValue:@YES] canPersisting];
+    OCMExpect([mock canPersisting]).andReturn(YES);
+    
     BOOL bPersisting = [mock canPersisting];
+    
     XCTAssert(bPersisting, @"canPersisting doesn't return YES.");
+    OCMVerifyAll(mock);
+    
     NSLog(@"%@ end", self.name);
 }
 
@@ -92,8 +96,10 @@
     NSLog(@"%@ start", self.name);
     
     YHAnalyItemData *data = [[YHAnalyItemData alloc] init];
+    
     [[mock expect] saveItemData:data];
     [mock saveItemData:data];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -104,6 +110,7 @@
     [[[mock expect] andReturnValue:@10] getAllEventCount];
     NSUInteger count = [mock getAllEventCount];
     XCTAssertEqual(count, 10, @"YHAssemblyAssistant getAllEventCount doesn't return 10.");
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -115,6 +122,7 @@
     [[[mock expect] andReturn:data] getUploadData];
     NSDictionary *returndata = [mock getUploadData];
     XCTAssertEqualObjects(data, returndata, @"YHAssemblyAssistant getUploadData doesn't return a dictionary with key:value.");
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -124,6 +132,7 @@
     
     [[mock expect] prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
     [mock prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -133,6 +142,7 @@
     
     [[mock expect] uploadDiskData];
     [mock uploadDiskData];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -143,6 +153,7 @@
     YHAnalyItemData *data = [[YHAnalyItemData alloc] init];
     [[mock expect] uploadImmedilyWithEvent:data];
     [mock uploadImmedilyWithEvent:data];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
diff --git a/YH_Analytics/YH_AnalyticsTests/YHCrashReporterTests.m b/YH_Analytics/YH_AnalyticsTests/YHCrashReporterTests.m
index 417ccd8..325b35f 100644
--- a/YH_Analytics/YH_AnalyticsTests/YHCrashReporterTests.m
+++ b/YH_Analytics/YH_AnalyticsTests/YHCrashReporterTests.m
@@ -10,10 +10,13 @@
 #import <XCTest/XCTest.h>
 #import "OCMock.h"
 #import "YHCrashReporter.h"
+#import "YH_Analytics.h"
 
 @interface YHCrashReporterTests : XCTestCase{
 @private
-    id mock;
+    YHCrashReporter *crashReporter;
+    id partialMock;
+    id analyticsMock;
 }
 
 @end
@@ -24,19 +27,142 @@
     [super setUp];
     // Put setup code here. This method is called before the invocation of each test method in the class.
     NSLog(@"%@ setUp", self.name);
-    mock = [OCMockObject mockForClass:[YHCrashReporter class]];
-    XCTAssertNotNil(mock, @"Cannot create YHCrashReporter mock");
+    crashReporter = [YHCrashReporter new];
+    partialMock = OCMPartialMock(crashReporter);
+    XCTAssertNotNil(crashReporter, @"Cannot create YHCrashReporter instance");
+    
+    analyticsMock = OCMClassMock([YH_Analytics class]);
+    OCMStub([analyticsMock sharedInstance]).andReturn(analyticsMock);
 }
 
 - (void)tearDown {
     // Put teardown code here. This method is called after the invocation of each test method in the class.
-    mock = nil;
+    partialMock = nil;
+    crashReporter = nil;
+    analyticsMock = nil;
     [super tearDown];
 }
 
-- (void)testExample {
-    // This is an example of a functional test case.
-    XCTAssert(YES, @"Pass");
+#pragma mark - 方法存在性验证
+
+- (void)testCallstackAsArrayMethod {
+    NSLog(@"%@ start", self.name);
+    
+    OCMExpect([partialMock callstackAsArray]);
+    
+    [crashReporter callstackAsArray];
+    
+    OCMVerifyAll(partialMock);
+    
+    NSLog(@"%@ end", self.name);
+}
+
+- (void)testHandleSignalMethod {
+    NSLog(@"%@ start", self.name);
+    
+    OCMExpect([partialMock handleSignal:[OCMArg isKindOfClass:[NSDictionary class]]]);
+    
+    [crashReporter handleSignal:@{@"key" : @"value"}];
+    
+    OCMVerifyAll(partialMock);
+    
+    NSLog(@"%@ end", self.name);
+}
+
+- (void)testHandleNSExceptionMethod {
+    NSLog(@"%@ start", self.name);
+    
+    OCMExpect([partialMock handleNSException:[OCMArg isKindOfClass:[NSDictionary class]]]);
+    
+    [crashReporter handleNSException:@{@"key" : @"value"}];
+    
+    OCMVerifyAll(partialMock);
+    
+    NSLog(@"%@ end", self.name);
+}
+
+#pragma mark - 行为测试
+#pragma mark -
+- (void)testCallstackAsArrayMethodReturnNotNil {
+    NSLog(@"%@ start", self.name);
+    
+    NSLog(@"%@ end", self.name);
+}
+
+#pragma mark -
+- (void)testHandleSignalMethodWithInputNil {
+    NSLog(@"%@ start", self.name);
+    
+    [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
+    
+    [crashReporter handleSignal:nil];
+    
+    [analyticsMock verify];
+    
+    NSLog(@"%@ end", self.name);
+}
+
+- (void)testHandleSignalMethodWithInputInvalid {
+    NSLog(@"%@ start", self.name);
+    
+    [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
+    
+    [crashReporter handleSignal:nil];
+    
+    [analyticsMock verify];
+    
+    NSLog(@"%@ end", self.name);
+}
+
+- (void)testHandleSignalMethodWithInputDictionary {
+    NSLog(@"%@ start", self.name);
+    
+    NSDictionary *userInfo = [NSDictionary dictionary];
+    [[analyticsMock expect] logError:@"CRASH" parameters:@{JsonKeyErrorST : userInfo}];
+    
+    [crashReporter handleSignal:userInfo];
+    
+    [analyticsMock verify];
+    
+    NSLog(@"%@ end", self.name);
+}
+
+#pragma mark -
+- (void)testHandleNSExceptionMethodWithInputNil {
+    NSLog(@"%@ start", self.name);
+    
+    [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
+    
+    [crashReporter handleNSException:nil];
+    
+    [analyticsMock verify];
+    
+    NSLog(@"%@ end", self.name);
+}
+
+- (void)testHandleNSExceptionMethodWithInputInvalid {
+    NSLog(@"%@ start", self.name);
+    
+    [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
+    
+    [crashReporter handleNSException:nil];
+    
+    [analyticsMock verify];
+    
+    NSLog(@"%@ end", self.name);
+}
+
+- (void)testHandleNSExceptionMethodWithInputDictionary {
+    NSLog(@"%@ start", self.name);
+    
+    NSDictionary *userInfo = [NSDictionary dictionary];
+    [[analyticsMock expect] logError:@"CRASH" parameters:@{JsonKeyErrorST : userInfo}];
+    
+    [crashReporter handleNSException:userInfo];
+    
+    [analyticsMock verify];
+    
+    NSLog(@"%@ end", self.name);
 }
 
 @end
diff --git a/YH_Analytics/YH_AnalyticsTests/YHNetworkAssistantTests.m b/YH_Analytics/YH_AnalyticsTests/YHNetworkServiceTests.m
index 2061b7a..decdbc9 100644
--- a/YH_Analytics/YH_AnalyticsTests/YHNetworkAssistantTests.m
+++ b/YH_Analytics/YH_AnalyticsTests/YHNetworkServiceTests.m
@@ -1,21 +1,20 @@
 //
-//  YHNetworkAssistantTests.m
+//  YHNetworkServiceTests.m
 //  YH_Analytics
 //
-//  Created by Zhou Rongjun on 15/4/15.
+//  Created by Zhou Rongjun on 15/4/28.
 //  Copyright (c) 2015年 YOHO. All rights reserved.
 //
 
 #import <UIKit/UIKit.h>
 #import <XCTest/XCTest.h>
-#import "OCMock.h"
-#import "YHNetworkAssistant.h"
+#import "YHNetworkService.h"
 
-@interface YHNetworkAssistantTests : XCTestCase
+@interface YHNetworkServiceTests : XCTestCase
 
 @end
 
-@implementation YHNetworkAssistantTests
+@implementation YHNetworkServiceTests
 
 - (void)setUp {
     [super setUp];
@@ -32,4 +31,11 @@
     XCTAssert(YES, @"Pass");
 }
 
+- (void)testPerformanceExample {
+    // This is an example of a performance test case.
+    [self measureBlock:^{
+        // Put the code you want to measure the time of here.
+    }];
+}
+
 @end
diff --git a/YH_Analytics/YH_AnalyticsTests/YH_AnalyticsTests.m b/YH_Analytics/YH_AnalyticsTests/YH_AnalyticsTests.m
index 31ee488..bbf028c 100644
--- a/YH_Analytics/YH_AnalyticsTests/YH_AnalyticsTests.m
+++ b/YH_Analytics/YH_AnalyticsTests/YH_AnalyticsTests.m
@@ -42,6 +42,7 @@
     
     [[mock expect] startWithAppId:[OCMArg isKindOfClass:[NSString class]]];
     [mock startWithAppId:@"appId"];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -50,7 +51,8 @@
     NSLog(@"%@ start", self.name);
     
     [[mock expect] logEvent:[OCMArg isKindOfClass:[NSString class]] parameters:[OCMArg isKindOfClass:[NSDictionary class]]];
-    [mock logEvent:@"event" parameters:nil];
+    [mock logEvent:@"event" parameters:@{@"key":@"value"}];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -59,7 +61,8 @@
     NSLog(@"%@ start", self.name);
     
     [[mock expect] logError:[OCMArg isKindOfClass:[NSString class]] parameters:[OCMArg isKindOfClass:[NSDictionary class]]];
-    [mock logError:@"error" parameters:nil];
+    [mock logError:@"error" parameters:@{@"key":@"value"}];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -69,6 +72,7 @@
     
     [[mock expect] updateLogStrategy:LogStrategyCustom customInterval:1000];
     [mock updateLogStrategy:LogStrategyCustom customInterval:1000];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -79,6 +83,7 @@
     
     [[mock expect] uid];
     [mock uid];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -88,6 +93,7 @@
     
     [[mock expect] channelId];
     [mock channelId];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -97,6 +103,7 @@
     
     [[mock expect] logStrategy];
     [mock logStrategy];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -106,6 +113,7 @@
     
     [[mock expect] currentInterval];
     [mock currentInterval];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -115,6 +123,7 @@
     
     [[mock expect] event];
     [mock event];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }
@@ -124,6 +133,7 @@
     
     [[mock expect] error];
     [mock error];
+    [mock verify];
     
     NSLog(@"%@ end", self.name);
 }