Authored by 周蓉君

重构NetworkService,提供封装好的网络服务接口。修改相关测试用例。Review by 阿瑟。

@@ -15,9 +15,9 @@ @@ -15,9 +15,9 @@
15 194EDC841A7F52D100421E6C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 194EDC821A7F52D100421E6C /* LaunchScreen.xib */; }; 15 194EDC841A7F52D100421E6C /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 194EDC821A7F52D100421E6C /* LaunchScreen.xib */; };
16 194EDC901A7F52D100421E6C /* YH_AnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */; }; 16 194EDC901A7F52D100421E6C /* YH_AnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */; };
17 194EDC9C1A7F555800421E6C /* YH_Analytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 194EDC9B1A7F555800421E6C /* YH_Analytics.m */; }; 17 194EDC9C1A7F555800421E6C /* YH_Analytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 194EDC9B1A7F555800421E6C /* YH_Analytics.m */; };
  18 + CA5FDA2A1AEE302F00F86398 /* YHNetworkService.m in Sources */ = {isa = PBXBuildFile; fileRef = CA5FDA291AEE302F00F86398 /* YHNetworkService.m */; };
18 CA7AC7831ADE06F300F30791 /* YHCrashReporterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */; }; 19 CA7AC7831ADE06F300F30791 /* YHCrashReporterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */; };
19 CA7AC7851ADE073200F30791 /* NSString+YHAnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */; }; 20 CA7AC7851ADE073200F30791 /* NSString+YHAnalyticsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */; };
20 - CA7AC7871ADE075E00F30791 /* YHNetworkAssistantTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7861ADE075E00F30791 /* YHNetworkAssistantTests.m */; };  
21 CA7AC7891ADE078200F30791 /* YHAssemblyAssistantTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */; }; 21 CA7AC7891ADE078200F30791 /* YHAssemblyAssistantTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */; };
22 CA7AC78B1ADE079800F30791 /* YHNetworkUserAgentTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */; }; 22 CA7AC78B1ADE079800F30791 /* YHNetworkUserAgentTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */; };
23 CA7AC78F1ADE08CA00F30791 /* YHDeviceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC78E1ADE08CA00F30791 /* YHDeviceTests.m */; }; 23 CA7AC78F1ADE08CA00F30791 /* YHDeviceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC78E1ADE08CA00F30791 /* YHDeviceTests.m */; };
@@ -31,6 +31,7 @@ @@ -31,6 +31,7 @@
31 CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */; }; 31 CA7AC7A01ADE0C4F00F30791 /* YHEventFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */; };
32 CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */; }; 32 CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */; };
33 CA7AC7A41ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */; }; 33 CA7AC7A41ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */; };
  34 + CA873DAA1AEF51AE008095A4 /* YHNetworkServiceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA873DA91AEF51AE008095A4 /* YHNetworkServiceTests.m */; };
34 CAA6BD371AE4E857006C3332 /* FakeLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */; }; 35 CAA6BD371AE4E857006C3332 /* FakeLocationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */; };
35 CAA6BD3E1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */; }; 36 CAA6BD3E1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */; };
36 CABC32831AD7CEB8002A4260 /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CABC32821AD7CEB8002A4260 /* libOCMock.a */; }; 37 CABC32831AD7CEB8002A4260 /* libOCMock.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CABC32821AD7CEB8002A4260 /* libOCMock.a */; };
@@ -63,7 +64,6 @@ @@ -63,7 +64,6 @@
63 E7ADAE551AB94EBD00C9DD0B /* YHEventFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE541AB94EBD00C9DD0B /* YHEventFactory.m */; }; 64 E7ADAE551AB94EBD00C9DD0B /* YHEventFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE541AB94EBD00C9DD0B /* YHEventFactory.m */; };
64 E7ADAE581AB94ED400C9DD0B /* YHStatusFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE571AB94ED400C9DD0B /* YHStatusFactory.m */; }; 65 E7ADAE581AB94ED400C9DD0B /* YHStatusFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE571AB94ED400C9DD0B /* YHStatusFactory.m */; };
65 E7ADAE5B1AB95BC800C9DD0B /* YHAssemblyAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */; }; 66 E7ADAE5B1AB95BC800C9DD0B /* YHAssemblyAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */; };
66 - E7ADAE5E1AB95D2800C9DD0B /* YHNetworkAssistant.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE5D1AB95D2800C9DD0B /* YHNetworkAssistant.m */; };  
67 E7B8DE221A81D68600102CC4 /* NSString+YHAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE211A81D68600102CC4 /* NSString+YHAnalytics.m */; }; 67 E7B8DE221A81D68600102CC4 /* NSString+YHAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE211A81D68600102CC4 /* NSString+YHAnalytics.m */; };
68 E7B8DE421A81DCBD00102CC4 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE3A1A81DCBD00102CC4 /* Reachability.m */; }; 68 E7B8DE421A81DCBD00102CC4 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE3A1A81DCBD00102CC4 /* Reachability.m */; };
69 E7B8DE461A81ED8F00102CC4 /* YHNetworkUserAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE451A81ED8F00102CC4 /* YHNetworkUserAgent.m */; }; 69 E7B8DE461A81ED8F00102CC4 /* YHNetworkUserAgent.m in Sources */ = {isa = PBXBuildFile; fileRef = E7B8DE451A81ED8F00102CC4 /* YHNetworkUserAgent.m */; };
@@ -114,9 +114,10 @@ @@ -114,9 +114,10 @@
114 194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsTests.m; sourceTree = "<group>"; }; 114 194EDC8F1A7F52D100421E6C /* YH_AnalyticsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsTests.m; sourceTree = "<group>"; };
115 194EDC9A1A7F555800421E6C /* YH_Analytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YH_Analytics.h; sourceTree = "<group>"; }; 115 194EDC9A1A7F555800421E6C /* YH_Analytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YH_Analytics.h; sourceTree = "<group>"; };
116 194EDC9B1A7F555800421E6C /* YH_Analytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_Analytics.m; sourceTree = "<group>"; }; 116 194EDC9B1A7F555800421E6C /* YH_Analytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_Analytics.m; sourceTree = "<group>"; };
  117 + CA5FDA281AEE302F00F86398 /* YHNetworkService.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHNetworkService.h; sourceTree = "<group>"; };
  118 + CA5FDA291AEE302F00F86398 /* YHNetworkService.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkService.m; sourceTree = "<group>"; };
117 CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHCrashReporterTests.m; sourceTree = "<group>"; }; 119 CA7AC7821ADE06F300F30791 /* YHCrashReporterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHCrashReporterTests.m; sourceTree = "<group>"; };
118 CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+YHAnalyticsTests.m"; sourceTree = "<group>"; }; 120 CA7AC7841ADE073200F30791 /* NSString+YHAnalyticsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+YHAnalyticsTests.m"; sourceTree = "<group>"; };
119 - CA7AC7861ADE075E00F30791 /* YHNetworkAssistantTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkAssistantTests.m; sourceTree = "<group>"; };  
120 CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantTests.m; sourceTree = "<group>"; }; 121 CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantTests.m; sourceTree = "<group>"; };
121 CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkUserAgentTests.m; sourceTree = "<group>"; }; 122 CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkUserAgentTests.m; sourceTree = "<group>"; };
122 CA7AC78E1ADE08CA00F30791 /* YHDeviceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHDeviceTests.m; sourceTree = "<group>"; }; 123 CA7AC78E1ADE08CA00F30791 /* YHDeviceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHDeviceTests.m; sourceTree = "<group>"; };
@@ -130,6 +131,7 @@ @@ -130,6 +131,7 @@
130 CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHEventFactoryTests.m; sourceTree = "<group>"; }; 131 CA7AC79F1ADE0C4F00F30791 /* YHEventFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHEventFactoryTests.m; sourceTree = "<group>"; };
131 CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactoryTests.m; sourceTree = "<group>"; }; 132 CA7AC7A11ADE0C6600F30791 /* YHStatusFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactoryTests.m; sourceTree = "<group>"; };
132 CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsLogicTests.m; sourceTree = "<group>"; }; 133 CA7AC7A31ADF9FCB00F30791 /* YH_AnalyticsLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_AnalyticsLogicTests.m; sourceTree = "<group>"; };
  134 + CA873DA91AEF51AE008095A4 /* YHNetworkServiceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkServiceTests.m; sourceTree = "<group>"; };
133 CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeLocationManager.h; sourceTree = "<group>"; }; 135 CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeLocationManager.h; sourceTree = "<group>"; };
134 CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeLocationManager.m; sourceTree = "<group>"; }; 136 CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeLocationManager.m; sourceTree = "<group>"; };
135 CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantLogicTests.m; sourceTree = "<group>"; }; 137 CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantLogicTests.m; sourceTree = "<group>"; };
@@ -203,8 +205,6 @@ @@ -203,8 +205,6 @@
203 E7ADAE571AB94ED400C9DD0B /* YHStatusFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactory.m; sourceTree = "<group>"; }; 205 E7ADAE571AB94ED400C9DD0B /* YHStatusFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHStatusFactory.m; sourceTree = "<group>"; };
204 E7ADAE591AB95BC800C9DD0B /* YHAssemblyAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHAssemblyAssistant.h; sourceTree = "<group>"; }; 206 E7ADAE591AB95BC800C9DD0B /* YHAssemblyAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHAssemblyAssistant.h; sourceTree = "<group>"; };
205 E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistant.m; sourceTree = "<group>"; }; 207 E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistant.m; sourceTree = "<group>"; };
206 - E7ADAE5C1AB95D2800C9DD0B /* YHNetworkAssistant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHNetworkAssistant.h; sourceTree = "<group>"; };  
207 - E7ADAE5D1AB95D2800C9DD0B /* YHNetworkAssistant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHNetworkAssistant.m; sourceTree = "<group>"; };  
208 E7B8DE201A81D68600102CC4 /* NSString+YHAnalytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+YHAnalytics.h"; sourceTree = "<group>"; }; 208 E7B8DE201A81D68600102CC4 /* NSString+YHAnalytics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+YHAnalytics.h"; sourceTree = "<group>"; };
209 E7B8DE211A81D68600102CC4 /* NSString+YHAnalytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+YHAnalytics.m"; sourceTree = "<group>"; }; 209 E7B8DE211A81D68600102CC4 /* NSString+YHAnalytics.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+YHAnalytics.m"; sourceTree = "<group>"; };
210 E7B8DE391A81DCBD00102CC4 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; }; 210 E7B8DE391A81DCBD00102CC4 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = "<group>"; };
@@ -335,10 +335,10 @@ @@ -335,10 +335,10 @@
335 CA7AC78C1ADE088D00F30791 /* UtilsTest */ = { 335 CA7AC78C1ADE088D00F30791 /* UtilsTest */ = {
336 isa = PBXGroup; 336 isa = PBXGroup;
337 children = ( 337 children = (
338 - CA7AC7861ADE075E00F30791 /* YHNetworkAssistantTests.m */,  
339 CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */, 338 CA7AC7881ADE078200F30791 /* YHAssemblyAssistantTests.m */,
340 CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */, 339 CA7AC78A1ADE079800F30791 /* YHNetworkUserAgentTests.m */,
341 CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */, 340 CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */,
  341 + CA873DA91AEF51AE008095A4 /* YHNetworkServiceTests.m */,
342 ); 342 );
343 name = UtilsTest; 343 name = UtilsTest;
344 sourceTree = "<group>"; 344 sourceTree = "<group>";
@@ -512,8 +512,8 @@ @@ -512,8 +512,8 @@
512 E7B8DE451A81ED8F00102CC4 /* YHNetworkUserAgent.m */, 512 E7B8DE451A81ED8F00102CC4 /* YHNetworkUserAgent.m */,
513 E7ADAE591AB95BC800C9DD0B /* YHAssemblyAssistant.h */, 513 E7ADAE591AB95BC800C9DD0B /* YHAssemblyAssistant.h */,
514 E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */, 514 E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */,
515 - E7ADAE5C1AB95D2800C9DD0B /* YHNetworkAssistant.h */,  
516 - E7ADAE5D1AB95D2800C9DD0B /* YHNetworkAssistant.m */, 515 + CA5FDA281AEE302F00F86398 /* YHNetworkService.h */,
  516 + CA5FDA291AEE302F00F86398 /* YHNetworkService.m */,
517 ); 517 );
518 path = Utils; 518 path = Utils;
519 sourceTree = "<group>"; 519 sourceTree = "<group>";
@@ -651,7 +651,6 @@ @@ -651,7 +651,6 @@
651 buildActionMask = 2147483647; 651 buildActionMask = 2147483647;
652 files = ( 652 files = (
653 E74D45B71ABA7C6300EFE12E /* AFURLConnectionOperation.m in Sources */, 653 E74D45B71ABA7C6300EFE12E /* AFURLConnectionOperation.m in Sources */,
654 - E7ADAE5E1AB95D2800C9DD0B /* YHNetworkAssistant.m in Sources */,  
655 194EDC7C1A7F52D100421E6C /* ViewController.m in Sources */, 654 194EDC7C1A7F52D100421E6C /* ViewController.m in Sources */,
656 E74D45BC1ABA7C6300EFE12E /* UIActivityIndicatorView+AFNetworking.m in Sources */, 655 E74D45BC1ABA7C6300EFE12E /* UIActivityIndicatorView+AFNetworking.m in Sources */,
657 E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */, 656 E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */,
@@ -667,6 +666,7 @@ @@ -667,6 +666,7 @@
667 E7ADAE431AB9479600C9DD0B /* YHDataFactory.m in Sources */, 666 E7ADAE431AB9479600C9DD0B /* YHDataFactory.m in Sources */,
668 E74D45B61ABA7C6300EFE12E /* AFSecurityPolicy.m in Sources */, 667 E74D45B61ABA7C6300EFE12E /* AFSecurityPolicy.m in Sources */,
669 E74D45BA1ABA7C6300EFE12E /* AFURLSessionManager.m in Sources */, 668 E74D45BA1ABA7C6300EFE12E /* AFURLSessionManager.m in Sources */,
  669 + CA5FDA2A1AEE302F00F86398 /* YHNetworkService.m in Sources */,
670 E7ADAE3E1AB946C100C9DD0B /* YHStatus.m in Sources */, 670 E7ADAE3E1AB946C100C9DD0B /* YHStatus.m in Sources */,
671 E74D45BE1ABA7C6300EFE12E /* UIButton+AFNetworking.m in Sources */, 671 E74D45BE1ABA7C6300EFE12E /* UIButton+AFNetworking.m in Sources */,
672 194EDC791A7F52D100421E6C /* AppDelegate.m in Sources */, 672 194EDC791A7F52D100421E6C /* AppDelegate.m in Sources */,
@@ -696,13 +696,13 @@ @@ -696,13 +696,13 @@
696 isa = PBXSourcesBuildPhase; 696 isa = PBXSourcesBuildPhase;
697 buildActionMask = 2147483647; 697 buildActionMask = 2147483647;
698 files = ( 698 files = (
699 - CA7AC7871ADE075E00F30791 /* YHNetworkAssistantTests.m in Sources */,  
700 CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */, 699 CA7AC7A21ADE0C6600F30791 /* YHStatusFactoryTests.m in Sources */,
701 CAA6BD3E1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m in Sources */, 700 CAA6BD3E1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m in Sources */,
702 194EDC901A7F52D100421E6C /* YH_AnalyticsTests.m in Sources */, 701 194EDC901A7F52D100421E6C /* YH_AnalyticsTests.m in Sources */,
703 CA7AC7951ADE090800F30791 /* YHStatusTests.m in Sources */, 702 CA7AC7951ADE090800F30791 /* YHStatusTests.m in Sources */,
704 CA7AC78B1ADE079800F30791 /* YHNetworkUserAgentTests.m in Sources */, 703 CA7AC78B1ADE079800F30791 /* YHNetworkUserAgentTests.m in Sources */,
705 CA7AC7831ADE06F300F30791 /* YHCrashReporterTests.m in Sources */, 704 CA7AC7831ADE06F300F30791 /* YHCrashReporterTests.m in Sources */,
  705 + CA873DAA1AEF51AE008095A4 /* YHNetworkServiceTests.m in Sources */,
706 CA7AC78F1ADE08CA00F30791 /* YHDeviceTests.m in Sources */, 706 CA7AC78F1ADE08CA00F30791 /* YHDeviceTests.m in Sources */,
707 CA7AC7891ADE078200F30791 /* YHAssemblyAssistantTests.m in Sources */, 707 CA7AC7891ADE078200F30791 /* YHAssemblyAssistantTests.m in Sources */,
708 CA7AC7931ADE08F000F30791 /* YHEventTests.m in Sources */, 708 CA7AC7931ADE08F000F30791 /* YHEventTests.m in Sources */,
@@ -14,7 +14,6 @@ @@ -14,7 +14,6 @@
14 #include <sys/socket.h> 14 #include <sys/socket.h>
15 #import <UIKit/UIKit.h> 15 #import <UIKit/UIKit.h>
16 #import <AdSupport/AdSupport.h> 16 #import <AdSupport/AdSupport.h>
17 -//#import "YHNetworkUserAgent.h"  
18 #import "OpenUDID.h" 17 #import "OpenUDID.h"
19 18
20 #import "YHDevice.h" 19 #import "YHDevice.h"
@@ -7,8 +7,6 @@ @@ -7,8 +7,6 @@
7 // 7 //
8 8
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 -#import <CoreLocation/CoreLocation.h>  
11 -#import "YHNetworkAssistant.h"  
12 #import "YHAnalyItemData.h" 10 #import "YHAnalyItemData.h"
13 11
14 12
@@ -31,7 +29,7 @@ extern NSString * const JsonKeyDataTypeErrors; @@ -31,7 +29,7 @@ extern NSString * const JsonKeyDataTypeErrors;
31 用于组装数据 29 用于组装数据
32 */ 30 */
33 31
34 -@interface YHAssemblyAssistant : NSObject <CLLocationManagerDelegate> 32 +@interface YHAssemblyAssistant : NSObject
35 33
36 + (instancetype)sharedInstance; 34 + (instancetype)sharedInstance;
37 35
@@ -6,9 +6,10 @@ @@ -6,9 +6,10 @@
6 // Copyright (c) 2015年 YOHO. All rights reserved. 6 // Copyright (c) 2015年 YOHO. All rights reserved.
7 // 7 //
8 8
  9 +#import <CoreLocation/CoreLocation.h>
9 #import <CoreTelephony/CTCarrier.h> 10 #import <CoreTelephony/CTCarrier.h>
10 #import <CoreTelephony/CTTelephonyNetworkInfo.h> 11 #import <CoreTelephony/CTTelephonyNetworkInfo.h>
11 -#import "Reachability.h" 12 +#import "YHNetworkService.h"
12 #import "YHAssemblyAssistant.h" 13 #import "YHAssemblyAssistant.h"
13 //#import "YHErrorFactory.h" 14 //#import "YHErrorFactory.h"
14 //#import "YHEventFactory.h" 15 //#import "YHEventFactory.h"
@@ -20,6 +21,7 @@ @@ -20,6 +21,7 @@
20 #import "YHDevice.h" 21 #import "YHDevice.h"
21 #import "YHStatus.h" 22 #import "YHStatus.h"
22 23
  24 +
23 #define kPathCaches [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] 25 #define kPathCaches [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]
24 #define kPathLogSystem [kPathCaches stringByAppendingPathComponent:@"YHLogSystem"] 26 #define kPathLogSystem [kPathCaches stringByAppendingPathComponent:@"YHLogSystem"]
25 #define kYASApiMethod @"yas_mobile" 27 #define kYASApiMethod @"yas_mobile"
@@ -46,7 +48,7 @@ static dispatch_queue_t persisting_queue() { @@ -46,7 +48,7 @@ static dispatch_queue_t persisting_queue() {
46 return persisting_queue; 48 return persisting_queue;
47 } 49 }
48 50
49 -@interface YHAssemblyAssistant () 51 +@interface YHAssemblyAssistant () <CLLocationManagerDelegate>
50 52
51 /** 53 /**
52 * 定位服务 54 * 定位服务
@@ -285,10 +287,12 @@ static dispatch_queue_t persisting_queue() { @@ -285,10 +287,12 @@ static dispatch_queue_t persisting_queue() {
285 if (event) { 287 if (event) {
286 [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:event.jsonDictionary, nil] forKey:JsonKeyDataTypeEvents]; 288 [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:event.jsonDictionary, nil] forKey:JsonKeyDataTypeEvents];
287 289
288 - [[YHNetworkAssistant sharedInstance] postWithAPI:kYASApiMethod parameters:self.immediUploadItemDic from:self success:^(id responseObject) {  
289 -  
290 - } failure:^(NSError *error) {  
291 - NSLog(@"error = %@", error.localizedDescription); 290 + [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
  291 + if (success) {
  292 + NSLog(@"upload immedialite data success.");
  293 + } else {
  294 + NSLog(@"error = %@", error.localizedDescription);
  295 + }
292 }]; 296 }];
293 } 297 }
294 } else if(itemData.dataType == YHItemDataTypeError) { 298 } else if(itemData.dataType == YHItemDataTypeError) {
@@ -296,10 +300,12 @@ static dispatch_queue_t persisting_queue() { @@ -296,10 +300,12 @@ static dispatch_queue_t persisting_queue() {
296 if (error) { 300 if (error) {
297 [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:error.jsonDictionary, nil] forKey:JsonKeyDataTypeErrors]; 301 [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:error.jsonDictionary, nil] forKey:JsonKeyDataTypeErrors];
298 302
299 - [[YHNetworkAssistant sharedInstance] postWithAPI:kYASApiMethod parameters:self.immediUploadItemDic from:self success:^(id responseObject) {  
300 -  
301 - } failure:^(NSError *error) {  
302 - NSLog(@"error = %@", error.localizedDescription); 303 + [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
  304 + if (success) {
  305 + NSLog(@"upload immedialite data success.");
  306 + } else {
  307 + NSLog(@"error = %@", error.localizedDescription);
  308 + }
303 }]; 309 }];
304 } 310 }
305 } else { 311 } else {
@@ -317,11 +323,14 @@ static dispatch_queue_t persisting_queue() { @@ -317,11 +323,14 @@ static dispatch_queue_t persisting_queue() {
317 323
318 if (uploadData) { 324 if (uploadData) {
319 325
320 - [[YHNetworkAssistant sharedInstance] postWithAPI:kYASApiMethod parameters:uploadData from:self success:^(id responseObject) {  
321 -  
322 - [self removeLocalFile];  
323 - } failure:^(NSError *error) {  
324 - NSLog(@"error = %@", error.localizedDescription); 326 + [[YHNetworkService sharedInstance] uploadLogData:uploadData completionBlock:^(BOOL success, NSError *error) {
  327 + if (success) {
  328 + NSLog(@"upload immedialite data success.");
  329 + // 删除已发送的本地文件
  330 + [self removeLocalFile];
  331 + } else {
  332 + NSLog(@"error = %@", error.localizedDescription);
  333 + }
325 }]; 334 }];
326 } 335 }
327 } 336 }
@@ -344,11 +353,12 @@ static dispatch_queue_t persisting_queue() { @@ -344,11 +353,12 @@ static dispatch_queue_t persisting_queue() {
344 CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE) 353 CTRadioAccessTechnologyeHRPD - 3G (or 3.5 - eHRPD is to allow migration from CDMA EVDO to LTE)
345 CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above) 354 CTRadioAccessTechnologyLTE - 4G (allowed to be called 4G by the ITU as mentioend above)
346 */ 355 */
347 - [[YHNetworkAssistant sharedInstance] addReachabilityChangedHandler:^(AFNetworkReachabilityStatus networkStatus) { 356 +
  357 + [[YHNetworkService sharedInstance] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
348 NSString *net = kNetWorkStatusUnknow; 358 NSString *net = kNetWorkStatusUnknow;
349 359
350 CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init]; 360 CTTelephonyNetworkInfo *netInfo = [[CTTelephonyNetworkInfo alloc] init];
351 - switch (networkStatus) { 361 + switch (status) {
352 case AFNetworkReachabilityStatusUnknown: 362 case AFNetworkReachabilityStatusUnknown:
353 case AFNetworkReachabilityStatusNotReachable: 363 case AFNetworkReachabilityStatusNotReachable:
354 net = kNetWorkStatusUnknow; 364 net = kNetWorkStatusUnknow;
@@ -382,6 +392,7 @@ static dispatch_queue_t persisting_queue() { @@ -382,6 +392,7 @@ static dispatch_queue_t persisting_queue() {
382 if ([self updateNetWorkStatus:net]) { 392 if ([self updateNetWorkStatus:net]) {
383 [self updateImmediUploadDic]; 393 [self updateImmediUploadDic];
384 } 394 }
  395 +
385 }]; 396 }];
386 } 397 }
387 398
@@ -125,17 +125,21 @@ void uncaughtCrashExceptionHandler(NSException *exception) @@ -125,17 +125,21 @@ void uncaughtCrashExceptionHandler(NSException *exception)
125 - (void)handleSignal:(NSDictionary*)userInfo 125 - (void)handleSignal:(NSDictionary*)userInfo
126 { 126 {
127 NSLog(@"crash============:\n%@", userInfo); 127 NSLog(@"crash============:\n%@", userInfo);
128 - if (userInfo) {  
129 - [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}]; 128 + if (!userInfo || ![userInfo isKindOfClass:[NSDictionary class]]) {
  129 + return;
130 } 130 }
  131 +
  132 + [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
131 } 133 }
132 134
133 - (void)handleNSException:(NSDictionary*)userInfo 135 - (void)handleNSException:(NSDictionary*)userInfo
134 { 136 {
135 NSLog(@"crash============:\n%@", userInfo); 137 NSLog(@"crash============:\n%@", userInfo);
136 - if (userInfo) {  
137 - [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}]; 138 + if (!userInfo || ![userInfo isKindOfClass:[NSDictionary class]]) {
  139 + return;
138 } 140 }
  141 +
  142 + [[YH_Analytics sharedInstance] logError:@"CRASH" parameters:@{ JsonKeyErrorST: userInfo}];
139 } 143 }
140 144
141 @end 145 @end
1 -//  
2 -// YHNetworkAssistant.h  
3 -// YH_Analytics  
4 -//  
5 -// Created by Arthur on 15/3/18.  
6 -// Copyright (c) 2015年 YOHO. All rights reserved.  
7 -//  
8 -  
9 -#import <Foundation/Foundation.h>  
10 -#import "AFNetworking.h"  
11 -  
12 -#define kSafeValue(X) (!(X) ? [NSNull null] : (X))  
13 -  
14 -static NSString * const YHEAPIErrorDomain = @"YHEAPIErrorDomain";  
15 -/**  
16 - * Responsible for the task of handling networks  
17 - */  
18 -@interface YHNetworkAssistant : NSObject  
19 -  
20 -#pragma mark - Init  
21 -  
22 -+ (instancetype)sharedInstance;  
23 -  
24 -/**  
25 - * Initializes your network engine with a hostname  
26 - *  
27 - * @param hostName The host name  
28 - *  
29 - * @return  
30 - */  
31 -- (instancetype)initWithHostName:(NSString *)hostName;  
32 -  
33 -/**  
34 - * Initializes your network engine with a hostname and custom header fields  
35 - *  
36 - * @param hostName The host name  
37 - * @param headers HTTP Header  
38 - *  
39 - * @return  
40 - */  
41 -- (id)initWithHostName:(NSString *)hostName customHeaderFields:(NSDictionary *)headers;  
42 -  
43 -/**  
44 - * Initializes your network engine with a hostname, api path and custom header fields  
45 - *  
46 - * @param hostName The host name  
47 - * @param apiPath You can use this method if your server's API location is not at the root (/)  
48 - * @param headers HTTP Header; see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4  
49 - *  
50 - * @return  
51 - */  
52 -- (id)initWithHostName:(NSString *)hostName apiPath:(NSString *)apiPath customHeaderFields:(NSDictionary *)headers;  
53 -  
54 -  
55 -#pragma mark - Operation  
56 -/**  
57 - * Enqueues your operation into the shared queue  
58 - *  
59 - * @param requestOperation A requestOperation that will be add to the queue  
60 - */  
61 -- (void)enqueueOperation:(AFHTTPRequestOperation *)requestOperation;  
62 -  
63 -/**  
64 - * Remove your operation out of the shared queue  
65 - *  
66 - * @param aAperation A requestOperation that will be remove from the queue  
67 - */  
68 -+ (void)removeOperation:(AFHTTPRequestOperation *)aAperation;  
69 -  
70 -/**  
71 - * Cancel your operation  
72 - *  
73 - * @param requester  
74 - */  
75 -+ (void)cancelOperationsFrom:(id)requester;  
76 -  
77 -/**  
78 - * using the `GET`  
79 - *  
80 - * @param api The api string used to create the request URL string  
81 - * @param parameters The parameters to be encoded according to the client request serializer.  
82 - * @param requester  
83 - * @param success A block object to be executed when the request operation finishes successfully  
84 - * @param failure A block object to be executed when the request operation finishes unsuccessfully  
85 - */  
86 -- (void)getWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;  
87 -  
88 -/**  
89 - * using the `POST`  
90 - *  
91 - * @param api The api string used to create the request URL string  
92 - * @param parameters The parameters to be encoded according to the client request serializer.  
93 - * @param requester requester  
94 - * @param success A block object to be executed when the request operation finishes successfully  
95 - * @param failure A block object to be executed when the request operation finishes unsuccessfully  
96 - */  
97 -- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;  
98 -  
99 -/**  
100 - * using the `POST`  
101 - *  
102 - * @param api The api string used to create the request URL string  
103 - * @param parameters The parameters to be encoded according to the client request serializer.  
104 - * @param files Post files  
105 - * @param requester requester  
106 - * @param success A block object to be executed when the request operation finishes successfully  
107 - * @param failure A block object to be executed when the request operation finishes unsuccessfully  
108 - */  
109 -- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters files:(NSDictionary *)files from:(id)requester success:(void(^)(id responseObject))success failure:(void(^)(NSError *error))failure;  
110 -  
111 -#pragma mark - Network Reachability  
112 -  
113 -/**  
114 - * Checks current reachable status  
115 - * This method is a handy helper that you can use to check for network reachability.  
116 - */  
117 -- (BOOL)isReachable;  
118 -  
119 -/**  
120 - * Check that the network status for wifi  
121 - *  
122 - * @return  
123 - */  
124 -- (BOOL)isReachableWifi;  
125 -  
126 -/**  
127 - * The current network reachability status.  
128 - *  
129 - * @param reachabilityChangedHandler A block object to be executed when the network availability was changed  
130 - */  
131 -- (void)addReachabilityChangedHandler:(void (^)(AFNetworkReachabilityStatus networkStatus))reachabilityChangedHandler;  
132 -@end  
1 -//  
2 -// YHNetworkAssistant.m  
3 -// YH_Analytics  
4 -//  
5 -// Created by Arthur on 15/3/18.  
6 -// Copyright (c) 2015年 YOHO. All rights reserved.  
7 -//  
8 -  
9 -#import "YHNetworkAssistant.h"  
10 -#import "NSString+YHAnalytics.h"  
11 -  
12 -//#define IS_TEST 0  
13 -  
14 -#define kAnalizedURL @"http://analytics.yhurl.com/"  
15 -  
16 -  
17 -static NSMutableSet *_allOperations;  
18 -NSMutableArray *_reachabilityChangedHandlers;  
19 -AFNetworkReachabilityStatus _currentNetworkStatus;  
20 -  
21 -static dispatch_queue_t network_assistant_queue() {  
22 - static dispatch_queue_t network_assistant_queue;  
23 - static dispatch_once_t onceToken;  
24 - dispatch_once(&onceToken, ^{  
25 - network_assistant_queue = dispatch_queue_create("cn.yoho.analytics.network.queue", DISPATCH_QUEUE_SERIAL);  
26 - });  
27 -  
28 - return network_assistant_queue;  
29 -}  
30 -  
31 -@implementation YHNetworkAssistant  
32 -{  
33 - NSString *_hostName;  
34 - NSString *_apiPath;  
35 - NSMutableDictionary *_customHeaders;  
36 -}  
37 -  
38 -#pragma mark - Init  
39 -  
40 -+ (instancetype)sharedInstance  
41 -{  
42 - static YHNetworkAssistant *_sharedInstance;  
43 - static dispatch_once_t onceToken;  
44 - dispatch_once(&onceToken, ^{  
45 - _allOperations = [NSMutableSet new];  
46 - _reachabilityChangedHandlers = [NSMutableArray array];  
47 - _sharedInstance = [[YHNetworkAssistant alloc] initWithHostName:kAnalizedURL apiPath:nil customHeaderFields:nil];  
48 -  
49 - // 监听网络状态  
50 - [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {  
51 - NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));  
52 - _currentNetworkStatus = status;  
53 -  
54 - for (int i = 0; i < [_reachabilityChangedHandlers count]; i++) {  
55 - void(^aHandler)(AFNetworkReachabilityStatus status) = [_reachabilityChangedHandlers objectAtIndex:i];  
56 - aHandler(status);  
57 - }  
58 - }];  
59 -  
60 -  
61 - [[AFNetworkReachabilityManager sharedManager] startMonitoring];  
62 - });  
63 -  
64 - return _sharedInstance;  
65 -}  
66 -  
67 -  
68 -- (id)init  
69 -{  
70 - return [self initWithHostName:nil apiPath:nil customHeaderFields:nil];  
71 -}  
72 -  
73 -- (instancetype)initWithHostName:(NSString *)hostName  
74 -{  
75 - return [self initWithHostName:hostName apiPath:nil customHeaderFields:nil];  
76 -}  
77 -  
78 -- (instancetype)initWithHostName:(NSString *)hostName customHeaderFields:(NSDictionary *)headers  
79 -{  
80 - return [self initWithHostName:hostName apiPath:nil customHeaderFields:headers];  
81 -}  
82 -  
83 -- (instancetype)initWithHostName:(NSString *)hostName apiPath:(NSString *)apiPath customHeaderFields:(NSDictionary *)headers  
84 -{  
85 - if ((self = [super init])) {  
86 - _hostName = hostName;  
87 - _apiPath = apiPath;  
88 -  
89 - if(headers && !headers[@"User-Agent"])  
90 - {  
91 - NSMutableDictionary *newHeadersDict = [headers mutableCopy];  
92 - NSString *userAgentString = [NSString stringWithFormat:@"%@/%@",  
93 - [[NSBundle mainBundle] infoDictionary][(NSString *)kCFBundleNameKey],  
94 - [[NSBundle mainBundle] infoDictionary][(NSString *)kCFBundleVersionKey]];  
95 - newHeadersDict[@"User-Agent"] = userAgentString;  
96 - _customHeaders = newHeadersDict;  
97 - }  
98 - else  
99 - {  
100 - _customHeaders = [headers mutableCopy];  
101 - }  
102 -  
103 - if (!_customHeaders)  
104 - {  
105 - _customHeaders = [NSMutableDictionary dictionary];  
106 - }  
107 -  
108 - }  
109 -  
110 - return self;  
111 -}  
112 -  
113 -#pragma mark - Network Reachability  
114 -- (BOOL)isReachable  
115 -{  
116 - return _currentNetworkStatus > AFNetworkReachabilityStatusNotReachable;  
117 -}  
118 -  
119 -- (BOOL)isReachableWifi  
120 -{  
121 - return _currentNetworkStatus == AFNetworkReachabilityStatusReachableViaWiFi;  
122 -}  
123 -  
124 -- (void)addReachabilityChangedHandler:(void (^)(AFNetworkReachabilityStatus))reachabilityChangedHandler  
125 -{  
126 - dispatch_sync(network_assistant_queue(), ^{  
127 - [_reachabilityChangedHandlers addObject:[reachabilityChangedHandler copy]];;  
128 - });  
129 -}  
130 -#pragma mark - Operation  
131 -  
132 -- (void)enqueueOperation:(AFHTTPRequestOperation *)requestOperation  
133 -{  
134 - dispatch_sync(network_assistant_queue(), ^{  
135 - [_allOperations addObject:requestOperation];  
136 - });  
137 -}  
138 -  
139 -+ (void)removeOperation:(AFHTTPRequestOperation *)aAperation  
140 -{  
141 - dispatch_sync(network_assistant_queue(), ^{  
142 - [_allOperations removeObject:aAperation];  
143 - });  
144 -}  
145 -  
146 -+ (void)cancelOperationsFrom:(id)requester  
147 -{  
148 - dispatch_sync(network_assistant_queue(), ^{  
149 - NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {  
150 - if (![evaluatedObject isKindOfClass:[AFHTTPRequestOperation class]]) {  
151 - return NO;  
152 - }  
153 -  
154 - AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)evaluatedObject;  
155 - if (operation.identifier == requester) {  
156 - return YES;  
157 - }  
158 -  
159 - return NO;  
160 - }];  
161 -  
162 - NSSet *operationsToCancel = [_allOperations filteredSetUsingPredicate:predicate];  
163 - [operationsToCancel enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {  
164 - AFHTTPRequestOperation *operation = (AFHTTPRequestOperation *)obj;  
165 - [operation cancel];  
166 - }];  
167 -  
168 - [_allOperations minusSet:operationsToCancel];  
169 - });  
170 -}  
171 -  
172 -#pragma mark - `GET`  
173 -  
174 -- (void)getWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure  
175 -{  
176 -  
177 - NSMutableDictionary *actualParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];  
178 -  
179 - /*  
180 - actualParameters 里可以添加一些公用的参数,如平台等  
181 - */  
182 -  
183 - AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
184 -  
185 -  
186 - AFHTTPRequestOperation *reqOperation = [manager GET:[self assemblyURLWhithApi:api] parameters:actualParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {  
187 - if (success) {  
188 - [self operationSucceeded:operation responseObject:responseObject succeededHandler:success failedHandler:failure];  
189 - }  
190 - } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
191 - NSLog(@"Error :%@", error);  
192 - [YHNetworkAssistant removeOperation:operation];  
193 -  
194 - if (failure) {  
195 - failure(error);  
196 - }  
197 - }];  
198 -  
199 - // 标识operation, 并加入处理队列  
200 - reqOperation.identifier = requester;  
201 - [self enqueueOperation:reqOperation];  
202 -}  
203 -  
204 -#pragma mark - `POST`  
205 -  
206 -- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters from:(id)requester success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure  
207 -{  
208 - [self postWithAPI:api parameters:parameters files:nil from:requester success:success failure:failure];  
209 -}  
210 -  
211 -- (void)postWithAPI:(NSString *)api parameters:(NSDictionary *)parameters files:(NSDictionary *)files from:(id)requester success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure  
212 -{  
213 - [self postWithAPI:api parameters:parameters files:files from:requester progressBlock:nil success:success failure:failure];  
214 -}  
215 -  
216 -/**  
217 - * @param progressBlock 添加处理进度的回调  
218 - */  
219 -- (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  
220 -{  
221 - NSError *error = nil;  
222 - NSMutableDictionary *actualParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];  
223 -  
224 - /*  
225 - actualParameters 里可以添加一些公用的参数,如平台,权限信息等  
226 - */  
227 -  
228 - NSData *jsonData = [NSJSONSerialization dataWithJSONObject:actualParameters options:0 error:&error];  
229 - if (error) {  
230 - NSLog(@"json parsing, connot convert to json for: %@\n code: %ld\n reason: %@", actualParameters, (long)[error code], [error localizedDescription]);  
231 - if (failure) {  
232 - failure(error);  
233 - }  
234 - return;  
235 - }  
236 -  
237 - if (![self assemblyURLWhithApi:api]) {  
238 - if (failure) {  
239 - failure(error);  
240 - }  
241 - return;  
242 - }  
243 -  
244 - NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];  
245 - AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
246 - manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];  
247 - AFHTTPRequestOperation *requestOperation = nil;  
248 -  
249 - NSDictionary *pars = @{@"_mlogs": kSafeValue(parsJsonStr)};  
250 -  
251 - // 有文件  
252 - if (files && [files count]) {  
253 - requestOperation = [manager POST:[self assemblyURLWhithApi:api] parameters:pars constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {  
254 - // 上传文件  
255 - for (NSString *key in files) {  
256 - NSURL *filePath = [NSURL fileURLWithPath:files[key]];  
257 - [formData appendPartWithFileURL:filePath name:key error:nil];  
258 - }  
259 - } success:^(AFHTTPRequestOperation *operation, id responseObject) {  
260 - // 成功回调  
261 - if (success) {  
262 - [self operationSucceeded:operation responseObject:responseObject succeededHandler:success failedHandler:failure];  
263 - }  
264 - } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
265 - // 失败回调  
266 -#ifdef IS_TEST  
267 -  
268 - NSString *parsJsonStr = [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding];  
269 - parsJsonStr = [parsJsonStr urlDecodedString];  
270 - NSLog(@"\nrequest url \n%@\n pars \n%@", operation.request.URL, parsJsonStr);  
271 - NSLog(@"接口请求出错 Error: %@", error);  
272 -#endif  
273 -  
274 - [YHNetworkAssistant removeOperation:operation];  
275 -  
276 - if (failure) {  
277 - failure(error);  
278 - }  
279 - }];  
280 -  
281 - } else {  
282 - // 没有文件  
283 - requestOperation = [manager POST:[self assemblyURLWhithApi:api] parameters:pars success:^(AFHTTPRequestOperation *operation, id responseObject) {  
284 - if (success) {  
285 - [self operationSucceeded:operation responseObject:responseObject succeededHandler:success failedHandler:failure];  
286 - }  
287 - } failure:^(AFHTTPRequestOperation *operation, NSError *error) {  
288 -  
289 -#ifdef IS_TEST  
290 -  
291 - NSString *parsJsonStr = [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding];  
292 - parsJsonStr = [parsJsonStr urlDecodedString];  
293 - NSLog(@"\nrequest url \n%@\n pars \n%@", operation.request.URL, parsJsonStr);  
294 - NSLog(@"接口请求出错 Error: %@", error);  
295 -#endif  
296 - [YHNetworkAssistant removeOperation:operation];  
297 -  
298 - if (failure) {  
299 - failure(error);  
300 - }  
301 - }];  
302 - }  
303 -  
304 - // 设置上传进度的回调  
305 - [requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {  
306 - if (progressBlock) {  
307 - CGFloat progress = 0.0f;  
308 - if (totalBytesExpectedToWrite!=0) {  
309 - progress = ((CGFloat)totalBytesWritten)/((CGFloat)totalBytesExpectedToWrite);  
310 - }  
311 - progressBlock(progress);  
312 - }  
313 - }];  
314 -  
315 - requestOperation.identifier = requester;  
316 - [self enqueueOperation:requestOperation];  
317 -}  
318 -  
319 -#pragma mark - 成功请求后统一解析数据  
320 -- (void)operationSucceeded:(AFHTTPRequestOperation *)operation responseObject:(NSDictionary *)responseObject  
321 - succeededHandler:(void (^)(id responseObject))succeededHandler failedHandler:(void (^)(NSError *error))failedHandler  
322 -{  
323 - [YHNetworkAssistant removeOperation:operation];  
324 -  
325 -#ifdef IS_TEST  
326 -  
327 - NSString *parsJsonStr = [[NSString alloc] initWithData:operation.request.HTTPBody encoding:NSUTF8StringEncoding];  
328 - parsJsonStr = [parsJsonStr urlDecodedString];  
329 - NSLog(@"\nrequest url \n%@\n pars \n%@", operation.request.URL, parsJsonStr);  
330 - NSLog(@"Success: %@", responseObject);  
331 -#endif  
332 -  
333 - if (![responseObject isKindOfClass:[NSDictionary class]]) {  
334 - succeededHandler(responseObject);  
335 - return;  
336 - }  
337 -  
338 - /*  
339 - 此处可以对一些公用的返回字段进行处理,如status, code, message等,需和服务器人员共同制定  
340 -  
341 - •••  
342 -  
343 - */  
344 - NSInteger responseStatus = 0;  
345 - if ([responseObject.allKeys containsObject:@"status"])  
346 - {  
347 - responseStatus = [[responseObject objectForKey:@"status"] integerValue];  
348 - }  
349 -  
350 - if (responseStatus != 0 ) {  
351 - NSInteger responseCode = 0;  
352 - if ([responseObject.allKeys containsObject:@"code"]) {  
353 - responseCode = [[responseObject objectForKey:@"code"] integerValue];  
354 - }  
355 - NSString *localizedDescription = [responseObject objectForKey:@"message"];  
356 -  
357 - NSDictionary* dataDic = [responseObject objectForKey:@"data"];  
358 -  
359 - NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:localizedDescription, NSLocalizedDescriptionKey, kSafeValue(dataDic), @"data", nil];  
360 - NSError *error = [NSError errorWithDomain:YHEAPIErrorDomain code:responseCode userInfo:userInfo];  
361 -  
362 - if (failedHandler) {  
363 - failedHandler(error);  
364 - }  
365 - } else {  
366 - NSDictionary *responseJSON = [responseObject objectForKey:@"data"];  
367 -  
368 - if([responseJSON isKindOfClass:[NSArray class]] && 0 == [(NSArray*)responseJSON count]) {  
369 - responseJSON = nil;  
370 - }  
371 -  
372 - succeededHandler(responseJSON);  
373 - }  
374 -  
375 -  
376 -}  
377 -  
378 -  
379 -#pragma mark - Pravite method  
380 -  
381 -- (NSString *)assemblyURLWhithApi:(NSString *)api  
382 -{  
383 - NSMutableString *apiUrl = [NSMutableString stringWithString:@""];  
384 - if (_hostName && _hostName.length) {  
385 - [apiUrl appendFormat:@"%@%@", _hostName, (_apiPath.length) ? @"/" : @""];  
386 - }  
387 -  
388 - if (_apiPath && _apiPath.length) {  
389 - [apiUrl appendFormat:@"%@%@", _apiPath, (api.length) ? @"/" : @""];  
390 - }  
391 -  
392 - if (api && api.length) {  
393 - [apiUrl appendFormat:@"%@", api];  
394 - }  
395 -  
396 - if (apiUrl.length < 1 || ![apiUrl hasPrefix:@"http"]) {  
397 - NSLog(@"ERROR YHENetworkEngine: 接口请求的URL不正确: %@", apiUrl);  
398 - NSLog(@"调用堆栈 %@", [NSThread callStackSymbols]);  
399 - return nil;  
400 - }  
401 - return apiUrl;  
402 -}  
403 -  
404 -@end  
  1 +//
  2 +// YHNetworkService.h
  3 +// YH_Analytics
  4 +//
  5 +// Created by Zhou Rongjun on 15/4/27.
  6 +// Copyright (c) 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "AFNetworking.h"
  11 +
  12 +typedef void (^YHNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status);
  13 +
  14 +@interface YHNetworkService : NSObject
  15 +
  16 ++ (instancetype)sharedInstance;
  17 +
  18 +- (void)setReachabilityStatusChangeBlock:(YHNetworkReachabilityStatusBlock)block;
  19 +
  20 +- (AFHTTPRequestOperation *)uploadLogData:(NSDictionary *)parameters completionBlock:(void (^)(BOOL success, NSError *error))block;
  21 +
  22 +@end
  1 +//
  2 +// YHNetworkService.m
  3 +// YH_Analytics
  4 +//
  5 +// Created by Zhou Rongjun on 15/4/27.
  6 +// Copyright (c) 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#import "YHNetworkService.h"
  10 +
  11 +#define kSafeValue(X) (!(X) ? [NSNull null] : (X))
  12 +#define kURLAnalyticsService @"http://analytics.yhurl.com/"
  13 +#define kYASApiMethod @"yas_mobile"
  14 +
  15 +@interface YHNetworkService ()
  16 +
  17 +@property (strong, nonatomic) AFHTTPRequestOperationManager *httpClient;
  18 +@property (readwrite, nonatomic, copy) YHNetworkReachabilityStatusBlock networkReachabilityStatusBlock;
  19 +
  20 +@end
  21 +
  22 +@implementation YHNetworkService
  23 +
  24 ++ (instancetype)sharedInstance
  25 +{
  26 + static YHNetworkService *_sharedInstance;
  27 + static dispatch_once_t onceToken;
  28 + dispatch_once(&onceToken, ^{
  29 + _sharedInstance = [[YHNetworkService alloc] init];
  30 + });
  31 +
  32 + return _sharedInstance;
  33 +}
  34 +
  35 +- (id)init
  36 +{
  37 + self = [super init];
  38 + if (self) {
  39 + self.httpClient = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:kURLAnalyticsService]];
  40 + self.httpClient.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];
  41 + self.httpClient.securityPolicy.allowInvalidCertificates = YES;
  42 + self.httpClient.operationQueue.maxConcurrentOperationCount = 6;
  43 + }
  44 + return self;
  45 +}
  46 +
  47 +- (void)dealloc
  48 +{
  49 + [[NSNotificationCenter defaultCenter] removeObserver:self];
  50 + [self.httpClient.reachabilityManager stopMonitoring];
  51 + self.networkReachabilityStatusBlock = nil;
  52 + self.httpClient = nil;
  53 +}
  54 +
  55 +- (void)setReachabilityStatusChangeBlock:(void (^)(AFNetworkReachabilityStatus status))block
  56 +{
  57 + self.networkReachabilityStatusBlock = block;
  58 +
  59 + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNetworkReachabilityStatusChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil];
  60 +
  61 + [self.httpClient.reachabilityManager startMonitoring];
  62 +}
  63 +
  64 +- (AFHTTPRequestOperation *)uploadLogData:(NSDictionary *)parameters completionBlock:(void (^)(BOOL success, NSError *error))block
  65 +{
  66 + NSError *error = nil;
  67 + NSMutableDictionary *actualParameters = [NSMutableDictionary dictionaryWithDictionary:parameters];
  68 +
  69 + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:actualParameters options:0 error:&error];
  70 + if (error) {
  71 + NSLog(@"json parsing, connot convert to json for: %@\n code: %ld\n reason: %@", actualParameters, (long)[error code], [error localizedDescription]);
  72 +
  73 + if (block) {
  74 + block(NO, error);
  75 + }
  76 + return nil;
  77 + }
  78 +
  79 + NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  80 + NSDictionary *newParameters = @{@"_mlogs": kSafeValue(parsJsonStr)};
  81 +
  82 + return [self.httpClient POST:kYASApiMethod parameters:newParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
  83 +
  84 + if (block) {
  85 + block(YES, nil);
  86 + }
  87 + } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  88 + if (block) {
  89 + block(NO, error);
  90 + }
  91 + }];
  92 +}
  93 +
  94 +- (void)handleNetworkReachabilityStatusChanged:(NSNotification *)notification
  95 +{
  96 + AFNetworkReachabilityStatus status = [[notification.userInfo objectForKey:AFNetworkingReachabilityNotificationStatusItem] integerValue];
  97 +
  98 + if (self.networkReachabilityStatusBlock) {
  99 + self.networkReachabilityStatusBlock(status);
  100 + }
  101 +}
  102 +
  103 +@end
@@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
7 // 7 //
8 8
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
  10 +#import <UIKit/UIKit.h>
10 #import "YHError.h" 11 #import "YHError.h"
11 #import "YHEvent.h" 12 #import "YHEvent.h"
12 13
@@ -37,15 +37,21 @@ @@ -37,15 +37,21 @@
37 37
38 - (void)testMd5Method { 38 - (void)testMd5Method {
39 NSLog(@"%@ start", self.name); 39 NSLog(@"%@ start", self.name);
40 - [[mock stub] md5]; 40 +
  41 + [[mock expect] md5];
41 [mock md5]; 42 [mock md5];
  43 + [mock verify];
  44 +
42 NSLog(@"%@ end", self.name); 45 NSLog(@"%@ end", self.name);
43 } 46 }
44 47
45 - (void)testUrlDecodedStringMethod { 48 - (void)testUrlDecodedStringMethod {
46 NSLog(@"%@ start", self.name); 49 NSLog(@"%@ start", self.name);
47 - [[mock stub] urlDecodedString]; 50 +
  51 + [[mock expect] urlDecodedString];
48 [mock urlDecodedString]; 52 [mock urlDecodedString];
  53 + [mock verify];
  54 +
49 NSLog(@"%@ end", self.name); 55 NSLog(@"%@ end", self.name);
50 } 56 }
51 57
@@ -16,6 +16,7 @@ @@ -16,6 +16,7 @@
16 #import "YHEvent.h" 16 #import "YHEvent.h"
17 #import "YHError.h" 17 #import "YHError.h"
18 #import "FakeLocationManager.h" 18 #import "FakeLocationManager.h"
  19 +#import "YHNetworkService.h"
19 20
20 @interface YHAssemblyAssistant (XCTestCase) 21 @interface YHAssemblyAssistant (XCTestCase)
21 22
@@ -63,7 +64,7 @@ @@ -63,7 +64,7 @@
63 64
64 partialMock = OCMPartialMock(assembly); 65 partialMock = OCMPartialMock(assembly);
65 66
66 - networkMock = OCMClassMock([YHNetworkAssistant class]); 67 + networkMock = OCMClassMock([YHNetworkService class]);
67 OCMStub([networkMock sharedInstance]).andReturn(networkMock); 68 OCMStub([networkMock sharedInstance]).andReturn(networkMock);
68 } 69 }
69 70
@@ -179,7 +180,7 @@ @@ -179,7 +180,7 @@
179 - (void)testPrepareImmediUploadDicWithNetworkReachabilityStatus { 180 - (void)testPrepareImmediUploadDicWithNetworkReachabilityStatus {
180 NSLog(@"%@ start", self.name); 181 NSLog(@"%@ start", self.name);
181 182
182 - OCMExpect([networkMock addReachabilityChangedHandler:[OCMArg any]]); 183 + OCMExpect([networkMock setReachabilityStatusChangeBlock:[OCMArg any]]);
183 184
184 [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 185 [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
185 186
@@ -355,7 +356,7 @@ @@ -355,7 +356,7 @@
355 [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 356 [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
356 YHEvent *data = [YHEvent new]; 357 YHEvent *data = [YHEvent new];
357 data.op = @"testEvent"; 358 data.op = @"testEvent";
358 - OCMExpect([networkMock postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]); 359 + OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
359 360
360 [assembly uploadImmedilyWithEvent:data]; 361 [assembly uploadImmedilyWithEvent:data];
361 362
@@ -374,7 +375,7 @@ @@ -374,7 +375,7 @@
374 375
375 [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 376 [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
376 YHError *data = [YHError new]; 377 YHError *data = [YHError new];
377 - OCMExpect([networkMock postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]); 378 + OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
378 379
379 [assembly uploadImmedilyWithEvent:data]; 380 [assembly uploadImmedilyWithEvent:data];
380 381
@@ -416,7 +417,7 @@ @@ -416,7 +417,7 @@
416 417
417 NSDictionary *uploadData = [NSDictionary dictionary]; 418 NSDictionary *uploadData = [NSDictionary dictionary];
418 OCMExpect([partialMock getUploadData]).andReturn(uploadData); 419 OCMExpect([partialMock getUploadData]).andReturn(uploadData);
419 - OCMExpect([networkMock postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]); 420 + OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
420 421
421 [assembly uploadDiskData]; 422 [assembly uploadDiskData];
422 423
@@ -430,7 +431,7 @@ @@ -430,7 +431,7 @@
430 NSLog(@"%@ start", self.name); 431 NSLog(@"%@ start", self.name);
431 432
432 OCMExpect([partialMock getUploadData]).andReturn(nil); 433 OCMExpect([partialMock getUploadData]).andReturn(nil);
433 - [[networkMock reject] postWithAPI:[OCMArg any] parameters:[OCMArg any] from:assembly success:[OCMArg any] failure:[OCMArg any]]; 434 + [[networkMock reject] uploadLogData:[OCMArg any] completionBlock:[OCMArg any]];
434 435
435 [assembly uploadDiskData]; 436 [assembly uploadDiskData];
436 437
@@ -495,7 +496,7 @@ @@ -495,7 +496,7 @@
495 assembly.locationManager.delegate = assembly; 496 assembly.locationManager.delegate = assembly;
496 CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f]; 497 CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
497 498
498 - [[[partialMock expect] andReturnValue:@YES] updateLocation:newLocation]; 499 + OCMExpect([partialMock updateLocation:newLocation]).andReturn(YES);
499 OCMExpect([partialMock updateImmediUploadDic]); 500 OCMExpect([partialMock updateImmediUploadDic]);
500 501
501 [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"]; 502 [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"];
@@ -513,7 +514,7 @@ @@ -513,7 +514,7 @@
513 assembly.locationManager.delegate = assembly; 514 assembly.locationManager.delegate = assembly;
514 CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f]; 515 CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:20.0f longitude:120.0f];
515 516
516 - [[[partialMock expect] andReturnValue:@NO] updateLocation:newLocation]; 517 + OCMExpect([partialMock updateLocation:newLocation]).andReturn(NO);
517 [[partialMock reject] updateImmediUploadDic]; 518 [[partialMock reject] updateImmediUploadDic];
518 519
519 [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"]; 520 [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"];
@@ -34,7 +34,7 @@ @@ -34,7 +34,7 @@
34 [super setUp]; 34 [super setUp];
35 // Put setup code here. This method is called before the invocation of each test method in the class. 35 // Put setup code here. This method is called before the invocation of each test method in the class.
36 NSLog(@"%@ setUp", self.name); 36 NSLog(@"%@ setUp", self.name);
37 - mock = [OCMockObject mockForClass:[YHAssemblyAssistant class]]; 37 + mock = OCMClassMock([YHAssemblyAssistant class]);
38 XCTAssertNotNil(mock, @"Cannot create YHAssemblyAssistant mock"); 38 XCTAssertNotNil(mock, @"Cannot create YHAssemblyAssistant mock");
39 } 39 }
40 40
@@ -82,9 +82,13 @@ @@ -82,9 +82,13 @@
82 - (void)testCanPersistingMethod { 82 - (void)testCanPersistingMethod {
83 NSLog(@"%@ start", self.name); 83 NSLog(@"%@ start", self.name);
84 84
85 - [[[mock expect] andReturnValue:@YES] canPersisting]; 85 + OCMExpect([mock canPersisting]).andReturn(YES);
  86 +
86 BOOL bPersisting = [mock canPersisting]; 87 BOOL bPersisting = [mock canPersisting];
  88 +
87 XCTAssert(bPersisting, @"canPersisting doesn't return YES."); 89 XCTAssert(bPersisting, @"canPersisting doesn't return YES.");
  90 + OCMVerifyAll(mock);
  91 +
88 NSLog(@"%@ end", self.name); 92 NSLog(@"%@ end", self.name);
89 } 93 }
90 94
@@ -92,8 +96,10 @@ @@ -92,8 +96,10 @@
92 NSLog(@"%@ start", self.name); 96 NSLog(@"%@ start", self.name);
93 97
94 YHAnalyItemData *data = [[YHAnalyItemData alloc] init]; 98 YHAnalyItemData *data = [[YHAnalyItemData alloc] init];
  99 +
95 [[mock expect] saveItemData:data]; 100 [[mock expect] saveItemData:data];
96 [mock saveItemData:data]; 101 [mock saveItemData:data];
  102 + [mock verify];
97 103
98 NSLog(@"%@ end", self.name); 104 NSLog(@"%@ end", self.name);
99 } 105 }
@@ -104,6 +110,7 @@ @@ -104,6 +110,7 @@
104 [[[mock expect] andReturnValue:@10] getAllEventCount]; 110 [[[mock expect] andReturnValue:@10] getAllEventCount];
105 NSUInteger count = [mock getAllEventCount]; 111 NSUInteger count = [mock getAllEventCount];
106 XCTAssertEqual(count, 10, @"YHAssemblyAssistant getAllEventCount doesn't return 10."); 112 XCTAssertEqual(count, 10, @"YHAssemblyAssistant getAllEventCount doesn't return 10.");
  113 + [mock verify];
107 114
108 NSLog(@"%@ end", self.name); 115 NSLog(@"%@ end", self.name);
109 } 116 }
@@ -115,6 +122,7 @@ @@ -115,6 +122,7 @@
115 [[[mock expect] andReturn:data] getUploadData]; 122 [[[mock expect] andReturn:data] getUploadData];
116 NSDictionary *returndata = [mock getUploadData]; 123 NSDictionary *returndata = [mock getUploadData];
117 XCTAssertEqualObjects(data, returndata, @"YHAssemblyAssistant getUploadData doesn't return a dictionary with key:value."); 124 XCTAssertEqualObjects(data, returndata, @"YHAssemblyAssistant getUploadData doesn't return a dictionary with key:value.");
  125 + [mock verify];
118 126
119 NSLog(@"%@ end", self.name); 127 NSLog(@"%@ end", self.name);
120 } 128 }
@@ -124,6 +132,7 @@ @@ -124,6 +132,7 @@
124 132
125 [[mock expect] prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 133 [[mock expect] prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
126 [mock prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 134 [mock prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
  135 + [mock verify];
127 136
128 NSLog(@"%@ end", self.name); 137 NSLog(@"%@ end", self.name);
129 } 138 }
@@ -133,6 +142,7 @@ @@ -133,6 +142,7 @@
133 142
134 [[mock expect] uploadDiskData]; 143 [[mock expect] uploadDiskData];
135 [mock uploadDiskData]; 144 [mock uploadDiskData];
  145 + [mock verify];
136 146
137 NSLog(@"%@ end", self.name); 147 NSLog(@"%@ end", self.name);
138 } 148 }
@@ -143,6 +153,7 @@ @@ -143,6 +153,7 @@
143 YHAnalyItemData *data = [[YHAnalyItemData alloc] init]; 153 YHAnalyItemData *data = [[YHAnalyItemData alloc] init];
144 [[mock expect] uploadImmedilyWithEvent:data]; 154 [[mock expect] uploadImmedilyWithEvent:data];
145 [mock uploadImmedilyWithEvent:data]; 155 [mock uploadImmedilyWithEvent:data];
  156 + [mock verify];
146 157
147 NSLog(@"%@ end", self.name); 158 NSLog(@"%@ end", self.name);
148 } 159 }
@@ -10,10 +10,13 @@ @@ -10,10 +10,13 @@
10 #import <XCTest/XCTest.h> 10 #import <XCTest/XCTest.h>
11 #import "OCMock.h" 11 #import "OCMock.h"
12 #import "YHCrashReporter.h" 12 #import "YHCrashReporter.h"
  13 +#import "YH_Analytics.h"
13 14
14 @interface YHCrashReporterTests : XCTestCase{ 15 @interface YHCrashReporterTests : XCTestCase{
15 @private 16 @private
16 - id mock; 17 + YHCrashReporter *crashReporter;
  18 + id partialMock;
  19 + id analyticsMock;
17 } 20 }
18 21
19 @end 22 @end
@@ -24,19 +27,142 @@ @@ -24,19 +27,142 @@
24 [super setUp]; 27 [super setUp];
25 // Put setup code here. This method is called before the invocation of each test method in the class. 28 // Put setup code here. This method is called before the invocation of each test method in the class.
26 NSLog(@"%@ setUp", self.name); 29 NSLog(@"%@ setUp", self.name);
27 - mock = [OCMockObject mockForClass:[YHCrashReporter class]];  
28 - XCTAssertNotNil(mock, @"Cannot create YHCrashReporter mock"); 30 + crashReporter = [YHCrashReporter new];
  31 + partialMock = OCMPartialMock(crashReporter);
  32 + XCTAssertNotNil(crashReporter, @"Cannot create YHCrashReporter instance");
  33 +
  34 + analyticsMock = OCMClassMock([YH_Analytics class]);
  35 + OCMStub([analyticsMock sharedInstance]).andReturn(analyticsMock);
29 } 36 }
30 37
31 - (void)tearDown { 38 - (void)tearDown {
32 // Put teardown code here. This method is called after the invocation of each test method in the class. 39 // Put teardown code here. This method is called after the invocation of each test method in the class.
33 - mock = nil; 40 + partialMock = nil;
  41 + crashReporter = nil;
  42 + analyticsMock = nil;
34 [super tearDown]; 43 [super tearDown];
35 } 44 }
36 45
37 -- (void)testExample {  
38 - // This is an example of a functional test case.  
39 - XCTAssert(YES, @"Pass"); 46 +#pragma mark - 方法存在性验证
  47 +
  48 +- (void)testCallstackAsArrayMethod {
  49 + NSLog(@"%@ start", self.name);
  50 +
  51 + OCMExpect([partialMock callstackAsArray]);
  52 +
  53 + [crashReporter callstackAsArray];
  54 +
  55 + OCMVerifyAll(partialMock);
  56 +
  57 + NSLog(@"%@ end", self.name);
  58 +}
  59 +
  60 +- (void)testHandleSignalMethod {
  61 + NSLog(@"%@ start", self.name);
  62 +
  63 + OCMExpect([partialMock handleSignal:[OCMArg isKindOfClass:[NSDictionary class]]]);
  64 +
  65 + [crashReporter handleSignal:@{@"key" : @"value"}];
  66 +
  67 + OCMVerifyAll(partialMock);
  68 +
  69 + NSLog(@"%@ end", self.name);
  70 +}
  71 +
  72 +- (void)testHandleNSExceptionMethod {
  73 + NSLog(@"%@ start", self.name);
  74 +
  75 + OCMExpect([partialMock handleNSException:[OCMArg isKindOfClass:[NSDictionary class]]]);
  76 +
  77 + [crashReporter handleNSException:@{@"key" : @"value"}];
  78 +
  79 + OCMVerifyAll(partialMock);
  80 +
  81 + NSLog(@"%@ end", self.name);
  82 +}
  83 +
  84 +#pragma mark - 行为测试
  85 +#pragma mark -
  86 +- (void)testCallstackAsArrayMethodReturnNotNil {
  87 + NSLog(@"%@ start", self.name);
  88 +
  89 + NSLog(@"%@ end", self.name);
  90 +}
  91 +
  92 +#pragma mark -
  93 +- (void)testHandleSignalMethodWithInputNil {
  94 + NSLog(@"%@ start", self.name);
  95 +
  96 + [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
  97 +
  98 + [crashReporter handleSignal:nil];
  99 +
  100 + [analyticsMock verify];
  101 +
  102 + NSLog(@"%@ end", self.name);
  103 +}
  104 +
  105 +- (void)testHandleSignalMethodWithInputInvalid {
  106 + NSLog(@"%@ start", self.name);
  107 +
  108 + [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
  109 +
  110 + [crashReporter handleSignal:nil];
  111 +
  112 + [analyticsMock verify];
  113 +
  114 + NSLog(@"%@ end", self.name);
  115 +}
  116 +
  117 +- (void)testHandleSignalMethodWithInputDictionary {
  118 + NSLog(@"%@ start", self.name);
  119 +
  120 + NSDictionary *userInfo = [NSDictionary dictionary];
  121 + [[analyticsMock expect] logError:@"CRASH" parameters:@{JsonKeyErrorST : userInfo}];
  122 +
  123 + [crashReporter handleSignal:userInfo];
  124 +
  125 + [analyticsMock verify];
  126 +
  127 + NSLog(@"%@ end", self.name);
  128 +}
  129 +
  130 +#pragma mark -
  131 +- (void)testHandleNSExceptionMethodWithInputNil {
  132 + NSLog(@"%@ start", self.name);
  133 +
  134 + [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
  135 +
  136 + [crashReporter handleNSException:nil];
  137 +
  138 + [analyticsMock verify];
  139 +
  140 + NSLog(@"%@ end", self.name);
  141 +}
  142 +
  143 +- (void)testHandleNSExceptionMethodWithInputInvalid {
  144 + NSLog(@"%@ start", self.name);
  145 +
  146 + [[analyticsMock reject] logError:[OCMArg any] parameters:[OCMArg any]];
  147 +
  148 + [crashReporter handleNSException:nil];
  149 +
  150 + [analyticsMock verify];
  151 +
  152 + NSLog(@"%@ end", self.name);
  153 +}
  154 +
  155 +- (void)testHandleNSExceptionMethodWithInputDictionary {
  156 + NSLog(@"%@ start", self.name);
  157 +
  158 + NSDictionary *userInfo = [NSDictionary dictionary];
  159 + [[analyticsMock expect] logError:@"CRASH" parameters:@{JsonKeyErrorST : userInfo}];
  160 +
  161 + [crashReporter handleNSException:userInfo];
  162 +
  163 + [analyticsMock verify];
  164 +
  165 + NSLog(@"%@ end", self.name);
40 } 166 }
41 167
42 @end 168 @end
1 // 1 //
2 -// YHNetworkAssistantTests.m 2 +// YHNetworkServiceTests.m
3 // YH_Analytics 3 // YH_Analytics
4 // 4 //
5 -// Created by Zhou Rongjun on 15/4/15. 5 +// Created by Zhou Rongjun on 15/4/28.
6 // Copyright (c) 2015年 YOHO. All rights reserved. 6 // Copyright (c) 2015年 YOHO. All rights reserved.
7 // 7 //
8 8
9 #import <UIKit/UIKit.h> 9 #import <UIKit/UIKit.h>
10 #import <XCTest/XCTest.h> 10 #import <XCTest/XCTest.h>
11 -#import "OCMock.h"  
12 -#import "YHNetworkAssistant.h" 11 +#import "YHNetworkService.h"
13 12
14 -@interface YHNetworkAssistantTests : XCTestCase 13 +@interface YHNetworkServiceTests : XCTestCase
15 14
16 @end 15 @end
17 16
18 -@implementation YHNetworkAssistantTests 17 +@implementation YHNetworkServiceTests
19 18
20 - (void)setUp { 19 - (void)setUp {
21 [super setUp]; 20 [super setUp];
@@ -32,4 +31,11 @@ @@ -32,4 +31,11 @@
32 XCTAssert(YES, @"Pass"); 31 XCTAssert(YES, @"Pass");
33 } 32 }
34 33
  34 +- (void)testPerformanceExample {
  35 + // This is an example of a performance test case.
  36 + [self measureBlock:^{
  37 + // Put the code you want to measure the time of here.
  38 + }];
  39 +}
  40 +
35 @end 41 @end
@@ -42,6 +42,7 @@ @@ -42,6 +42,7 @@
42 42
43 [[mock expect] startWithAppId:[OCMArg isKindOfClass:[NSString class]]]; 43 [[mock expect] startWithAppId:[OCMArg isKindOfClass:[NSString class]]];
44 [mock startWithAppId:@"appId"]; 44 [mock startWithAppId:@"appId"];
  45 + [mock verify];
45 46
46 NSLog(@"%@ end", self.name); 47 NSLog(@"%@ end", self.name);
47 } 48 }
@@ -50,7 +51,8 @@ @@ -50,7 +51,8 @@
50 NSLog(@"%@ start", self.name); 51 NSLog(@"%@ start", self.name);
51 52
52 [[mock expect] logEvent:[OCMArg isKindOfClass:[NSString class]] parameters:[OCMArg isKindOfClass:[NSDictionary class]]]; 53 [[mock expect] logEvent:[OCMArg isKindOfClass:[NSString class]] parameters:[OCMArg isKindOfClass:[NSDictionary class]]];
53 - [mock logEvent:@"event" parameters:nil]; 54 + [mock logEvent:@"event" parameters:@{@"key":@"value"}];
  55 + [mock verify];
54 56
55 NSLog(@"%@ end", self.name); 57 NSLog(@"%@ end", self.name);
56 } 58 }
@@ -59,7 +61,8 @@ @@ -59,7 +61,8 @@
59 NSLog(@"%@ start", self.name); 61 NSLog(@"%@ start", self.name);
60 62
61 [[mock expect] logError:[OCMArg isKindOfClass:[NSString class]] parameters:[OCMArg isKindOfClass:[NSDictionary class]]]; 63 [[mock expect] logError:[OCMArg isKindOfClass:[NSString class]] parameters:[OCMArg isKindOfClass:[NSDictionary class]]];
62 - [mock logError:@"error" parameters:nil]; 64 + [mock logError:@"error" parameters:@{@"key":@"value"}];
  65 + [mock verify];
63 66
64 NSLog(@"%@ end", self.name); 67 NSLog(@"%@ end", self.name);
65 } 68 }
@@ -69,6 +72,7 @@ @@ -69,6 +72,7 @@
69 72
70 [[mock expect] updateLogStrategy:LogStrategyCustom customInterval:1000]; 73 [[mock expect] updateLogStrategy:LogStrategyCustom customInterval:1000];
71 [mock updateLogStrategy:LogStrategyCustom customInterval:1000]; 74 [mock updateLogStrategy:LogStrategyCustom customInterval:1000];
  75 + [mock verify];
72 76
73 NSLog(@"%@ end", self.name); 77 NSLog(@"%@ end", self.name);
74 } 78 }
@@ -79,6 +83,7 @@ @@ -79,6 +83,7 @@
79 83
80 [[mock expect] uid]; 84 [[mock expect] uid];
81 [mock uid]; 85 [mock uid];
  86 + [mock verify];
82 87
83 NSLog(@"%@ end", self.name); 88 NSLog(@"%@ end", self.name);
84 } 89 }
@@ -88,6 +93,7 @@ @@ -88,6 +93,7 @@
88 93
89 [[mock expect] channelId]; 94 [[mock expect] channelId];
90 [mock channelId]; 95 [mock channelId];
  96 + [mock verify];
91 97
92 NSLog(@"%@ end", self.name); 98 NSLog(@"%@ end", self.name);
93 } 99 }
@@ -97,6 +103,7 @@ @@ -97,6 +103,7 @@
97 103
98 [[mock expect] logStrategy]; 104 [[mock expect] logStrategy];
99 [mock logStrategy]; 105 [mock logStrategy];
  106 + [mock verify];
100 107
101 NSLog(@"%@ end", self.name); 108 NSLog(@"%@ end", self.name);
102 } 109 }
@@ -106,6 +113,7 @@ @@ -106,6 +113,7 @@
106 113
107 [[mock expect] currentInterval]; 114 [[mock expect] currentInterval];
108 [mock currentInterval]; 115 [mock currentInterval];
  116 + [mock verify];
109 117
110 NSLog(@"%@ end", self.name); 118 NSLog(@"%@ end", self.name);
111 } 119 }
@@ -115,6 +123,7 @@ @@ -115,6 +123,7 @@
115 123
116 [[mock expect] event]; 124 [[mock expect] event];
117 [mock event]; 125 [mock event];
  126 + [mock verify];
118 127
119 NSLog(@"%@ end", self.name); 128 NSLog(@"%@ end", self.name);
120 } 129 }
@@ -124,6 +133,7 @@ @@ -124,6 +133,7 @@
124 133
125 [[mock expect] error]; 134 [[mock expect] error];
126 [mock error]; 135 [mock error];
  136 + [mock verify];
127 137
128 NSLog(@"%@ end", self.name); 138 NSLog(@"%@ end", self.name);
129 } 139 }