重构NetworkService,提供封装好的网络服务接口。修改相关测试用例。Review by 阿瑟。
Showing
16 changed files
with
360 additions
and
598 deletions
@@ -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 |
@@ -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 | } |
-
Please register or login to post a comment