Authored by 王钱钧

Merge branch 'yoho' of http://git.dev.yoho.cn/ios/yh_analytics into yoho

  1 +Pod::Spec.new do |s|
  2 + s.name = "YH_Analytics"
  3 + s.version = "1.0.0"
  4 + s.summary = "Analytics Kit"
  5 + s.description = <<-DESC
  6 + Analytics Kit
  7 + DESC
  8 + s.homepage = ""
  9 + s.license = 'MIT'
  10 + s.author = { "wangqianjun" => "wangqianjun168@163.com" }
  11 + s.source = { :git => "http://git.dev.yoho.cn/ios/yh_analytics.git",
  12 + :branch => 'yoho',
  13 + :tag => s.version.to_s }
  14 +
  15 + s.platform = :ios, '6.0'
  16 + s.requires_arc = true
  17 + s.dependency 'AFNetworking', '~> 2.5.4'
  18 +
  19 + s.source_files = 'YH_Analytics/YH_Analytics/YH_Analytics/*.{h,m}'
  20 + s.prefix_header_contents = '#import "YHAnalyticsMacro.h"'
  21 +
  22 + s.subspec 'Factory' do |ss|
  23 + ss.source_files = 'YH_Analytics/YH_Analytics/YH_Analytics/Factory/*.{h,m}'
  24 + ss.requires_arc = true
  25 + end
  26 +
  27 + s.subspec 'Model' do |ss|
  28 + ss.source_files = 'YH_Analytics/YH_Analytics/YH_Analytics/Model/*.{h,m}'
  29 + ss.requires_arc = true
  30 + end
  31 +
  32 + s.subspec 'Utils' do |ss|
  33 + ss.source_files = 'YH_Analytics/YH_Analytics/YH_Analytics/Utils/*.{h,m}'
  34 + ss.requires_arc = true
  35 + end
  36 +
  37 + s.subspec 'OpenUDID' do |ss|
  38 + ss.source_files = 'YH_Analytics/YH_Analytics/YH_Analytics/YHAnalyticsDependencies/OpenUDID/OpenUDID.{h,m}'
  39 + ss.requires_arc = false
  40 + end
  41 +
  42 + s.subspec 'KeychainStore' do |ss|
  43 + ss.source_files = 'YH_Analytics/YH_Analytics/YH_Analytics/YHAnalyticsDependencies/OpenUDID/YH_KeychainStore.{h,m}'
  44 + ss.requires_arc = true
  45 + end
  46 +
  47 + s.frameworks = 'Foundation', 'CoreGraphics', 'UIKit'
  48 +
  49 +end
@@ -54,6 +54,7 @@ @@ -54,6 +54,7 @@
54 E74D45C11ABA7C6300EFE12E /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D45AF1ABA7C6300EFE12E /* UIRefreshControl+AFNetworking.m */; }; 54 E74D45C11ABA7C6300EFE12E /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D45AF1ABA7C6300EFE12E /* UIRefreshControl+AFNetworking.m */; };
55 E74D45C21ABA7C6300EFE12E /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D45B11ABA7C6300EFE12E /* UIWebView+AFNetworking.m */; }; 55 E74D45C21ABA7C6300EFE12E /* UIWebView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = E74D45B11ABA7C6300EFE12E /* UIWebView+AFNetworking.m */; };
56 E79828121AA6A5120035137C /* YH_KeychainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = E79828101AA6A5120035137C /* YH_KeychainStore.m */; }; 56 E79828121AA6A5120035137C /* YH_KeychainStore.m in Sources */ = {isa = PBXBuildFile; fileRef = E79828101AA6A5120035137C /* YH_KeychainStore.m */; };
  57 + E7A908731BB3C4B000E2EA39 /* YHPerformance.m in Sources */ = {isa = PBXBuildFile; fileRef = E7A908721BB3C4B000E2EA39 /* YHPerformance.m */; };
57 E7ADAE3B1AB946C100C9DD0B /* YHDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE341AB946C100C9DD0B /* YHDevice.m */; }; 58 E7ADAE3B1AB946C100C9DD0B /* YHDevice.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE341AB946C100C9DD0B /* YHDevice.m */; };
58 E7ADAE3C1AB946C100C9DD0B /* YHError.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE361AB946C100C9DD0B /* YHError.m */; }; 59 E7ADAE3C1AB946C100C9DD0B /* YHError.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE361AB946C100C9DD0B /* YHError.m */; };
59 E7ADAE3D1AB946C100C9DD0B /* YHEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE381AB946C100C9DD0B /* YHEvent.m */; }; 60 E7ADAE3D1AB946C100C9DD0B /* YHEvent.m in Sources */ = {isa = PBXBuildFile; fileRef = E7ADAE381AB946C100C9DD0B /* YHEvent.m */; };
@@ -73,6 +74,7 @@ @@ -73,6 +74,7 @@
73 E7B8DE571A8343D200102CC4 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7B8DE561A8343D200102CC4 /* CoreLocation.framework */; }; 74 E7B8DE571A8343D200102CC4 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7B8DE561A8343D200102CC4 /* CoreLocation.framework */; };
74 E7B8DE5E1A836F8700102CC4 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7B8DE5D1A836F8700102CC4 /* CoreTelephony.framework */; }; 75 E7B8DE5E1A836F8700102CC4 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7B8DE5D1A836F8700102CC4 /* CoreTelephony.framework */; };
75 E7B8DE621A838EC200102CC4 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7B8DE611A838EC200102CC4 /* AdSupport.framework */; }; 76 E7B8DE621A838EC200102CC4 /* AdSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E7B8DE611A838EC200102CC4 /* AdSupport.framework */; };
  77 + E7E3A1871BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = E7E3A1861BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.m */; };
76 /* End PBXBuildFile section */ 78 /* End PBXBuildFile section */
77 79
78 /* Begin PBXContainerItemProxy section */ 80 /* Begin PBXContainerItemProxy section */
@@ -136,6 +138,7 @@ @@ -136,6 +138,7 @@
136 CA873DAC1AEF7107008095A4 /* YH_Analytics-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "YH_Analytics-Prefix.pch"; sourceTree = "<group>"; }; 138 CA873DAC1AEF7107008095A4 /* YH_Analytics-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "YH_Analytics-Prefix.pch"; sourceTree = "<group>"; };
137 CA873DAD1AF08880008095A4 /* YH_AnalyticsTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "YH_AnalyticsTests-Prefix.pch"; sourceTree = "<group>"; }; 139 CA873DAD1AF08880008095A4 /* YH_AnalyticsTests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "YH_AnalyticsTests-Prefix.pch"; sourceTree = "<group>"; };
138 CA873DAE1AF0A4F4008095A4 /* ViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewControllerTests.m; sourceTree = "<group>"; }; 140 CA873DAE1AF0A4F4008095A4 /* ViewControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ViewControllerTests.m; sourceTree = "<group>"; };
  141 + CA94D9C21B9D729E00662AED /* YH_Analytics_Evevt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YH_Analytics_Evevt.h; sourceTree = "<group>"; };
139 CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeLocationManager.h; sourceTree = "<group>"; }; 142 CAA6BD351AE4E857006C3332 /* FakeLocationManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FakeLocationManager.h; sourceTree = "<group>"; };
140 CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeLocationManager.m; sourceTree = "<group>"; }; 143 CAA6BD361AE4E857006C3332 /* FakeLocationManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FakeLocationManager.m; sourceTree = "<group>"; };
141 CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantLogicTests.m; sourceTree = "<group>"; }; 144 CAA6BD3D1AE79ECC006C3332 /* YHAssemblyAssistantLogicTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHAssemblyAssistantLogicTests.m; sourceTree = "<group>"; };
@@ -187,6 +190,8 @@ @@ -187,6 +190,8 @@
187 E74D45B11ABA7C6300EFE12E /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+AFNetworking.m"; sourceTree = "<group>"; }; 190 E74D45B11ABA7C6300EFE12E /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIWebView+AFNetworking.m"; sourceTree = "<group>"; };
188 E798280F1AA6A5120035137C /* YH_KeychainStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YH_KeychainStore.h; sourceTree = "<group>"; }; 191 E798280F1AA6A5120035137C /* YH_KeychainStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YH_KeychainStore.h; sourceTree = "<group>"; };
189 E79828101AA6A5120035137C /* YH_KeychainStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_KeychainStore.m; sourceTree = "<group>"; }; 192 E79828101AA6A5120035137C /* YH_KeychainStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YH_KeychainStore.m; sourceTree = "<group>"; };
  193 + E7A908711BB3C4B000E2EA39 /* YHPerformance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHPerformance.h; sourceTree = "<group>"; };
  194 + E7A908721BB3C4B000E2EA39 /* YHPerformance.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHPerformance.m; sourceTree = "<group>"; };
190 E7ADAE331AB946C100C9DD0B /* YHDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHDevice.h; sourceTree = "<group>"; }; 195 E7ADAE331AB946C100C9DD0B /* YHDevice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHDevice.h; sourceTree = "<group>"; };
191 E7ADAE341AB946C100C9DD0B /* YHDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHDevice.m; sourceTree = "<group>"; }; 196 E7ADAE341AB946C100C9DD0B /* YHDevice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = YHDevice.m; sourceTree = "<group>"; };
192 E7ADAE351AB946C100C9DD0B /* YHError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHError.h; sourceTree = "<group>"; }; 197 E7ADAE351AB946C100C9DD0B /* YHError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = YHError.h; sourceTree = "<group>"; };
@@ -222,6 +227,8 @@ @@ -222,6 +227,8 @@
222 E7B8DE5A1A83551300102CC4 /* YH_Analytics.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = YH_Analytics.entitlements; sourceTree = "<group>"; }; 227 E7B8DE5A1A83551300102CC4 /* YH_Analytics.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = YH_Analytics.entitlements; sourceTree = "<group>"; };
223 E7B8DE5D1A836F8700102CC4 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; 228 E7B8DE5D1A836F8700102CC4 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
224 E7B8DE611A838EC200102CC4 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; }; 229 E7B8DE611A838EC200102CC4 /* AdSupport.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AdSupport.framework; path = System/Library/Frameworks/AdSupport.framework; sourceTree = SDKROOT; };
  230 + E7E3A1851BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AFHTTPRequestOperationManager+YHPriorityRequest.h"; sourceTree = "<group>"; };
  231 + E7E3A1861BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "AFHTTPRequestOperationManager+YHPriorityRequest.m"; sourceTree = "<group>"; };
225 /* End PBXFileReference section */ 232 /* End PBXFileReference section */
226 233
227 /* Begin PBXFrameworksBuildPhase section */ 234 /* Begin PBXFrameworksBuildPhase section */
@@ -328,6 +335,7 @@ @@ -328,6 +335,7 @@
328 194EDC9A1A7F555800421E6C /* YH_Analytics.h */, 335 194EDC9A1A7F555800421E6C /* YH_Analytics.h */,
329 194EDC9B1A7F555800421E6C /* YH_Analytics.m */, 336 194EDC9B1A7F555800421E6C /* YH_Analytics.m */,
330 CA873DAB1AEF7059008095A4 /* YHAnalyticsMacro.h */, 337 CA873DAB1AEF7059008095A4 /* YHAnalyticsMacro.h */,
  338 + CA94D9C21B9D729E00662AED /* YH_Analytics_Evevt.h */,
331 ); 339 );
332 path = YH_Analytics; 340 path = YH_Analytics;
333 sourceTree = "<group>"; 341 sourceTree = "<group>";
@@ -465,6 +473,8 @@ @@ -465,6 +473,8 @@
465 E7ADAE381AB946C100C9DD0B /* YHEvent.m */, 473 E7ADAE381AB946C100C9DD0B /* YHEvent.m */,
466 E7ADAE391AB946C100C9DD0B /* YHStatus.h */, 474 E7ADAE391AB946C100C9DD0B /* YHStatus.h */,
467 E7ADAE3A1AB946C100C9DD0B /* YHStatus.m */, 475 E7ADAE3A1AB946C100C9DD0B /* YHStatus.m */,
  476 + E7A908711BB3C4B000E2EA39 /* YHPerformance.h */,
  477 + E7A908721BB3C4B000E2EA39 /* YHPerformance.m */,
468 E7ADAE441AB9487A00C9DD0B /* YHAnalyItemData.h */, 478 E7ADAE441AB9487A00C9DD0B /* YHAnalyItemData.h */,
469 E7ADAE451AB9487A00C9DD0B /* YHAnalyItemData.m */, 479 E7ADAE451AB9487A00C9DD0B /* YHAnalyItemData.m */,
470 ); 480 );
@@ -510,6 +520,8 @@ @@ -510,6 +520,8 @@
510 E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */, 520 E7ADAE5A1AB95BC800C9DD0B /* YHAssemblyAssistant.m */,
511 CA5FDA281AEE302F00F86398 /* YHNetworkService.h */, 521 CA5FDA281AEE302F00F86398 /* YHNetworkService.h */,
512 CA5FDA291AEE302F00F86398 /* YHNetworkService.m */, 522 CA5FDA291AEE302F00F86398 /* YHNetworkService.m */,
  523 + E7E3A1851BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.h */,
  524 + E7E3A1861BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.m */,
513 ); 525 );
514 path = Utils; 526 path = Utils;
515 sourceTree = "<group>"; 527 sourceTree = "<group>";
@@ -650,6 +662,7 @@ @@ -650,6 +662,7 @@
650 194EDC7C1A7F52D100421E6C /* ViewController.m in Sources */, 662 194EDC7C1A7F52D100421E6C /* ViewController.m in Sources */,
651 E74D45BC1ABA7C6300EFE12E /* UIActivityIndicatorView+AFNetworking.m in Sources */, 663 E74D45BC1ABA7C6300EFE12E /* UIActivityIndicatorView+AFNetworking.m in Sources */,
652 E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */, 664 E74D45B21ABA7C6300EFE12E /* AFHTTPRequestOperation.m in Sources */,
  665 + E7E3A1871BF098DA006A9266 /* AFHTTPRequestOperationManager+YHPriorityRequest.m in Sources */,
653 E74D45B91ABA7C6300EFE12E /* AFURLResponseSerialization.m in Sources */, 666 E74D45B91ABA7C6300EFE12E /* AFURLResponseSerialization.m in Sources */,
654 E7B8DE221A81D68600102CC4 /* NSString+YHAnalytics.m in Sources */, 667 E7B8DE221A81D68600102CC4 /* NSString+YHAnalytics.m in Sources */,
655 E74D45BF1ABA7C6300EFE12E /* UIImageView+AFNetworking.m in Sources */, 668 E74D45BF1ABA7C6300EFE12E /* UIImageView+AFNetworking.m in Sources */,
@@ -679,6 +692,7 @@ @@ -679,6 +692,7 @@
679 E74D45C11ABA7C6300EFE12E /* UIRefreshControl+AFNetworking.m in Sources */, 692 E74D45C11ABA7C6300EFE12E /* UIRefreshControl+AFNetworking.m in Sources */,
680 E74D45C01ABA7C6300EFE12E /* UIProgressView+AFNetworking.m in Sources */, 693 E74D45C01ABA7C6300EFE12E /* UIProgressView+AFNetworking.m in Sources */,
681 E7ADAE551AB94EBD00C9DD0B /* YHEventFactory.m in Sources */, 694 E7ADAE551AB94EBD00C9DD0B /* YHEventFactory.m in Sources */,
  695 + E7A908731BB3C4B000E2EA39 /* YHPerformance.m in Sources */,
682 E7ADAE3B1AB946C100C9DD0B /* YHDevice.m in Sources */, 696 E7ADAE3B1AB946C100C9DD0B /* YHDevice.m in Sources */,
683 E79828121AA6A5120035137C /* YH_KeychainStore.m in Sources */, 697 E79828121AA6A5120035137C /* YH_KeychainStore.m in Sources */,
684 194EDC761A7F52D100421E6C /* main.m in Sources */, 698 194EDC761A7F52D100421E6C /* main.m in Sources */,
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 -<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6751" systemVersion="14C1510" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc"> 2 +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="9059" systemVersion="14F1021" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="vXZ-lx-hvc">
3 <dependencies> 3 <dependencies>
4 <deployment identifier="iOS"/> 4 <deployment identifier="iOS"/>
5 - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6736"/> 5 + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9049"/>
  6 + <capability name="Constraints to layout margins" minToolsVersion="6.0"/>
6 </dependencies> 7 </dependencies>
7 <scenes> 8 <scenes>
8 <!--View Controller--> 9 <!--View Controller-->
@@ -28,9 +29,6 @@ @@ -28,9 +29,6 @@
28 <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 29 <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
29 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> 30 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
30 </state> 31 </state>
31 - <variation key="heightClass=regular-widthClass=compact" fixedFrame="YES">  
32 - <rect key="frame" x="0.0" y="28" width="400" height="97"/>  
33 - </variation>  
34 <connections> 32 <connections>
35 <action selector="handleEventButtonClick:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="hNG-qX-SI9"/> 33 <action selector="handleEventButtonClick:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="hNG-qX-SI9"/>
36 </connections> 34 </connections>
@@ -46,9 +44,6 @@ @@ -46,9 +44,6 @@
46 <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 44 <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
47 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> 45 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
48 </state> 46 </state>
49 - <variation key="heightClass=regular-widthClass=compact" fixedFrame="YES">  
50 - <rect key="frame" x="0.0" y="133" width="400" height="97"/>  
51 - </variation>  
52 <connections> 47 <connections>
53 <action selector="handleErrorButtonClick:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="PaQ-1X-itQ"/> 48 <action selector="handleErrorButtonClick:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="PaQ-1X-itQ"/>
54 </connections> 49 </connections>
@@ -64,9 +59,6 @@ @@ -64,9 +59,6 @@
64 <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 59 <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
65 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/> 60 <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
66 </state> 61 </state>
67 - <variation key="heightClass=regular-widthClass=compact" fixedFrame="YES">  
68 - <rect key="frame" x="0.0" y="239" width="400" height="97"/>  
69 - </variation>  
70 <connections> 62 <connections>
71 <action selector="handleCrashButtonClick:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="Q2b-me-dmG"/> 63 <action selector="handleCrashButtonClick:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="Q2b-me-dmG"/>
72 </connections> 64 </connections>
@@ -85,20 +77,59 @@ @@ -85,20 +77,59 @@
85 <action selector="handleSegmentClick:" destination="vXZ-lx-hvc" eventType="valueChanged" id="Obq-Ox-kiH"/> 77 <action selector="handleSegmentClick:" destination="vXZ-lx-hvc" eventType="valueChanged" id="Obq-Ox-kiH"/>
86 </connections> 78 </connections>
87 </segmentedControl> 79 </segmentedControl>
  80 + <button opaque="NO" contentMode="scaleToFill" ambiguous="YES" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Smy-DE-Wff">
  81 + <rect key="frame" x="10" y="355" width="580" height="100"/>
  82 + <color key="backgroundColor" red="1" green="0.69311940380000003" blue="0.023097386689999999" alpha="1" colorSpace="calibratedRGB"/>
  83 + <constraints>
  84 + <constraint firstAttribute="height" constant="97" id="KbW-bi-5og"/>
  85 + <constraint firstAttribute="height" constant="100" id="SWs-iK-Vnv"/>
  86 + <constraint firstAttribute="height" constant="97" id="YaS-EM-5j8"/>
  87 + </constraints>
  88 + <fontDescription key="fontDescription" type="boldSystem" pointSize="34"/>
  89 + <state key="normal" title="Performance">
  90 + <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
  91 + <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
  92 + </state>
  93 + <variation key="default">
  94 + <mask key="constraints">
  95 + <exclude reference="KbW-bi-5og"/>
  96 + <exclude reference="SWs-iK-Vnv"/>
  97 + <exclude reference="YaS-EM-5j8"/>
  98 + </mask>
  99 + </variation>
  100 + <variation key="heightClass=regular-widthClass=compact">
  101 + <mask key="constraints">
  102 + <include reference="KbW-bi-5og"/>
  103 + <exclude reference="YaS-EM-5j8"/>
  104 + </mask>
  105 + </variation>
  106 + <connections>
  107 + <action selector="performanceAction:" destination="vXZ-lx-hvc" eventType="touchUpInside" id="gyJ-sy-Ryz"/>
  108 + </connections>
  109 + </button>
88 </subviews> 110 </subviews>
89 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 111 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
90 <constraints> 112 <constraints>
91 <constraint firstItem="bwP-V2-lOZ" firstAttribute="top" secondItem="gW0-dg-TMX" secondAttribute="bottom" constant="8" id="1aJ-tt-QeY"/> 113 <constraint firstItem="bwP-V2-lOZ" firstAttribute="top" secondItem="gW0-dg-TMX" secondAttribute="bottom" constant="8" id="1aJ-tt-QeY"/>
  114 + <constraint firstItem="Smy-DE-Wff" firstAttribute="top" secondItem="ewb-Ni-v83" secondAttribute="bottom" constant="11" id="3uc-kf-bEL"/>
92 <constraint firstItem="gW0-dg-TMX" firstAttribute="top" secondItem="jyV-Pf-zRb" secondAttribute="bottom" id="4N3-W1-Guz"/> 115 <constraint firstItem="gW0-dg-TMX" firstAttribute="top" secondItem="jyV-Pf-zRb" secondAttribute="bottom" id="4N3-W1-Guz"/>
93 <constraint firstAttribute="trailing" secondItem="gW0-dg-TMX" secondAttribute="trailing" constant="10" id="9Nj-U5-cTm"/> 116 <constraint firstAttribute="trailing" secondItem="gW0-dg-TMX" secondAttribute="trailing" constant="10" id="9Nj-U5-cTm"/>
94 <constraint firstItem="ewb-Ni-v83" firstAttribute="top" secondItem="bwP-V2-lOZ" secondAttribute="bottom" constant="10" id="9f1-iX-d2x"/> 117 <constraint firstItem="ewb-Ni-v83" firstAttribute="top" secondItem="bwP-V2-lOZ" secondAttribute="bottom" constant="10" id="9f1-iX-d2x"/>
95 <constraint firstItem="bwP-V2-lOZ" firstAttribute="top" secondItem="gW0-dg-TMX" secondAttribute="bottom" constant="10" id="CIg-AA-tZq"/> 118 <constraint firstItem="bwP-V2-lOZ" firstAttribute="top" secondItem="gW0-dg-TMX" secondAttribute="bottom" constant="10" id="CIg-AA-tZq"/>
  119 + <constraint firstItem="Smy-DE-Wff" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" id="G9Z-IZ-UsM"/>
96 <constraint firstAttribute="trailing" secondItem="ewb-Ni-v83" secondAttribute="trailing" constant="10" id="OJg-v6-WQP"/> 120 <constraint firstAttribute="trailing" secondItem="ewb-Ni-v83" secondAttribute="trailing" constant="10" id="OJg-v6-WQP"/>
97 <constraint firstItem="ewb-Ni-v83" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" constant="10" id="Pfw-gK-Ojb"/> 121 <constraint firstItem="ewb-Ni-v83" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" constant="10" id="Pfw-gK-Ojb"/>
98 <constraint firstItem="ewb-Ni-v83" firstAttribute="top" secondItem="bwP-V2-lOZ" secondAttribute="bottom" constant="8" id="Rtg-70-QXv"/> 122 <constraint firstItem="ewb-Ni-v83" firstAttribute="top" secondItem="bwP-V2-lOZ" secondAttribute="bottom" constant="8" id="Rtg-70-QXv"/>
  123 + <constraint firstAttribute="trailingMargin" secondItem="Smy-DE-Wff" secondAttribute="trailing" constant="-6" id="Tuk-VN-7pL"/>
99 <constraint firstAttribute="centerX" secondItem="nAu-Ws-BbT" secondAttribute="centerX" id="abS-HB-PCF"/> 124 <constraint firstAttribute="centerX" secondItem="nAu-Ws-BbT" secondAttribute="centerX" id="abS-HB-PCF"/>
  125 + <constraint firstItem="Smy-DE-Wff" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" constant="-6" id="c01-MH-mXG"/>
  126 + <constraint firstItem="Smy-DE-Wff" firstAttribute="top" secondItem="ewb-Ni-v83" secondAttribute="bottom" constant="11" id="eXk-n2-qoV"/>
100 <constraint firstItem="bwP-V2-lOZ" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" constant="10" id="ear-Q6-Cvo"/> 127 <constraint firstItem="bwP-V2-lOZ" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" constant="10" id="ear-Q6-Cvo"/>
101 <constraint firstItem="ewb-Ni-v83" firstAttribute="top" secondItem="bwP-V2-lOZ" secondAttribute="bottom" constant="10" id="en3-RB-i3r"/> 128 <constraint firstItem="ewb-Ni-v83" firstAttribute="top" secondItem="bwP-V2-lOZ" secondAttribute="bottom" constant="10" id="en3-RB-i3r"/>
  129 + <constraint firstAttribute="trailingMargin" secondItem="Smy-DE-Wff" secondAttribute="trailing" constant="-16" id="kfh-8s-TT3"/>
  130 + <constraint firstItem="Smy-DE-Wff" firstAttribute="top" secondItem="ewb-Ni-v83" secondAttribute="bottom" constant="15" id="pmS-TD-itq"/>
  131 + <constraint firstItem="Smy-DE-Wff" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leadingMargin" id="saZ-je-WLV"/>
  132 + <constraint firstAttribute="trailingMargin" secondItem="Smy-DE-Wff" secondAttribute="trailing" constant="-6" id="soi-L7-3pD"/>
102 <constraint firstAttribute="trailing" secondItem="bwP-V2-lOZ" secondAttribute="trailing" constant="10" id="tK7-Cs-ypv"/> 133 <constraint firstAttribute="trailing" secondItem="bwP-V2-lOZ" secondAttribute="trailing" constant="10" id="tK7-Cs-ypv"/>
103 <constraint firstItem="bwP-V2-lOZ" firstAttribute="top" secondItem="gW0-dg-TMX" secondAttribute="bottom" constant="10" id="tgA-RV-Qfw"/> 134 <constraint firstItem="bwP-V2-lOZ" firstAttribute="top" secondItem="gW0-dg-TMX" secondAttribute="bottom" constant="10" id="tgA-RV-Qfw"/>
104 <constraint firstItem="2fi-mo-0CV" firstAttribute="top" secondItem="nAu-Ws-BbT" secondAttribute="bottom" constant="45" id="u0B-Yk-3Eh"/> 135 <constraint firstItem="2fi-mo-0CV" firstAttribute="top" secondItem="nAu-Ws-BbT" secondAttribute="bottom" constant="45" id="u0B-Yk-3Eh"/>
@@ -110,6 +141,25 @@ @@ -110,6 +141,25 @@
110 <exclude reference="tgA-RV-Qfw"/> 141 <exclude reference="tgA-RV-Qfw"/>
111 <exclude reference="9f1-iX-d2x"/> 142 <exclude reference="9f1-iX-d2x"/>
112 <exclude reference="Rtg-70-QXv"/> 143 <exclude reference="Rtg-70-QXv"/>
  144 + <exclude reference="3uc-kf-bEL"/>
  145 + <exclude reference="G9Z-IZ-UsM"/>
  146 + <exclude reference="Tuk-VN-7pL"/>
  147 + <exclude reference="c01-MH-mXG"/>
  148 + <exclude reference="eXk-n2-qoV"/>
  149 + <exclude reference="kfh-8s-TT3"/>
  150 + <exclude reference="pmS-TD-itq"/>
  151 + <exclude reference="saZ-je-WLV"/>
  152 + <exclude reference="soi-L7-3pD"/>
  153 + </mask>
  154 + </variation>
  155 + <variation key="heightClass=regular-widthClass=compact">
  156 + <mask key="constraints">
  157 + <exclude reference="3uc-kf-bEL"/>
  158 + <exclude reference="G9Z-IZ-UsM"/>
  159 + <include reference="c01-MH-mXG"/>
  160 + <include reference="eXk-n2-qoV"/>
  161 + <exclude reference="kfh-8s-TT3"/>
  162 + <include reference="soi-L7-3pD"/>
113 </mask> 163 </mask>
114 </variation> 164 </variation>
115 </view> 165 </view>
@@ -123,7 +173,7 @@ @@ -123,7 +173,7 @@
123 </viewController> 173 </viewController>
124 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/> 174 <placeholder placeholderIdentifier="IBFirstResponder" id="x5A-6p-PRh" sceneMemberID="firstResponder"/>
125 </objects> 175 </objects>
126 - <point key="canvasLocation" x="-290" y="235"/> 176 + <point key="canvasLocation" x="-291" y="234.75"/>
127 </scene> 177 </scene>
128 </scenes> 178 </scenes>
129 </document> 179 </document>
@@ -38,5 +38,22 @@ @@ -38,5 +38,22 @@
38 <array> 38 <array>
39 <string>UIInterfaceOrientationPortrait</string> 39 <string>UIInterfaceOrientationPortrait</string>
40 </array> 40 </array>
  41 + <key>NSAppTransportSecurity</key>
  42 + <dict>
  43 + <key>NSAllowsArbitraryLoads</key>
  44 + <true/>
  45 + <key>NSExceptionDomains</key>
  46 + <dict>
  47 + <key>alipay.com</key>
  48 + <dict>
  49 + <key>NSIncludesSubdomains</key>
  50 + <true/>
  51 + <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
  52 + <true/>
  53 + <key>NSTemporaryExceptionMinimumTLSVersion</key>
  54 + <string>TLSv1.1</string>
  55 + </dict>
  56 + </dict>
  57 + </dict>
41 </dict> 58 </dict>
42 </plist> 59 </plist>
@@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
11 #import "YH_Analytics.h" 11 #import "YH_Analytics.h"
12 12
13 @interface ViewController () 13 @interface ViewController ()
  14 +- (IBAction)performanceAction:(id)sender;
14 15
15 @end 16 @end
16 17
@@ -80,4 +81,16 @@ @@ -80,4 +81,16 @@
80 [[YH_Analytics sharedInstance] updateLogStrategy:strategy customInterval:interval]; 81 [[YH_Analytics sharedInstance] updateLogStrategy:strategy customInterval:interval];
81 } 82 }
82 83
  84 +- (IBAction)performanceAction:(id)sender {
  85 +
  86 + for (int i = 0; i<101; i++) {
  87 + [[YH_Analytics sharedInstance]logPerformanceWithType:kPerformanceTypeImageLoad parameters:@{
  88 + @"index":@(i),
  89 + JsonKeyPerformanceTag:@"YH_TAGS",
  90 + JsonKeyPerformanceURL:@"http://ad.yoho.cn/yohobuy/img/home/02.jpg",
  91 + JsonKeyPerformanceEvt:JsonKeyPerformanceEvtBegin
  92 + }];
  93 + }
  94 +
  95 +}
83 @end 96 @end
@@ -15,7 +15,8 @@ typedef NS_ENUM(NSUInteger, YHItemDataType) { @@ -15,7 +15,8 @@ typedef NS_ENUM(NSUInteger, YHItemDataType) {
15 YHItemDataTypeEvent, // 普通事件 15 YHItemDataTypeEvent, // 普通事件
16 YHItemDataTypeError, // 错误 16 YHItemDataTypeError, // 错误
17 YHItemDataTypeDevice, 17 YHItemDataTypeDevice,
18 - YHItemDataTypeStatus 18 + YHItemDataTypeStatus,
  19 + YHItemDataTypePerformance
19 }; 20 };
20 @interface YHAnalyItemData : NSObject 21 @interface YHAnalyItemData : NSObject
21 22
@@ -12,9 +12,9 @@ @@ -12,9 +12,9 @@
12 @interface YHDevice : YHAnalyItemData 12 @interface YHDevice : YHAnalyItemData
13 13
14 @property (copy, nonatomic) NSString *ak; // App key 业务 14 @property (copy, nonatomic) NSString *ak; // App key 业务
  15 +@property (copy, nonatomic) NSString *ch; // 推广渠道号
15 16
16 @property (copy, nonatomic, readonly) NSString *sv; // 采集数据sdk的版本 17 @property (copy, nonatomic, readonly) NSString *sv; // 采集数据sdk的版本
17 -@property (copy, nonatomic, readonly) NSString *ch; // 推广渠道号  
18 @property (copy, nonatomic, readonly) NSString *os; // 操作系统 18 @property (copy, nonatomic, readonly) NSString *os; // 操作系统
19 @property (copy, nonatomic, readonly) NSString *osv; // 操作系统版本 19 @property (copy, nonatomic, readonly) NSString *osv; // 操作系统版本
20 @property (copy, nonatomic, readonly) NSString *dm; // 设备型号 20 @property (copy, nonatomic, readonly) NSString *dm; // 设备型号
@@ -21,7 +21,6 @@ @@ -21,7 +21,6 @@
21 @interface YHDevice () 21 @interface YHDevice ()
22 22
23 @property (copy, nonatomic) NSString *sv; // 采集数据sdk的版本 23 @property (copy, nonatomic) NSString *sv; // 采集数据sdk的版本
24 -@property (copy, nonatomic) NSString *ch; // 推广渠道号  
25 @property (copy, nonatomic) NSString *os; // 操作系统 24 @property (copy, nonatomic) NSString *os; // 操作系统
26 @property (copy, nonatomic) NSString *osv; // 操作系统版本 25 @property (copy, nonatomic) NSString *osv; // 操作系统版本
27 @property (copy, nonatomic) NSString *dm; // 设备型号 26 @property (copy, nonatomic) NSString *dm; // 设备型号
  1 +//
  2 +// YHEvent.h
  3 +// YH_Analytics
  4 +//
  5 +// Created by 王钱钧 on 15/2/4.
  6 +// Copyright (c) 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "YHAnalyItemData.h"
  11 +
  12 +
  13 +@interface YHPerformance : YHAnalyItemData
  14 +
  15 +@property (copy, nonatomic) NSString *uid; // 用户id
  16 +@property (copy, nonatomic) NSString *sid; // 会话id(由设备标识和启动时间戳md5)
  17 +@property (copy, nonatomic) NSString *ts; // 时间戳
  18 +@property (copy, nonatomic) NSString *type; // 统计类型, IMG_LOAD,API_CALL,WEBVIEW_LOAD
  19 +@property (copy, nonatomic) NSString *net; // 网络
  20 +@property (copy, nonatomic) NSDictionary *param; // 操作参数
  21 +
  22 +
  23 +@end
  1 +//
  2 +// YHEvent.m
  3 +// YH_Analytics
  4 +//
  5 +// Created by 王钱钧 on 15/2/4.
  6 +// Copyright (c) 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#import "YHPerformance.h"
  10 +
  11 +@implementation YHPerformance
  12 +
  13 +- (id)init
  14 +{
  15 + self = [super initWithDataType:YHItemDataTypePerformance];
  16 + if (self) {
  17 +
  18 + }
  19 +
  20 + return self;
  21 +}
  22 +
  23 +- (NSDictionary *)jsonDictionary
  24 +{
  25 + return @{JsonKeyPerformanceUID : self.uid ? self.uid : @"",
  26 + JsonKeyPerformanceTS : self.ts ? self.ts : @"",
  27 + JsonKeyPerformanceSID : self.sid ? self.sid : @"",
  28 + JsonKeyPerformanceTYPE : self.type ? self.type : @"",
  29 + JsonKeyPerformancePARAM : self.param ? self.param : @"",
  30 + JsonKeyPerformanceEvtNet : self.net ? self.net : @""
  31 +// JsonKeyEventINDEX : self.index ? self.index : @""
  32 + };
  33 +}
  34 +
  35 +@end
  1 +//
  2 +// AFHTTPRequestOperationManager+YHPriorityRequest.h
  3 +// YH_Analytics
  4 +//
  5 +// Created by 王钱钧 on 15/11/9.
  6 +// Copyright © 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#import "AFHTTPRequestOperationManager.h"
  10 +
  11 +@interface AFHTTPRequestOperationManager (YHPriorityRequest)
  12 +
  13 +- (AFHTTPRequestOperation *)POST:(NSString *)URLString
  14 + priority:(NSOperationQueuePriority)queuePriority
  15 + parameters:(id)parameters
  16 + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
  17 + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
  18 +@end
  1 +//
  2 +// AFHTTPRequestOperationManager+YHPriorityRequest.m
  3 +// YH_Analytics
  4 +//
  5 +// Created by 王钱钧 on 15/11/9.
  6 +// Copyright © 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#import "AFHTTPRequestOperationManager+YHPriorityRequest.h"
  10 +
  11 +@implementation AFHTTPRequestOperationManager (YHPriorityRequest)
  12 +- (AFHTTPRequestOperation *)POST:(NSString *)URLString
  13 + priority:(NSOperationQueuePriority)queuePriority
  14 + parameters:(id)parameters
  15 + success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
  16 + failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
  17 +{
  18 + NSError *serializationError = nil;
  19 + NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
  20 + if (serializationError) {
  21 + if (failure) {
  22 +#pragma clang diagnostic push
  23 +#pragma clang diagnostic ignored "-Wgnu"
  24 + dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
  25 + failure(nil, serializationError);
  26 + });
  27 +#pragma clang diagnostic pop
  28 + }
  29 +
  30 + return nil;
  31 + }
  32 +
  33 + AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
  34 + [operation setQueuePriority:queuePriority]; // 设置请求优先级为最低
  35 + [self.operationQueue addOperation:operation];
  36 +
  37 + return operation;
  38 +}
  39 +
  40 +@end
@@ -10,9 +10,9 @@ @@ -10,9 +10,9 @@
10 #import "YHAnalyItemData.h" 10 #import "YHAnalyItemData.h"
11 11
12 /* 12 /*
13 - 用于组装数据 13 + 用于组装数据
14 */ 14 */
15 - 15 +@class YHPerformance;
16 @interface YHAssemblyAssistant : NSObject 16 @interface YHAssemblyAssistant : NSObject
17 17
18 + (instancetype)sharedInstance; 18 + (instancetype)sharedInstance;
@@ -21,14 +21,18 @@ @@ -21,14 +21,18 @@
21 21
22 - (void)saveItemData:(YHAnalyItemData *)itemData; 22 - (void)saveItemData:(YHAnalyItemData *)itemData;
23 23
  24 +- (void)savePerformanceData:(YHPerformance *)perf;
  25 +
24 - (NSUInteger)getAllEventCount; 26 - (NSUInteger)getAllEventCount;
25 27
26 - (NSDictionary *)getUploadData; 28 - (NSDictionary *)getUploadData;
27 29
28 -- (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId; 30 +- (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId channelId:(NSString *)channelId;
29 31
30 - (void)uploadDiskData; 32 - (void)uploadDiskData;
31 33
32 - (void)uploadImmedilyWithEvent:(YHAnalyItemData *)itemData; 34 - (void)uploadImmedilyWithEvent:(YHAnalyItemData *)itemData;
33 35
  36 +- (void)uploadFirstLaunchApp;
  37 +
34 @end 38 @end
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
19 #import "YHError.h" 19 #import "YHError.h"
20 #import "YHDevice.h" 20 #import "YHDevice.h"
21 #import "YHStatus.h" 21 #import "YHStatus.h"
  22 +#import "YHPerformance.h"
22 23
23 static dispatch_queue_t persisting_queue() { 24 static dispatch_queue_t persisting_queue() {
24 static dispatch_queue_t persisting_queue; 25 static dispatch_queue_t persisting_queue;
@@ -73,6 +74,11 @@ static dispatch_queue_t persisting_queue() { @@ -73,6 +74,11 @@ static dispatch_queue_t persisting_queue() {
73 */ 74 */
74 @property (strong, nonatomic) NSMutableArray *tempEventArray; 75 @property (strong, nonatomic) NSMutableArray *tempEventArray;
75 76
  77 +/**
  78 + * 临时Performance数组
  79 + */
  80 +@property (strong, nonatomic) NSMutableArray *tempPerformanceArray;
  81 +
76 82
77 // 启动定位服务 83 // 启动定位服务
78 - (void)startLocationService; 84 - (void)startLocationService;
@@ -80,6 +86,10 @@ static dispatch_queue_t persisting_queue() { @@ -80,6 +86,10 @@ static dispatch_queue_t persisting_queue() {
80 - (void)startObserverNetworkReachabilityStatus; 86 - (void)startObserverNetworkReachabilityStatus;
81 // 将一个事件写入到文件 87 // 将一个事件写入到文件
82 - (BOOL)writeEventToFile:(YHEvent *)eventData; 88 - (BOOL)writeEventToFile:(YHEvent *)eventData;
  89 +
  90 +// 将一个Performance写入到文件
  91 +- (BOOL)writePerformanceToFile:(YHPerformance *)performanceData;
  92 +
83 // 将一个错误写入到文件 93 // 将一个错误写入到文件
84 - (BOOL)writeErrorToFile:(YHError *)errorData; 94 - (BOOL)writeErrorToFile:(YHError *)errorData;
85 // 当触发预设的条件时,自动上传数据 95 // 当触发预设的条件时,自动上传数据
@@ -184,6 +194,17 @@ static dispatch_queue_t persisting_queue() { @@ -184,6 +194,17 @@ static dispatch_queue_t persisting_queue() {
184 return _tempEventArray; 194 return _tempEventArray;
185 } 195 }
186 196
  197 +- (NSMutableArray *)tempPerformanceArray
  198 +{
  199 + if (!_tempPerformanceArray) {
  200 + _tempPerformanceArray = [NSMutableArray array];
  201 + }
  202 + return _tempPerformanceArray;
  203 +}
  204 +
  205 +
  206 +
  207 +
187 #pragma mark - public method 208 #pragma mark - public method
188 209
189 - (BOOL)canPersisting 210 - (BOOL)canPersisting
@@ -205,23 +226,75 @@ static dispatch_queue_t persisting_queue() { @@ -205,23 +226,75 @@ static dispatch_queue_t persisting_queue() {
205 return [NSDictionary dictionaryWithContentsOfFile:self.eventFileName]; 226 return [NSDictionary dictionaryWithContentsOfFile:self.eventFileName];
206 } 227 }
207 228
208 -- (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId 229 +- (void)prepareImmediUploadDic:(NSString *)appId sessionId:(NSString *)sessionId channelId:(NSString *)channelId
209 { 230 {
210 self.currentStatus.sid = sessionId; 231 self.currentStatus.sid = sessionId;
211 self.device.ak = appId; 232 self.device.ak = appId;
  233 + self.device.ch = channelId;
212 234
213 - // 设置device  
214 - [self.immediUploadItemDic setObject:self.device.jsonDictionary forKey:JsonKeyDataTypeDevice];  
215 -  
216 - // 设置status  
217 - [self.immediUploadItemDic setObject: [[NSMutableArray alloc]initWithObjects:self.currentStatus.jsonDictionary, nil] forKey:JsonKeyDataTypeStatus]; 235 + @synchronized(self.immediUploadItemDic) {
  236 + // 设置device
  237 + [self.immediUploadItemDic setObject:self.device.jsonDictionary forKey:JsonKeyDataTypeDevice];
  238 +
  239 + // 设置status
  240 + [self.immediUploadItemDic setObject: [[NSMutableArray alloc]initWithObjects:self.currentStatus.jsonDictionary, nil] forKey:JsonKeyDataTypeStatus];
  241 + }
218 242
219 [self startObserverNetworkReachabilityStatus]; 243 [self startObserverNetworkReachabilityStatus];
220 244
221 [self startLocationService]; 245 [self startLocationService];
222 } 246 }
223 247
  248 +- (void)uploadFirstLaunchApp
  249 +{
  250 + if ([[NSUserDefaults standardUserDefaults] objectForKey:@"kDMFinishLaunchApp"] == nil){
  251 + NSDictionary *paramDic = @{@"mac" : self.device.mac?:@"",
  252 + @"ifa" : self.device.ifa?:@""};
  253 +
  254 + [YHNetworkService uploadFirstLaunchApp:paramDic completionBlock:^(BOOL flag, NSError *error) {
  255 + if (flag) {
  256 + [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"kDMFinishLaunchApp"];
  257 + [[NSUserDefaults standardUserDefaults] synchronize];
  258 + }
  259 + }];
  260 + }
  261 +
  262 + if ([[NSUserDefaults standardUserDefaults] objectForKey:@"kGDTFinishLaunchApp"] == nil){
  263 + NSDictionary *param = @{@"imei" : self.device.ifa?:@""};
  264 +
  265 + [YHNetworkService uploadFirstLaunchAppByGuangDiaTong:param completionBlock:^(BOOL flag, NSError *error) {
  266 + if (flag) {
  267 + [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"kGDTFinishLaunchApp"];
  268 + [[NSUserDefaults standardUserDefaults] synchronize];
  269 + }
  270 + }];
  271 + }
  272 +}
  273 +
224 #pragma mark - 持久化数据 274 #pragma mark - 持久化数据
  275 +- (void)savePerformanceData:(YHPerformance *)perf
  276 +{
  277 + if (perf == nil || ![perf isKindOfClass:[YHPerformance class]]) {
  278 + NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException
  279 + reason:@"The input parameter is nil or an unexpected value."
  280 + userInfo:nil];
  281 + [exception raise];
  282 +
  283 + }
  284 +
  285 + if ([self canPersisting]) {
  286 + perf.net = self.currentStatus.net;
  287 +
  288 + dispatch_async(persisting_queue(), ^{
  289 +
  290 + if ([self writePerformanceToFile:perf]) {
  291 + [self autoUploadData];
  292 + }
  293 + });
  294 + }
  295 +
  296 +}
  297 +
225 - (void)saveItemData:(YHAnalyItemData *)itemData 298 - (void)saveItemData:(YHAnalyItemData *)itemData
226 { 299 {
227 if (itemData == nil || ![itemData isKindOfClass:[YHAnalyItemData class]]) { 300 if (itemData == nil || ![itemData isKindOfClass:[YHAnalyItemData class]]) {
@@ -232,9 +305,9 @@ static dispatch_queue_t persisting_queue() { @@ -232,9 +305,9 @@ static dispatch_queue_t persisting_queue() {
232 } 305 }
233 306
234 if ([self canPersisting]) { 307 if ([self canPersisting]) {
235 - 308 +
236 if (itemData.dataType == YHItemDataTypeEvent) { 309 if (itemData.dataType == YHItemDataTypeEvent) {
237 - YHEvent *event = (YHEvent *)itemData; 310 + YHEvent *event = (YHEvent *)itemData;
238 // 将持久化任务抛入 persistingQueue 队列 311 // 将持久化任务抛入 persistingQueue 队列
239 dispatch_async(persisting_queue(), ^{ 312 dispatch_async(persisting_queue(), ^{
240 313
@@ -242,7 +315,19 @@ static dispatch_queue_t persisting_queue() { @@ -242,7 +315,19 @@ static dispatch_queue_t persisting_queue() {
242 [self autoUploadData]; 315 [self autoUploadData];
243 } 316 }
244 }); 317 });
245 - 318 +
  319 + } else if (itemData.dataType == YHItemDataTypePerformance) {
  320 + YHPerformance *performance = (YHPerformance *)itemData;
  321 + performance.net = self.currentStatus.net;
  322 +
  323 + dispatch_async(persisting_queue(), ^{
  324 +
  325 + if ([self writePerformanceToFile:performance]) {
  326 + [self autoUploadData];
  327 + }
  328 + });
  329 +
  330 +
246 } else if(itemData.dataType == YHItemDataTypeError){ //error 331 } else if(itemData.dataType == YHItemDataTypeError){ //error
247 YHError *errorData = (YHError *)itemData; 332 YHError *errorData = (YHError *)itemData;
248 NSDictionary *st = [errorData.param objectForKey:JsonKeyErrorST]; 333 NSDictionary *st = [errorData.param objectForKey:JsonKeyErrorST];
@@ -286,28 +371,54 @@ static dispatch_queue_t persisting_queue() { @@ -286,28 +371,54 @@ static dispatch_queue_t persisting_queue() {
286 if (itemData.dataType == YHItemDataTypeEvent) { 371 if (itemData.dataType == YHItemDataTypeEvent) {
287 YHEvent *event = (YHEvent *)itemData; 372 YHEvent *event = (YHEvent *)itemData;
288 if (event) { 373 if (event) {
289 - [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:event.jsonDictionary, nil] forKey:JsonKeyDataTypeEvents];  
290 -  
291 - [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {  
292 - if (success) {  
293 - YALog(@"upload immedialite event success.");  
294 - } else {  
295 - YALog(@"uploadImmedilyWithEvent error = %@", error.localizedDescription);  
296 - }  
297 - }]; 374 + @synchronized(self.immediUploadItemDic) {
  375 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypePerfor];
  376 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypeErrors];
  377 + [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:event.jsonDictionary, nil] forKey:JsonKeyDataTypeEvents];
  378 +
  379 + [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
  380 + if (success) {
  381 + YALog(@"upload immedialite event success.");
  382 + } else {
  383 + YALog(@"uploadImmedilyWithEvent error = %@", error.localizedDescription);
  384 + }
  385 + }];
  386 + }
  387 + }
  388 + } else if (itemData.dataType == YHItemDataTypePerformance) {
  389 + YHPerformance *perfms = (YHPerformance *)itemData;
  390 + perfms.net = self.currentStatus.net;
  391 + if (perfms) {
  392 + @synchronized(self.immediUploadItemDic) {
  393 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypeEvents];
  394 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypeErrors];
  395 + [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:perfms.jsonDictionary, nil] forKey:JsonKeyDataTypePerfor];
  396 +
  397 + [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
  398 + if (success) {
  399 + YALog(@"upload immedialite event success.");
  400 + } else {
  401 + YALog(@"uploadImmedilyWithEvent error = %@", error.localizedDescription);
  402 + }
  403 + }];
  404 + }
298 } 405 }
299 } else if(itemData.dataType == YHItemDataTypeError) { 406 } else if(itemData.dataType == YHItemDataTypeError) {
300 YHError *error = (YHError *)itemData; 407 YHError *error = (YHError *)itemData;
301 if (error) { 408 if (error) {
302 - [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:error.jsonDictionary, nil] forKey:JsonKeyDataTypeErrors];  
303 -  
304 - [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {  
305 - if (success) {  
306 - YALog(@"upload immedialite error success.");  
307 - } else {  
308 - YALog(@"uploadImmedilyWithError error = %@", error.localizedDescription);  
309 - }  
310 - }]; 409 + @synchronized(self.immediUploadItemDic) {
  410 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypeEvents];
  411 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypePerfor];
  412 + [self.immediUploadItemDic setObject:[[NSMutableArray alloc]initWithObjects:error.jsonDictionary, nil] forKey:JsonKeyDataTypeErrors];
  413 +
  414 + [[YHNetworkService sharedInstance] uploadLogData:self.immediUploadItemDic completionBlock:^(BOOL success, NSError *error) {
  415 + if (success) {
  416 + YALog(@"upload immedialite error success.");
  417 + } else {
  418 + YALog(@"uploadImmedilyWithError error = %@", error.localizedDescription);
  419 + }
  420 + }];
  421 + }
311 } 422 }
312 } else { 423 } else {
313 // 不处理非 Event 和 Error 类型的数据 424 // 不处理非 Event 和 Error 类型的数据
@@ -337,6 +448,9 @@ static dispatch_queue_t persisting_queue() { @@ -337,6 +448,9 @@ static dispatch_queue_t persisting_queue() {
337 448
338 // 打开日志文件锁,允许写入 449 // 打开日志文件锁,允许写入
339 self.lockLogFile = NO; 450 self.lockLogFile = NO;
  451 +
  452 + [self writeTempEventArray];
  453 + [self writeTempPerformanceArray];
340 }]; 454 }];
341 } 455 }
342 } 456 }
@@ -372,7 +486,7 @@ static dispatch_queue_t persisting_queue() { @@ -372,7 +486,7 @@ static dispatch_queue_t persisting_queue() {
372 486
373 case AFNetworkReachabilityStatusReachableViaWWAN: 487 case AFNetworkReachabilityStatusReachableViaWWAN:
374 { 488 {
375 - if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) { 489 + if (([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)) {
376 if ([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { 490 if ([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) {
377 net = kNetWorkStatus2G; 491 net = kNetWorkStatus2G;
378 } else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { 492 } else if([netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA] || [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]|| [netInfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) {
@@ -398,7 +512,7 @@ static dispatch_queue_t persisting_queue() { @@ -398,7 +512,7 @@ static dispatch_queue_t persisting_queue() {
398 if ([self updateNetWorkStatus:net]) { 512 if ([self updateNetWorkStatus:net]) {
399 [self updateImmediUploadDic]; 513 [self updateImmediUploadDic];
400 } 514 }
401 - 515 +
402 }]; 516 }];
403 } 517 }
404 518
@@ -462,15 +576,17 @@ static dispatch_queue_t persisting_queue() { @@ -462,15 +576,17 @@ static dispatch_queue_t persisting_queue() {
462 // 更新立即上传信息 576 // 更新立即上传信息
463 - (void)updateImmediUploadDic 577 - (void)updateImmediUploadDic
464 { 578 {
465 - NSMutableArray *allStatus = [self.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];  
466 - if ([allStatus count]) {  
467 - [allStatus replaceObjectAtIndex:0 withObject:self.currentStatus.jsonDictionary];  
468 - [self.immediUploadItemDic setObject:allStatus forKey:JsonKeyDataTypeStatus];  
469 - } else {  
470 - NSException *exception = [NSException exceptionWithName:NSGenericException  
471 - reason:@"appId and sessionId do not be initialized. Please use prepareImmediUploadDic:sessionId: first."  
472 - userInfo:nil];  
473 - [exception raise]; 579 + @synchronized(self.immediUploadItemDic) {
  580 + NSMutableArray *allStatus = [self.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];
  581 + if ([allStatus count]) {
  582 + [allStatus replaceObjectAtIndex:0 withObject:self.currentStatus.jsonDictionary];
  583 + [self.immediUploadItemDic setObject:allStatus forKey:JsonKeyDataTypeStatus];
  584 + } else {
  585 + NSException *exception = [NSException exceptionWithName:NSGenericException
  586 + reason:@"appId and sessionId do not be initialized. Please use prepareImmediUploadDic:sessionId:channelId: first."
  587 + userInfo:nil];
  588 + [exception raise];
  589 + }
474 } 590 }
475 } 591 }
476 592
@@ -486,7 +602,10 @@ static dispatch_queue_t persisting_queue() { @@ -486,7 +602,10 @@ static dispatch_queue_t persisting_queue() {
486 } 602 }
487 603
488 if (self.lockLogFile) { 604 if (self.lockLogFile) {
489 - [self.tempEventArray addObject:event]; 605 + @synchronized(self.tempEventArray) {
  606 + [self.tempEventArray addObject:event];
  607 + }
  608 +
490 return NO; 609 return NO;
491 } 610 }
492 611
@@ -497,7 +616,9 @@ static dispatch_queue_t persisting_queue() { @@ -497,7 +616,9 @@ static dispatch_queue_t persisting_queue() {
497 collectData = [[NSMutableDictionary alloc]init]; 616 collectData = [[NSMutableDictionary alloc]init];
498 617
499 //直接添加 immediUploadDataDic 内容(里面包含 device 信息) 618 //直接添加 immediUploadDataDic 内容(里面包含 device 信息)
500 - [collectData addEntriesFromDictionary:self.immediUploadItemDic]; 619 + @synchronized(self.immediUploadItemDic) {
  620 + [collectData addEntriesFromDictionary:self.immediUploadItemDic];
  621 + }
501 622
502 //组合event信息 623 //组合event信息
503 if (event.jsonDictionary) { 624 if (event.jsonDictionary) {
@@ -521,6 +642,7 @@ static dispatch_queue_t persisting_queue() { @@ -521,6 +642,7 @@ static dispatch_queue_t persisting_queue() {
521 } 642 }
522 } 643 }
523 644
  645 + //组合event信息
524 if ([collectData.allKeys containsObject:JsonKeyDataTypeEvents]) { 646 if ([collectData.allKeys containsObject:JsonKeyDataTypeEvents]) {
525 NSMutableArray *oldEvents = [collectData objectForKey:JsonKeyDataTypeEvents]; 647 NSMutableArray *oldEvents = [collectData objectForKey:JsonKeyDataTypeEvents];
526 if (!oldEvents) { 648 if (!oldEvents) {
@@ -540,6 +662,79 @@ static dispatch_queue_t persisting_queue() { @@ -540,6 +662,79 @@ static dispatch_queue_t persisting_queue() {
540 return [collectData writeToFile:self.eventFileName atomically:YES]; 662 return [collectData writeToFile:self.eventFileName atomically:YES];
541 } 663 }
542 664
  665 +- (BOOL)writePerformanceToFile:(YHPerformance *)performanceData
  666 +{
  667 + performanceData.net = self.currentStatus.net;
  668 + if (performanceData == nil || ![performanceData isKindOfClass:[YHPerformance class]]) {
  669 + NSException *exception = [NSException exceptionWithName:NSInvalidArgumentException
  670 + reason:@"The input parameter is nil or an unexpected value."
  671 + userInfo:nil];
  672 + [exception raise];
  673 + return NO;
  674 + }
  675 +
  676 + if (self.lockLogFile) {
  677 + @synchronized(self.tempPerformanceArray){
  678 + [self.tempPerformanceArray addObject:performanceData];
  679 + }
  680 + return NO;
  681 + }
  682 +
  683 + NSMutableDictionary *collectData = [[NSMutableDictionary alloc] initWithContentsOfFile:self.eventFileName];
  684 +
  685 + //无本地持久化数据
  686 + if (!collectData) {
  687 + collectData = [[NSMutableDictionary alloc]init];
  688 +
  689 + //直接添加 immediUploadDataDic 内容(里面包含 device 信息)
  690 + @synchronized(self.immediUploadItemDic) {
  691 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypeErrors];
  692 + [self.immediUploadItemDic removeObjectForKey:JsonKeyDataTypeEvents];
  693 + [collectData addEntriesFromDictionary:self.immediUploadItemDic];
  694 + }
  695 +
  696 + //组合performance信息
  697 + if (performanceData.jsonDictionary) {
  698 + NSMutableArray *events = [[NSMutableArray alloc]initWithObjects:performanceData.jsonDictionary,nil];
  699 +
  700 + [collectData setObject:events forKey:JsonKeyDataTypePerfor];
  701 + }
  702 +
  703 + } else { // 持久化文件不为空
  704 +
  705 + // 检查当前session与本地文件中最近存储的session是否相同
  706 + NSMutableArray *status = [collectData objectForKey:JsonKeyDataTypeStatus];
  707 + if ([status count]) {
  708 + NSMutableDictionary *tempStatus = [status lastObject];
  709 + //如果不同则插入新的状态
  710 + if (![[tempStatus objectForKey:JsonKeyStatusSID] isEqualToString:self.currentStatus.sid]) {
  711 + [status addObject:self.currentStatus.jsonDictionary];
  712 +
  713 + // 更新items中status
  714 + [collectData setObject:status forKey:JsonKeyDataTypeStatus];
  715 + }
  716 + }
  717 +
  718 + //组合performance信息
  719 + if ([collectData.allKeys containsObject:JsonKeyDataTypePerfor]) {
  720 + NSMutableArray *oldPerformance = [collectData objectForKey:JsonKeyDataTypePerfor];
  721 + if (!oldPerformance) {
  722 + oldPerformance = [[NSMutableArray alloc]init];
  723 + }
  724 + [oldPerformance addObject:performanceData.jsonDictionary];
  725 +
  726 + [collectData setObject:oldPerformance forKey:JsonKeyDataTypePerfor];
  727 +
  728 + } else {
  729 + NSMutableArray *newPerformance = [[NSMutableArray alloc]initWithObjects:performanceData.jsonDictionary, nil];
  730 +
  731 + [collectData setObject:newPerformance forKey:JsonKeyDataTypePerfor];
  732 + }
  733 + }
  734 +
  735 + return [collectData writeToFile:self.eventFileName atomically:YES];
  736 +}
  737 +
543 // 将一个错误写入到文件 738 // 将一个错误写入到文件
544 - (BOOL)writeErrorToFile:(YHError *)errorData; 739 - (BOOL)writeErrorToFile:(YHError *)errorData;
545 { 740 {
@@ -560,7 +755,9 @@ static dispatch_queue_t persisting_queue() { @@ -560,7 +755,9 @@ static dispatch_queue_t persisting_queue() {
560 if (!collectData) { 755 if (!collectData) {
561 collectData = [[NSMutableDictionary alloc]init]; 756 collectData = [[NSMutableDictionary alloc]init];
562 //直接添加 immediUploadDataDic 内容(里面包含 device 信息) 757 //直接添加 immediUploadDataDic 内容(里面包含 device 信息)
563 - [collectData addEntriesFromDictionary:self.immediUploadItemDic]; 758 + @synchronized(self.immediUploadItemDic) {
  759 + [collectData addEntriesFromDictionary:self.immediUploadItemDic];
  760 + }
564 761
565 //组合error信息 762 //组合error信息
566 if (errorData.jsonDictionary) { 763 if (errorData.jsonDictionary) {
@@ -633,82 +830,159 @@ static dispatch_queue_t persisting_queue() { @@ -633,82 +830,159 @@ static dispatch_queue_t persisting_queue() {
633 830
634 - (void)writeTempEventArray 831 - (void)writeTempEventArray
635 { 832 {
636 - if ([self.tempEventArray count] > 0) {  
637 - NSMutableDictionary *collectData = [[NSMutableDictionary alloc] initWithContentsOfFile:self.eventFileName];  
638 -  
639 - //无本地持久化数据  
640 - if (!collectData) {  
641 - collectData = [[NSMutableDictionary alloc]init]; 833 + @synchronized(self.tempEventArray) {
  834 + if ([self.tempEventArray count] > 0) {
  835 + NSMutableDictionary *collectData = [[NSMutableDictionary alloc] initWithContentsOfFile:self.eventFileName];
642 836
643 - //直接添加 immediUploadDataDic 内容(里面包含 device 信息)  
644 - [collectData addEntriesFromDictionary:self.immediUploadItemDic];  
645 -  
646 - //组合event信息  
647 - NSMutableArray *eventJsonDicArray = [NSMutableArray array];  
648 - if ([self.tempEventArray count] > 0) { 837 + //无本地持久化数据
  838 + if (!collectData) {
  839 + collectData = [[NSMutableDictionary alloc]init];
  840 +
  841 + //直接添加 immediUploadDataDic 内容(里面包含 device 信息)
  842 + @synchronized(self.immediUploadItemDic) {
  843 + [collectData addEntriesFromDictionary:self.immediUploadItemDic];
  844 + }
  845 +
  846 + //组合event信息
  847 + NSMutableArray *eventJsonDicArray = [NSMutableArray array];
649 for (YHEvent *aEvent in self.tempEventArray) { 848 for (YHEvent *aEvent in self.tempEventArray) {
650 if (aEvent.jsonDictionary) { 849 if (aEvent.jsonDictionary) {
651 [eventJsonDicArray addObject:aEvent.jsonDictionary]; 850 [eventJsonDicArray addObject:aEvent.jsonDictionary];
652 } 851 }
653 } 852 }
  853 +
654 [self.tempEventArray removeAllObjects]; 854 [self.tempEventArray removeAllObjects];
655 - }  
656 -  
657 - self.allEventsCount = [eventJsonDicArray count];  
658 - [collectData setObject:eventJsonDicArray forKey:JsonKeyDataTypeEvents];  
659 -  
660 - } else { // 持久化文件不为空  
661 -  
662 - // 检查当前session与本地文件中最近存储的session是否相同  
663 - NSMutableArray *status = [collectData objectForKey:JsonKeyDataTypeStatus];  
664 - if ([status count]) {  
665 - NSMutableDictionary *tempStatus = [status lastObject];  
666 - //如果不同则插入新的状态  
667 - if (![[tempStatus objectForKey:JsonKeyStatusSID] isEqualToString:self.currentStatus.sid]) {  
668 - [status addObject:self.currentStatus.jsonDictionary];  
669 -  
670 - // 更新items中status  
671 - [collectData setObject:status forKey:JsonKeyDataTypeStatus];  
672 - }  
673 - }  
674 -  
675 - //组合event信息  
676 - if ([collectData.allKeys containsObject:JsonKeyDataTypeEvents]) {  
677 - NSMutableArray *oldEvents = [collectData objectForKey:JsonKeyDataTypeEvents];  
678 - if (!oldEvents) {  
679 - oldEvents = [[NSMutableArray alloc]init]; 855 +
  856 + self.allEventsCount = [eventJsonDicArray count];
  857 + [collectData setObject:eventJsonDicArray forKey:JsonKeyDataTypeEvents];
  858 +
  859 + } else { // 持久化文件不为空
  860 +
  861 + // 检查当前session与本地文件中最近存储的session是否相同
  862 + NSMutableArray *status = [collectData objectForKey:JsonKeyDataTypeStatus];
  863 + if ([status count]) {
  864 + NSMutableDictionary *tempStatus = [status lastObject];
  865 + //如果不同则插入新的状态
  866 + if (![[tempStatus objectForKey:JsonKeyStatusSID] isEqualToString:self.currentStatus.sid]) {
  867 + [status addObject:self.currentStatus.jsonDictionary];
  868 +
  869 + // 更新items中status
  870 + [collectData setObject:status forKey:JsonKeyDataTypeStatus];
  871 + }
680 } 872 }
681 873
682 - if ([self.tempEventArray count] > 0) { 874 + //组合event信息
  875 + if ([collectData.allKeys containsObject:JsonKeyDataTypeEvents]) {
  876 + NSMutableArray *oldEvents = [collectData objectForKey:JsonKeyDataTypeEvents];
  877 + if (!oldEvents) {
  878 + oldEvents = [[NSMutableArray alloc]init];
  879 + }
  880 +
683 for (YHEvent *aEvent in self.tempEventArray) { 881 for (YHEvent *aEvent in self.tempEventArray) {
684 if (aEvent.jsonDictionary) { 882 if (aEvent.jsonDictionary) {
685 [oldEvents addObject:aEvent.jsonDictionary]; 883 [oldEvents addObject:aEvent.jsonDictionary];
686 } 884 }
687 } 885 }
688 [self.tempEventArray removeAllObjects]; 886 [self.tempEventArray removeAllObjects];
  887 +
  888 + self.allEventsCount = [oldEvents count];
  889 + [collectData setObject:oldEvents forKey:JsonKeyDataTypeEvents];
  890 +
  891 + } else {
  892 + NSMutableArray *newEvents = [[NSMutableArray alloc]init];
  893 +
  894 + for (YHEvent *aEvent in self.tempEventArray) {
  895 + if (aEvent.jsonDictionary) {
  896 + [newEvents addObject:aEvent.jsonDictionary];
  897 + }
  898 + }
  899 + [self.tempEventArray removeAllObjects];
  900 +
  901 + self.allEventsCount = [newEvents count];
  902 + [collectData setObject:newEvents forKey:JsonKeyDataTypeEvents];
689 } 903 }
  904 + }
  905 +
  906 + [collectData writeToFile:self.eventFileName atomically:YES];
  907 + }
  908 + }
  909 +}
  910 +
  911 +- (void)writeTempPerformanceArray
  912 +{
  913 + @synchronized(self.tempPerformanceArray) {
  914 + if ([self.tempPerformanceArray count] > 0) {
  915 + NSMutableDictionary *collectData = [[NSMutableDictionary alloc] initWithContentsOfFile:self.eventFileName];
  916 +
  917 + //无本地持久化数据
  918 + if (!collectData) {
  919 + collectData = [[NSMutableDictionary alloc]init];
690 920
691 - self.allEventsCount = [oldEvents count];  
692 - [collectData setObject:oldEvents forKey:JsonKeyDataTypeEvents]; 921 + //直接添加 immediUploadDataDic 内容(里面包含 device 信息)
  922 + @synchronized(self.immediUploadItemDic) {
  923 + [collectData addEntriesFromDictionary:self.immediUploadItemDic];
  924 + }
693 925
694 - } else {  
695 - NSMutableArray *newEvents = [[NSMutableArray alloc]init]; 926 + //组合event信息
  927 + NSMutableArray *eventJsonDicArray = [NSMutableArray array];
  928 + for (YHPerformance *aEvent in self.tempPerformanceArray) {
  929 + if (aEvent.jsonDictionary) {
  930 + [eventJsonDicArray addObject:aEvent.jsonDictionary];
  931 + }
  932 + }
696 933
697 - if ([self.tempEventArray count] > 0) {  
698 - for (YHEvent *aEvent in self.tempEventArray) { 934 + [self.tempPerformanceArray removeAllObjects];
  935 +
  936 + [collectData setObject:eventJsonDicArray forKey:JsonKeyDataTypePerfor];
  937 +
  938 + } else { // 持久化文件不为空
  939 +
  940 + // 检查当前session与本地文件中最近存储的session是否相同
  941 + NSMutableArray *status = [collectData objectForKey:JsonKeyDataTypeStatus];
  942 + if ([status count]) {
  943 + NSMutableDictionary *tempStatus = [status lastObject];
  944 + //如果不同则插入新的状态
  945 + if (![[tempStatus objectForKey:JsonKeyStatusSID] isEqualToString:self.currentStatus.sid]) {
  946 + [status addObject:self.currentStatus.jsonDictionary];
  947 +
  948 + // 更新items中status
  949 + [collectData setObject:status forKey:JsonKeyDataTypeStatus];
  950 + }
  951 + }
  952 +
  953 + //组合performance信息
  954 + if ([collectData.allKeys containsObject:JsonKeyDataTypePerfor]) {
  955 + NSMutableArray *oldEvents = [collectData objectForKey:JsonKeyDataTypeEvents];
  956 + if (!oldEvents) {
  957 + oldEvents = [[NSMutableArray alloc]init];
  958 + }
  959 +
  960 + for (YHPerformance *aEvent in self.tempPerformanceArray) {
  961 + if (aEvent.jsonDictionary) {
  962 + [oldEvents addObject:aEvent.jsonDictionary];
  963 + }
  964 + }
  965 + [self.tempPerformanceArray removeAllObjects];
  966 +
  967 + [collectData setObject:oldEvents forKey:JsonKeyDataTypePerfor];
  968 +
  969 + } else {
  970 + NSMutableArray *newEvents = [[NSMutableArray alloc]init];
  971 +
  972 + for (YHPerformance *aEvent in self.tempPerformanceArray) {
699 if (aEvent.jsonDictionary) { 973 if (aEvent.jsonDictionary) {
700 [newEvents addObject:aEvent.jsonDictionary]; 974 [newEvents addObject:aEvent.jsonDictionary];
701 } 975 }
702 } 976 }
703 - [self.tempEventArray removeAllObjects]; 977 + [self.tempPerformanceArray removeAllObjects];
  978 +
  979 + self.allEventsCount = [newEvents count];
  980 + [collectData setObject:newEvents forKey:JsonKeyDataTypePerfor];
704 } 981 }
705 -  
706 - self.allEventsCount = [newEvents count];  
707 - [collectData setObject:newEvents forKey:JsonKeyDataTypeEvents];  
708 } 982 }
  983 +
  984 + [collectData writeToFile:self.eventFileName atomically:YES];
709 } 985 }
710 -  
711 - [collectData writeToFile:self.eventFileName atomically:YES];  
712 } 986 }
713 } 987 }
714 988
@@ -722,6 +996,10 @@ static dispatch_queue_t persisting_queue() { @@ -722,6 +996,10 @@ static dispatch_queue_t persisting_queue() {
722 if ([manager respondsToSelector:@selector(requestAlwaysAuthorization)]) { 996 if ([manager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
723 [manager requestAlwaysAuthorization]; 997 [manager requestAlwaysAuthorization];
724 } 998 }
  999 +
  1000 + // if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
  1001 + // manager.allowsBackgroundLocationUpdates = YES;
  1002 + // }
725 } 1003 }
726 break; 1004 break;
727 case kCLAuthorizationStatusRestricted: 1005 case kCLAuthorizationStatusRestricted:
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 8
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 #import "AFNetworking.h" 10 #import "AFNetworking.h"
  11 +#import "AFHTTPRequestOperationManager+YHPriorityRequest.h"
11 12
12 typedef void (^YHNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status); 13 typedef void (^YHNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus status);
13 14
@@ -21,4 +22,8 @@ typedef void (^YHNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus sta @@ -21,4 +22,8 @@ typedef void (^YHNetworkReachabilityStatusBlock)(AFNetworkReachabilityStatus sta
21 22
22 - (AFHTTPRequestOperation *)getNewLogStrategy:(NSDictionary *)parameters completionBlock:(void (^)(NSDictionary *strategy, NSError *error))block; 23 - (AFHTTPRequestOperation *)getNewLogStrategy:(NSDictionary *)parameters completionBlock:(void (^)(NSDictionary *strategy, NSError *error))block;
23 24
  25 ++ (void)uploadFirstLaunchApp:(NSDictionary *)parameters completionBlock:(void (^)(BOOL flag, NSError *error))block;
  26 +
  27 ++ (void)uploadFirstLaunchAppByGuangDiaTong:(NSDictionary *)parameters completionBlock:(void (^)(BOOL flag, NSError *error))block;
  28 +
24 @end 29 @end
@@ -78,7 +78,7 @@ @@ -78,7 +78,7 @@
78 NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 78 NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
79 NSDictionary *newParameters = @{@"_mlogs": kSafeValue(parsJsonStr)}; 79 NSDictionary *newParameters = @{@"_mlogs": kSafeValue(parsJsonStr)};
80 80
81 - return [self.httpClient POST:kYASApiMethodUploadData parameters:newParameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 81 + return [self.httpClient POST:kYASApiMethodUploadData priority:NSOperationQueuePriorityLow parameters:newParameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
82 82
83 if (block) { 83 if (block) {
84 block(YES, nil); 84 block(YES, nil);
@@ -113,6 +113,46 @@ @@ -113,6 +113,46 @@
113 }]; 113 }];
114 } 114 }
115 115
  116 +// http://123.57.94.127:8080/appActivate/domobA?mac=xx&ifa=xx
  117 ++ (void)uploadFirstLaunchApp:(NSDictionary *)parameters completionBlock:(void (^)(BOOL flag, NSError *error))block
  118 +{
  119 + // 多盟统计
  120 + AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://123.57.94.127:8080/"]];
  121 +
  122 + [manager GET:@"appActivate/domobA" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
  123 + YALog(@"DM %@", responseObject);
  124 + block(YES, nil);
  125 + } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  126 + YALog(@"DM %@", error.localizedDescription);
  127 + block(NO, error);
  128 + }];
  129 +}
  130 +
  131 +// http://api.open.yohobuy.com/?method=union.analytics.pairui&appid=100898104&conv_type=MOBILEAPP_ACTIVITE&app_type=android&advertiser_id=365136&imei=355065053311001/01&sigin_key=541ac540a8849881&client_ip=10.11.12.13&encrypt_key=e50a8f58c132f457
  132 ++ (void)uploadFirstLaunchAppByGuangDiaTong:(NSDictionary *)parameters completionBlock:(void (^)(BOOL flag, NSError *error))block
  133 +{
  134 + // 广点通
  135 + NSURL *baseURL = [NSURL URLWithString:YA_httpHost];
  136 + AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
  137 +
  138 + NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithDictionary:parameters];
  139 + params[@"method"] = @"union.analytics.pairui";
  140 + params[@"appid"] = @"490655927";
  141 + params[@"conv_type"] = @"MOBILEAPP_ACTIVITE";
  142 + params[@"app_type"] = @"ios";
  143 + params[@"sigin_key"] = @"59fd75c8e2072155";
  144 + params[@"encrypt_key"] = @"3c347e729b73157a";
  145 + params[@"advertiser_id"] = @"365136";
  146 +
  147 + [manager GET:@"" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
  148 + YALog(@"GDT %@", responseObject);
  149 + block(YES, nil);
  150 + } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  151 + YALog(@"GDT %@", error.localizedDescription);
  152 + block(NO, error);
  153 + }];
  154 +}
  155 +
116 #pragma mark - private method 156 #pragma mark - private method
117 157
118 - (void)handleNetworkReachabilityStatusChanged:(NSNotification *)notification 158 - (void)handleNetworkReachabilityStatusChanged:(NSNotification *)notification
@@ -13,7 +13,7 @@ @@ -13,7 +13,7 @@
13 #ifndef YH_Analytics_YHAnalyticsMacro_h 13 #ifndef YH_Analytics_YHAnalyticsMacro_h
14 #define YH_Analytics_YHAnalyticsMacro_h 14 #define YH_Analytics_YHAnalyticsMacro_h
15 15
16 -/**************** Debug Tool ***************/ 16 +/************* Debug Tool **************/
17 //#define YA_DEBUG 1 17 //#define YA_DEBUG 1
18 18
19 19
@@ -32,8 +32,8 @@ @@ -32,8 +32,8 @@
32 #define kYHAnalyticsSDKVersion @"1.0" // 数据分析库版本 32 #define kYHAnalyticsSDKVersion @"1.0" // 数据分析库版本
33 #define kDefalutChannelNum @"2119" // 推广渠道号 33 #define kDefalutChannelNum @"2119" // 推广渠道号
34 #define kMinInterval 60 // 间隔发送的最小时间周期,60秒 34 #define kMinInterval 60 // 间隔发送的最小时间周期,60秒
35 -#define kMaxLocalEventsCount 3000 // 本地持久化event最大条数,3000条  
36 -#define kMaxLocalRecoderFileSize (1024 * 300) // 本地持久化文件大小(300KB) 35 +#define kMaxLocalEventsCount 100 // 本地持久化event最大条数,3000条
  36 +#define kMaxLocalRecoderFileSize (1024 * 50) // 本地持久化文件大小(300KB)
37 37
38 /*********** Path and FileName *************/ 38 /*********** Path and FileName *************/
39 39
@@ -49,6 +49,12 @@ @@ -49,6 +49,12 @@
49 #define kYASApiMethodUploadData @"yas_mobile" // 上传监测数据接口 49 #define kYASApiMethodUploadData @"yas_mobile" // 上传监测数据接口
50 #define kYASApiMethodGetNewStrategy @"" // 获取新发送策略,接口名未定 50 #define kYASApiMethodGetNewStrategy @"" // 获取新发送策略,接口名未定
51 51
  52 +#if defined TESTENV
  53 +#define YA_httpHost @"http://test2.open.yohobuy.com"
  54 +#else
  55 +#define YA_httpHost @"http://api.open.yohobuy.com"
  56 +#endif
  57 +
52 /************ UserDefault Key ************/ 58 /************ UserDefault Key ************/
53 59
54 #define kKeyUserDefaultsLastUploadTimestamp @"lastSendTimestampKey" // 间隔发送的上次时间 60 #define kKeyUserDefaultsLastUploadTimestamp @"lastSendTimestampKey" // 间隔发送的上次时间
@@ -61,6 +67,7 @@ @@ -61,6 +67,7 @@
61 #define JsonKeyDataTypeDevice @"device" // 终端信息,包括终端的状态 67 #define JsonKeyDataTypeDevice @"device" // 终端信息,包括终端的状态
62 #define JsonKeyDataTypeStatus @"status" // 状态信息,包括一次操作时,用户的位置和网络等信息 68 #define JsonKeyDataTypeStatus @"status" // 状态信息,包括一次操作时,用户的位置和网络等信息
63 #define JsonKeyDataTypeEvents @"events" // 事件信息,包括用户的操作日志 69 #define JsonKeyDataTypeEvents @"events" // 事件信息,包括用户的操作日志
  70 +#define JsonKeyDataTypePerfor @"performance" // Performance信息
64 #define JsonKeyDataTypeErrors @"errors" // 错误信息,包括用户在使用过程中发生的错误 71 #define JsonKeyDataTypeErrors @"errors" // 错误信息,包括用户在使用过程中发生的错误
65 72
66 // 终端参数 73 // 终端参数
@@ -106,6 +113,24 @@ @@ -106,6 +113,24 @@
106 #define JsonKeyErrorEI @"ei" // 发生错误接口 113 #define JsonKeyErrorEI @"ei" // 发生错误接口
107 #define JsonKeyErrorPARAM @"param" // 错误自定义参数 114 #define JsonKeyErrorPARAM @"param" // 错误自定义参数
108 115
  116 +// Performance参数
  117 +#define JsonKeyPerformanceUID @"uid" // 用户id
  118 +#define JsonKeyPerformanceTS @"ts" // 时间戳
  119 +#define JsonKeyPerformanceSID @"sid" // 会话id(由设备标识和启动时间戳做md5)
  120 +#define JsonKeyPerformanceTYPE @"type" // 错误类型 error type
  121 +#define JsonKeyPerformancePARAM @"param" // 错误自定义参数
  122 +#define JsonKeyPerformanceTag @"tag"
  123 +#define JsonKeyPerformanceURL @"url"
  124 +#define JsonKeyPerformanceEvt @"evt" //事件类型, begin(开始加载h5页面),end(加载完成)
  125 +#define JsonKeyPerformanceEvtBegin @"begin"
  126 +#define JsonKeyPerformanceEvtEnd @"end"
  127 +#define JsonKeyPerformanceEvtNet @"net"
  128 +
  129 +
  130 +
  131 +
  132 +
  133 +
109 // 中断和异常参数,文档中没有定义 134 // 中断和异常参数,文档中没有定义
110 #define JsonKeyCrashCallstack @"cs" // 中断或异常堆栈 135 #define JsonKeyCrashCallstack @"cs" // 中断或异常堆栈
111 #define JsonKeyCrashSignal @"sig" // 中断信号量 136 #define JsonKeyCrashSignal @"sig" // 中断信号量
@@ -133,4 +158,10 @@ @@ -133,4 +158,10 @@
133 #define kErrorTypeHTTP @"NETWORK" // HTTP返回非200的网络错误(et为NETWORK) 158 #define kErrorTypeHTTP @"NETWORK" // HTTP返回非200的网络错误(et为NETWORK)
134 #define kErrorTypeCrash @"CRASH" // 客户端Crash错误(et为CRASH) 159 #define kErrorTypeCrash @"CRASH" // 客户端Crash错误(et为CRASH)
135 160
  161 +// Performance信息类型
  162 +#define kPerformanceTypeImageLoad @"IMG_LOAD"
  163 +#define kPerformanceTypeAPICall @"API_CALL"
  164 +#define kPerformanceTypeWebViewLoad @"WEBVIEW_LOAD"
  165 +
  166 +
136 #endif 167 #endif
@@ -9,6 +9,7 @@ @@ -9,6 +9,7 @@
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 #import <UIKit/UIKit.h> 10 #import <UIKit/UIKit.h>
11 #import "YHAnalyticsMacro.h" 11 #import "YHAnalyticsMacro.h"
  12 +#import "YH_Analytics_Evevt.h"
12 13
13 typedef NS_ENUM(NSInteger, YHLogStrategy) { 14 typedef NS_ENUM(NSInteger, YHLogStrategy) {
14 LogStrategyAppLaunch = 1, //每次程序启动 15 LogStrategyAppLaunch = 1, //每次程序启动
@@ -22,12 +23,12 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) { @@ -22,12 +23,12 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) {
22 /** 23 /**
23 * 获取统计对象的实例 24 * 获取统计对象的实例
24 */ 25 */
25 -+ (YH_Analytics*)sharedInstance; 26 ++ (YH_Analytics *)sharedInstance;
26 27
27 /** 28 /**
28 * 此处AppId即为应用的appKey 29 * 此处AppId即为应用的appKey
29 */ 30 */
30 -- (void)startWithAppId:(NSString*) appId; 31 +- (void)startWithAppId:(NSString *)appId;
31 32
32 /** 33 /**
33 * 更新发送策略 34 * 更新发送策略
@@ -37,17 +38,32 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) { @@ -37,17 +38,32 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) {
37 /** 38 /**
38 *logEvent 事件ID和事件参数 39 *logEvent 事件ID和事件参数
39 */ 40 */
40 -- (void)logEvent:(NSString*) eventId parameters:(NSDictionary * )param; 41 +- (void)logEvent:(NSString *)eventId parameters:(NSDictionary *)param;
41 42
42 /** 43 /**
43 *logError errorID和错误参数 44 *logError errorID和错误参数
44 */ 45 */
45 -- (void)logError:(NSString*) errorType parameters:(NSDictionary * )param; 46 +- (void)logError:(NSString *)errorType parameters:(NSDictionary *)param;
46 47
47 /** 48 /**
48 - *logError 传入NSError 49 + @brief 记录APP客户端性能指标相关数据
  50 +
  51 + @param perfType 统计类型 IMG_LOAD, API_CALL, WEBVIEW_LOAD
  52 + @param param 操作参数
  53 +
  54 + @since 1.0
49 */ 55 */
50 -//- (void)logError:(NSError *)error; 56 +- (void)logPerformanceWithType:(NSString *)perfType parameters:(NSDictionary *)param;
  57 +
  58 +///**
  59 +// @brief 统一事件记录的接口
  60 +//
  61 +// @param extraData 统计类型 IMG_LOAD, API_CALL, WEBVIEW_LOAD
  62 +// @param param 操作参数
  63 +//
  64 +// @since 1.0
  65 +// */
  66 +//- (void)logWithExtraData:(NSString *)extraData dataType:() parameters:(NSDictionary *)param;
51 67
52 68
53 /** 69 /**
@@ -59,7 +75,7 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) { @@ -59,7 +75,7 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) {
59 * 设置或者获取渠道Id。 75 * 设置或者获取渠道Id。
60 * 可以不设置, 此时系统会处理为AppStore渠道 76 * 可以不设置, 此时系统会处理为AppStore渠道
61 */ 77 */
62 -@property (strong, nonatomic) NSString* channelId; 78 +@property (strong, nonatomic) NSString *channelId;
63 79
64 /** 80 /**
65 * 81 *
@@ -73,6 +89,11 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) { @@ -73,6 +89,11 @@ typedef NS_ENUM(NSInteger, YHLogStrategy) {
73 @property (assign, nonatomic, readonly) NSTimeInterval currentInterval; 89 @property (assign, nonatomic, readonly) NSTimeInterval currentInterval;
74 90
75 /** 91 /**
  92 + * 当前会话ID
  93 + */
  94 +@property (strong, nonatomic, readonly) NSString *session;
  95 +
  96 +/**
76 * 发送的事件 97 * 发送的事件
77 */ 98 */
78 @property (strong, nonatomic, readonly) YHEvent *event; 99 @property (strong, nonatomic, readonly) YHEvent *event;
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
10 //#import "YHEventFactory.h" 10 //#import "YHEventFactory.h"
11 //#import "YHDeviceFactory.h" 11 //#import "YHDeviceFactory.h"
12 //#import "YHStatusFactory.h" 12 //#import "YHStatusFactory.h"
  13 +#import "YHAnalyticsMacro.h"
13 #import "YH_Analytics.h" 14 #import "YH_Analytics.h"
14 #import "NSString+YHAnalytics.h" 15 #import "NSString+YHAnalytics.h"
15 #import "YHCrashReporter.h" 16 #import "YHCrashReporter.h"
@@ -17,6 +18,7 @@ @@ -17,6 +18,7 @@
17 #import "OpenUDID.h" 18 #import "OpenUDID.h"
18 #import "YHError.h" 19 #import "YHError.h"
19 #import "YHEvent.h" 20 #import "YHEvent.h"
  21 +#import "YHPerformance.h"
20 //#import "YHNetworkService.h" 22 //#import "YHNetworkService.h"
21 23
22 24
@@ -47,7 +49,7 @@ @@ -47,7 +49,7 @@
47 */ 49 */
48 @property (assign, nonatomic) NSTimeInterval currentInterval; 50 @property (assign, nonatomic) NSTimeInterval currentInterval;
49 /** 51 /**
50 - * 最近一个时间 52 + * 最近一个事件
51 */ 53 */
52 @property (strong, nonatomic) YHEvent *event; 54 @property (strong, nonatomic) YHEvent *event;
53 /** 55 /**
@@ -55,6 +57,13 @@ @@ -55,6 +57,13 @@
55 */ 57 */
56 @property (strong, nonatomic) YHError *error; 58 @property (strong, nonatomic) YHError *error;
57 59
  60 +/**
  61 + @brief 最近一个Performance信息
  62 +
  63 + @since 1.0
  64 + */
  65 +@property (strong, nonatomic) YHPerformance *perfermance;
  66 +
58 67
59 - (NSString *)timestamp; 68 - (NSString *)timestamp;
60 - (void)registerCrashReporter; 69 - (void)registerCrashReporter;
@@ -84,17 +93,27 @@ @@ -84,17 +93,27 @@
84 { 93 {
85 self = [super init]; 94 self = [super init];
86 if (self) { 95 if (self) {
87 - // 初始化策略  
88 - _logStrategy = [[[NSUserDefaults standardUserDefaults] objectForKey:kKeyUserDefaultsLogStrategy] intValue];  
89 96
90 - if (_logStrategy == LogStrategyCustom) {  
91 - // 获取上次启动时服务端给的时间间隔  
92 - NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:kKeyUserDefaultsCustomInterval];  
93 - _currentInterval = MAX(kMinInterval, interval);  
94 - } else {  
95 - _currentInterval = 0;  
96 - }  
97 - 97 + /* 修改策略为间隔 5 分钟发送
  98 +
  99 + v3.4
  100 +
  101 + // 初始化策略
  102 + _logStrategy = [[[NSUserDefaults standardUserDefaults] objectForKey:kKeyUserDefaultsLogStrategy] intValue];
  103 +
  104 + if (_logStrategy == LogStrategyCustom) {
  105 + // 获取上次启动时服务端给的时间间隔
  106 + NSTimeInterval interval = [[NSUserDefaults standardUserDefaults] doubleForKey:kKeyUserDefaultsCustomInterval];
  107 + _currentInterval = MAX(kMinInterval, interval);
  108 + } else {
  109 + _currentInterval = 0;
  110 + }
  111 +
  112 + */
  113 +
  114 + _logStrategy = LogStrategyAppLaunch | LogStrategyImmedi;
  115 +// _currentInterval = 5*60;
  116 +
98 YALog(@"logStrategy = %d currentInterval = %0.1f", _logStrategy, _currentInterval); 117 YALog(@"logStrategy = %d currentInterval = %0.1f", _logStrategy, _currentInterval);
99 } 118 }
100 119
@@ -144,12 +163,12 @@ @@ -144,12 +163,12 @@
144 { 163 {
145 YALog(@"app will enter foreground !!"); 164 YALog(@"app will enter foreground !!");
146 self.session = nil; 165 self.session = nil;
147 - [[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:self.appId sessionId:self.session]; 166 + [[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:self.appId sessionId:self.session channelId:self.channelId];
148 } 167 }
149 168
150 - (NSString *)timestamp 169 - (NSString *)timestamp
151 { 170 {
152 - long long now = [[NSDate date] timeIntervalSince1970]; 171 + long long now = [[NSDate date] timeIntervalSince1970] * 1000;//milliseconds
153 long long int date = (long long int)now; 172 long long int date = (long long int)now;
154 return [NSString stringWithFormat:@"%lld", date]; 173 return [NSString stringWithFormat:@"%lld", date];
155 } 174 }
@@ -180,7 +199,7 @@ @@ -180,7 +199,7 @@
180 // 保存策略 199 // 保存策略
181 NSUserDefaults *strategy = [NSUserDefaults standardUserDefaults]; 200 NSUserDefaults *strategy = [NSUserDefaults standardUserDefaults];
182 [strategy setObject: [NSNumber numberWithInteger:logStrategy] forKey:kKeyUserDefaultsLogStrategy]; 201 [strategy setObject: [NSNumber numberWithInteger:logStrategy] forKey:kKeyUserDefaultsLogStrategy];
183 - if (logStrategy == LogStrategyCustom) { 202 + if ((logStrategy & LogStrategyCustom) != 0) {
184 [strategy setObject:[NSNumber numberWithDouble:customInterval] forKey:kKeyUserDefaultsCustomInterval]; 203 [strategy setObject:[NSNumber numberWithDouble:customInterval] forKey:kKeyUserDefaultsCustomInterval];
185 } 204 }
186 [strategy synchronize]; 205 [strategy synchronize];
@@ -196,53 +215,55 @@ @@ -196,53 +215,55 @@
196 构建即时发送模式下数据 215 构建即时发送模式下数据
197 */ 216 */
198 217
199 - [[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:appId sessionId:self.session]; 218 + [[YHAssemblyAssistant sharedInstance] prepareImmediUploadDic:appId sessionId:self.session channelId:self.channelId];
200 219
201 [self registerCrashReporter]; 220 [self registerCrashReporter];
202 221
203 [self registerAppWillEnterForegroundNotification]; 222 [self registerAppWillEnterForegroundNotification];
204 - 223 +
205 /* 224 /*
206 检查发送模式 225 检查发送模式
207 */ 226 */
208 227
209 - if (self.logStrategy == LogStrategyAppLaunch) { // 启动时发送 228 + if ((self.logStrategy & LogStrategyAppLaunch) != 0) { // 启动时发送
210 229
211 [self uploadDiskData]; 230 [self uploadDiskData];
212 231
213 - } else if (self.logStrategy == LogStrategyCustom) { // 间隔发送 232 + }
  233 +
  234 + if ((self.logStrategy & LogStrategyCustom) != 0) { // 间隔发送
214 235
215 [self tryUploadDiskData]; 236 [self tryUploadDiskData];
216 - 237 +
217 self.timer = [NSTimer scheduledTimerWithTimeInterval:self.currentInterval target:self selector:@selector(tryUploadDiskData) userInfo:nil repeats:YES]; 238 self.timer = [NSTimer scheduledTimerWithTimeInterval:self.currentInterval target:self selector:@selector(tryUploadDiskData) userInfo:nil repeats:YES];
218 } 239 }
219 240
220 - 241 +
221 // 从服务端获取新的发送策略,该策略在下一次APP启动后生效 242 // 从服务端获取新的发送策略,该策略在下一次APP启动后生效
222 -// [[YHNetworkService sharedInstance] getNewLogStrategy:nil completionBlock:^(NSDictionary *strategy, NSError *error) {  
223 -// if (strategy) {  
224 -// NSString *logMode = [strategy objectForKey:@"logmode"];  
225 -// NSString *time = [strategy objectForKey:@"time"];  
226 -// NSString *event = [strategy objectForKey:@"event"];  
227 -//  
228 -// YALog(@"logMode = %@, time = %@, event = %@.", logMode, time, event);  
229 -//  
230 -// YHLogStrategy logStrategy;  
231 -// NSTimeInterval customInterval;  
232 -// if ([logMode isEqualToString:@"BATCH"]) {  
233 -// logStrategy = LogStrategyAppLaunch;  
234 -// } else if ([logMode isEqualToString:@"INTERVAL"]) {  
235 -// logStrategy = LogStrategyCustom;  
236 -// } else {  
237 -// logStrategy = LogStrategyImmedi;  
238 -// }  
239 -// customInterval = [time integerValue];  
240 -//  
241 -// [self updateLogStrategy:logStrategy customInterval:customInterval];  
242 -// } else {  
243 -// YALog(@"%@", error);  
244 -// }  
245 -// }]; 243 + // [[YHNetworkService sharedInstance] getNewLogStrategy:nil completionBlock:^(NSDictionary *strategy, NSError *error) {
  244 + // if (strategy) {
  245 + // NSString *logMode = [strategy objectForKey:@"logmode"];
  246 + // NSString *time = [strategy objectForKey:@"time"];
  247 + // NSString *event = [strategy objectForKey:@"event"];
  248 + //
  249 + // YALog(@"logMode = %@, time = %@, event = %@.", logMode, time, event);
  250 + //
  251 + // YHLogStrategy logStrategy;
  252 + // NSTimeInterval customInterval;
  253 + // if ([logMode isEqualToString:@"BATCH"]) {
  254 + // logStrategy = LogStrategyAppLaunch;
  255 + // } else if ([logMode isEqualToString:@"INTERVAL"]) {
  256 + // logStrategy = LogStrategyCustom;
  257 + // } else {
  258 + // logStrategy = LogStrategyImmedi;
  259 + // }
  260 + // customInterval = [time integerValue];
  261 + //
  262 + // [self updateLogStrategy:logStrategy customInterval:customInterval];
  263 + // } else {
  264 + // YALog(@"%@", error);
  265 + // }
  266 + // }];
246 } 267 }
247 268
248 // 记录event 269 // 记录event
@@ -260,12 +281,16 @@ @@ -260,12 +281,16 @@
260 self.event.param = param; 281 self.event.param = param;
261 282
262 // 立即发送策略 283 // 立即发送策略
263 - if (self.logStrategy == LogStrategyImmedi) { 284 + if ((self.logStrategy & LogStrategyImmedi) != 0) {
264 [[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.event]; 285 [[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.event];
265 } else { 286 } else {
266 [[YHAssemblyAssistant sharedInstance] saveItemData:self.event]; 287 [[YHAssemblyAssistant sharedInstance] saveItemData:self.event];
267 } 288 }
268 289
  290 + // 首次安装的首次启动时发送
  291 + if ([eventId isEqualToString:kAnalyticsYB_LAUNCH_APP]) {
  292 + [[YHAssemblyAssistant sharedInstance] uploadFirstLaunchApp];
  293 + }
269 } 294 }
270 295
271 // 记录错误数据 296 // 记录错误数据
@@ -281,34 +306,34 @@ @@ -281,34 +306,34 @@
281 self.error.param = param; 306 self.error.param = param;
282 307
283 // crash 不支持立即发送 308 // crash 不支持立即发送
284 - if (self.logStrategy == LogStrategyImmedi && ![errorType isEqualToString:kErrorTypeCrash]) { 309 + if ((self.logStrategy & LogStrategyImmedi) != 0 && ![errorType isEqualToString:kErrorTypeCrash]) {
285 [[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.error]; 310 [[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.error];
286 } else { 311 } else {
287 [[YHAssemblyAssistant sharedInstance] saveItemData:self.error]; 312 [[YHAssemblyAssistant sharedInstance] saveItemData:self.error];
288 } 313 }
289 } 314 }
290 315
291 -  
292 -//- (void)logError:(NSError *)error  
293 -//{  
294 -// YALog(@"logError %@", error);  
295 -//  
296 -// self.error = [[YHError alloc] init];  
297 -// self.error.uid = self.uid ? self.uid : @"";  
298 -// self.error.ts = [self timestamp];  
299 -// self.error.sid = self.session;  
300 -// self.error.et = error.domain;  
301 -//  
302 -// NSMutableDictionary *param = [NSMutableDictionary dictionary];  
303 -// param[JsonKeyErrorEC] = [NSString stringWithFormat:@"%ld", (long)error.code];  
304 -// param[JsonKeyErrorEI] = error.localizedDescription;  
305 -// self.error.param = param;  
306 -//  
307 -// if (self.logStrategy == LogStrategyImmedi) {  
308 -// [[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.error]; 316 +// 记录Performance
  317 +- (void)logPerformanceWithType:(NSString *)perfType parameters:(NSDictionary *)param
  318 +{
  319 + YALog(@"perfType %@, %@", perfType, param);
  320 +
  321 + self.perfermance = [[YHPerformance alloc] init];
  322 + self.perfermance.type = perfType;
  323 + self.perfermance.uid = self.uid ? self.uid : @"";
  324 + self.perfermance.ts = [self timestamp];
  325 + self.perfermance.sid = self.session;
  326 + self.perfermance.param = param;
  327 +
  328 + // 立即发送策略
  329 +// if ((self.logStrategy & LogStrategyImmedi) != 0) {
  330 +// [[YHAssemblyAssistant sharedInstance] uploadImmedilyWithEvent:self.perfermance];
309 // } else { 331 // } else {
310 -// [[YHAssemblyAssistant sharedInstance] saveItemData:self.error]; 332 +// [[YHAssemblyAssistant sharedInstance] saveItemData:self.perfermance];
311 // } 333 // }
312 -//} 334 +
  335 + // 性能统计事件不需要立即发送
  336 + [[YHAssemblyAssistant sharedInstance]savePerformanceData:self.perfermance];
  337 +}
313 338
314 @end 339 @end
  1 +//
  2 +// YH_Analytics_Evevt.h
  3 +// YH_Mall
  4 +//
  5 +// Created by chen.yanyan on 15/5/11.
  6 +// Copyright (c) 2015年 YOHO. All rights reserved.
  7 +//
  8 +
  9 +#ifndef YH_Mall_YH_Analytics_Evevt_h
  10 +#define YH_Mall_YH_Analytics_Evevt_h
  11 +
  12 +#define kAnalyticsYB_MAIN_LT_CHS @"YB_MAIN_LT_CHS" // 主界面-首页-左上角按钮点击
  13 +
  14 +#define kAnalyticsYB_MAIN_S @"YB_MAIN_S" // 主界面-首页-搜索功能使用
  15 +
  16 +#define kAnalyticsYB_MAIN_RT @"YB_MAIN_RT" // 主界面-首页-右上角按钮点击(扫描)
  17 +
  18 +#define kAnalyticsYB_MAIN_BAN @"YB_MAIN_BAN" // 主界面-首页-banner(点击)
  19 +
  20 +#define kAnalyticsYB_MAIN_BU @"YB_MAIN_BU" // 主界面-首页-栏目
  21 +
  22 +#define kAnalyticsYB_MAIN_BR @"YB_MAIN_BR" // 主界面-首页-热门品牌
  23 +
  24 +#define kAnalyticsYB_MAIN_CAT_COLL @"YB_MAIN_CAT_COLL" // 主界面-首页-潮人搭配
  25 +
  26 +#define kAnalyticsYB_MAIN_CAT_TOPIC @"YB_MAIN_CAT_TOPIC" // 主界面-首页-潮品话题
  27 +
  28 +#define kAnalyticsYB_MAIN_CAT_NAV @"YB_MAIN_CAT_NAV" // 主界面-首页-分类商品类别的点击
  29 +
  30 +#define kAnalyticsYB_MAIN_CAT_RECM_COLL @"YB_MAIN_CAT_RECM_COLL" // 主界面-首页-推荐搭配
  31 +
  32 +#define kAnalyticsYB_MAIN_CAT_NAV_RECPRD @"YB_MAIN_CAT_NAV_RECPRD" // 主界面-首页-可能喜欢
  33 +
  34 +#define kAnalyticsYB_MAIN_CAT_NAV_CUST @"YB_MAIN_CAT_NAV_CUST" // 主界面-首页-自定义推荐
  35 +
  36 +#define kAnalyticsYB_MAIN_CAT_GLOBAL @"YB_MAIN_CAT_GLOBAL" // 主界面-首页-全球购入口
  37 +
  38 +#define kAnalyticsYB_STROLL @"YB_STROLL" // 主界面-逛
  39 +
  40 +#define kAnalyticsYB_STROLL_NAV @"YB_STROLL_NAV" // 主界面-逛-栏目导航
  41 +
  42 +#define kAnalyticsYB_STROLL_VIEWFAV @"YB_STROLL_VIEWFAV" // 主界面-逛-查看收藏
  43 +
  44 +#define kAnalyticsYB_STROLL_FAV @"YB_STROLL_FAV" // 主界面-逛-收藏
  45 +
  46 +#define kAnalyticsYB_STROLL_LIKE @"YB_STROLL_LIKE" // 主界面-逛-赞
  47 +
  48 +#define kAnalyticsYB_STROLL_CONT @"YB_STROLL_CONT" // 主界面-逛-内容浏览
  49 +
  50 +#define kAnalyticsYB_STROLL_CONT_GD @"YB_STROLL_CONT_GD" // 主界面-逛-内容页-赞
  51 +
  52 +#define kAnalyticsYB_STROLL_CONT_LK @"YB_STROLL_CONT_LK" // 主界面-逛-内容页-喜欢
  53 +
  54 +#define kAnalyticsYB_STROLL_CONT_CM @"YB_STROLL_CONT_CM" // 主界面-逛-内容页-评论
  55 +
  56 +#define kAnalyticsYB_STROLL_CONT_SHR @"YB_STROLL_CONT_SHR" // 主界面-逛-内容页-分享
  57 +
  58 +#define kAnalyticsYB_STROLL_CONT_SHTYP @"YB_STROLL_CONT_SHTYP" // 主界面-逛-内容页-分享方式
  59 +
  60 +#define kAnalyticsYB_STROLL_CONT_BRND @"YB_STROLL_CONT_BRND" // 主界面-逛-内容页-关联品牌
  61 +
  62 +#define kAnalyticsYB_STROLL_CONT_REC_PRD @"YB_STROLL_CONT_REC_PRD" // 主界面-逛-内容页-相关推荐商品
  63 +
  64 +#define kAnalyticsYB_STROLL_CONT_REC_FAV @"YB_STROLL_CONT_REC_FAV" // 主界面-逛-内容页-相关推荐收藏
  65 +
  66 +#define kAnalyticsYB_STROLL_CONT_REC_TAG @"YB_STROLL_CONT_REC_TAG" // 主界面-逛-内容页-标签
  67 +
  68 +#define kAnalyticsYB_MAIN_BO @"YB_MAIN_BO" // 主界面-首页-底部图片的点击
  69 +
  70 +#define kAnalyticsYB_FUNC_PUSH @"YB_FUNC_PUSH" // 点击推送
  71 +
  72 +#define kAnalyticsYB_ENTER_CHOICE @"YB_ENTER_CHOICE" // 入口界面-入口选择
  73 +
  74 +#define kAnalyticsYB_SC @"YB_SC" // 主界面-购物车
  75 +
  76 +#define kAnalyticsYB_MAIN_SHOW @"YB_MAIN_SHOW" // 主界面-首页
  77 +
  78 +#define kAnalyticsYB_FUNC_SC_DRIFT @"YB_FUNC_SC_DRIFT" // 功能应用-购物车
  79 +
  80 +#define kAnalyticsYB_CATEGORY @"YB_CATEGORY" //主界面-分类
  81 +
  82 +#define kAnalyticsYB_CATEGORY_CLS_TAB @"YB_CATEGORY_CLS_TAB" // 主界面-分类-品类TAB
  83 +
  84 +#define kAnalyticsYB_CATEGORY_BRAND_TAB @"YB_CATEGORY_BRAND_TAB" // 主界面-分类-品类品牌TAB
  85 +
  86 +#define kAnalyticsYB_CATEGORY_BRAND_TAB_FAV @"YB_CATEGORY_BRAND_TAB_FAV" // 主界面-分类-品牌-主界面品牌列表_关注-收藏品牌
  87 +
  88 +#define kAnalyticsYB_CATEGORY_ATT_TAB @"YB_CATEGORY_ATT_TAB" // 主界面-分类-品类关注TAB
  89 +
  90 +#define kAnalyticsYB_CATEGORY_CAT_LIST @"YB_CATEGORY_CAT_LIST" // 主界面-分类-品类列表
  91 +
  92 +#define kAnalyticsYB_CATEGORY_BRAND_LIST_BAN @"YB_CATEGORY_BRAND_LIST_BAN" // 主界面-分类-品牌-主界面品牌列表_band
  93 +
  94 +#define kAnalyticsYB_CATEGORY_BRAND_LIST_TEXT @"YB_CATEGORY_BRAND_LIST_TEXT" // 主界面-分类-品牌-主界面品牌列表
  95 +
  96 +#define kAnalyticsYB_CATEGORY_BRAND_LIST_ATT @"YB_CATEGORY_BRAND_LIST_ATT" // 主界面-分类-品牌-主界面品牌列表_关注
  97 +
  98 +#define kAnalyticsYB_CATEGORY_BRAND_LIST_ATT_FAV @"YB_CATEGORY_BRAND_LIST_ATT_FAV" // 主界面-分类-品牌-主界面品牌列表_关注-收藏品牌
  99 +
  100 +#define kAnalyticsYB_CATEGORY_BRAND_LIST_BR @"YB_CATEGORY_BRAND_LIST_BR" // 主界面-分类-品牌-主界面品牌列表_热门品牌
  101 +
  102 +#define kAnalyticsYB_GDS_BR_INF @"YB_GDS_BR_INF" // 品牌页-顶部品牌介绍信息(顶部按钮)
  103 +
  104 +#define kAnalyticsYB_GDS_LIST @"YB_GDS_LIST" // 商品列表页
  105 +
  106 +#define kAnalyticsYB_GDS_LIST_CHG @"YB_GDS_LIST_CHG" // 品牌页-商品筛选按钮
  107 +
  108 +#define kAnalyticsYB_GDS_LIST_BR_FAV @"YB_GDS_LIST_BR_FAV" // 品牌页-收藏品牌
  109 +
  110 +#define kAnalyticsYB_GDS_LIST_CHG_RES @"YB_GDS_LIST_CHG_RES" // 品牌页-商品筛选
  111 +
  112 +#define kAnalyticsYB_GDS_LIST_SORT @"YB_GDS_LIST_SORT" // 品牌页-排序
  113 +
  114 +#define kAnalyticsYB_GDS_DT_INFO @"YB_GDS_DT_INFO" // 商品详情页
  115 +
  116 +#define kAnalyticsYB_GDS_DT_BUY @"YB_GDS_DT_BUY" // 商品详情页-加入购物车
  117 +
  118 +#define kAnalyticsYB_GDS_DT_SEL @"YB_GDS_DT_SEL" // 商品详情页-选择SKCSKN
  119 +
  120 +#define kAnalyticsYB_GDS_DT_TOBUY @"YB_GDS_DT_TOBUY" // 商品详情页-选择完成后的加购物车
  121 +
  122 +#define kAnalyticsYB_GDS_DT_FAV @"YB_GDS_DT_FAV" // 商品详情页-喜欢商品
  123 +
  124 +#define kAnalyticsYB_GDS_DT_ASK @"YB_GDS_DT_ASK" // 商品详情页-咨询商品
  125 +
  126 +#define kAnalyticsYB_GDS_DT_BR @"YB_GDS_DT_BR" // 商品详情页-品牌店铺
  127 +
  128 +#define kAnalyticsYB_GDS_DT_SHARE @"YB_GDS_DT_SHARE" // 商品详情页-分享商品
  129 +
  130 +#define kAnalyticsYB_GDS_SHARE_TYP @"YB_GDS_SHARE_TYP" // 分享商品方式
  131 +
  132 +#define kAnalyticsYB_SC_LOGIN @"YB_SC_LOGIN" // 购物车-登陆
  133 +
  134 +#define kAnalyticsYB_SC_NOGDS @"YB_SC_NOGDS" // 购物车-随便逛逛
  135 +
  136 +#define kAnalyticsYB_SC_TOPAY @"YB_SC_TOPAY" // 购物车-结算
  137 +
  138 +#define kAnalyticsYB_SC_ORD @"YB_SC_ORD" // 购物车-生成订单
  139 +
  140 +#define kAnalyticsYB_SC_PAY @"YB_SC_PAY" // 购物车-确认付款
  141 +
  142 +#define kAnalyticsYB_SC_PAY_RES @"YB_SC_PAY_RES" // 购物车-付款结果
  143 +
  144 +#define kAnalyticsYB_MY @"YB_MY" // 主界面-我的
  145 +
  146 +#define kAnalyticsYB_MY_ORD @"YB_MY_ORD" // 我的订单
  147 +
  148 +#define kAnalyticsYB_MY_WTPAY @"YB_MY_WTPAY" // 待付款
  149 +
  150 +#define kAnalyticsYB_MY_WTOUT @"YB_MY_WTOUT" // 待发货
  151 +
  152 +#define kAnalyticsYB_MY_WTREV @"YB_MY_WTREV" // 待收货
  153 +
  154 +#define kAnalyticsYB_MY_WTAPP @"YB_MY_WTAPP" // 待评价
  155 +
  156 +#define kAnalyticsYB_MY_MESS @"YB_MY_MESS" // 消息中心
  157 +
  158 +#define kAnalyticsYB_MY_FAVBRND @"YB_MY_FAVBRND" // 收藏的品牌
  159 +
  160 +#define kAnalyticsYB_MY_FAVPRD @"YB_MY_FAVPRD" // 收藏的商品
  161 +
  162 +#define kAnalyticsYB_MY_BROWSE @"YB_MY_BROWSE" // 浏览记录
  163 +
  164 +#define kAnalyticsYB_MY_GLOBAL @"YB_MY_GLOBAL" // 全球购订单
  165 +
  166 +#define kAnalyticsYB_MY_YOHO @"YB_MY_YOHO" // YOHO币
  167 +
  168 +#define kAnalyticsYB_MY_COUP @"YB_MY_COUP" // 优惠券
  169 +
  170 +#define kAnalyticsYB_MY_BILL @"YB_MY_BILL" // 会员账单
  171 +
  172 +#define kAnalyticsYB_MY_ADRS @"YB_MY_ADRS" // 地址管理
  173 +
  174 +#define kAnalyticsYB_MY_HELP @"YB_MY_HELP" // 帮助中心
  175 +
  176 +#define kAnalyticsYB_MY_ABOUT @"YB_MY_ABOUT" // 关于我们
  177 +
  178 +#define kAnalyticsYB_MY_FBACK @"YB_MY_FBACK" // 意见反馈
  179 +
  180 +#define kAnalyticsYB_MY_INV @"YB_MY_INV" // 邀请好友
  181 +
  182 +#define kAnalyticsYB_MY_OLCS @"YB_MY_OLCS" // 在线客服
  183 +
  184 +#define kAnalyticsYB_MY_MORE_APP @"YB_MY_MORE_APP" // 更多应用
  185 +
  186 +#define kAnalyticsYB_MY_LOGIN @"YB_MY_LOGIN" // 登录
  187 +
  188 +#define kAnalyticsYB_MY_LOGOUT @"YB_MY_LOGOUT" // 登出
  189 +
  190 +#define kAnalyticsYB_ENTER_FOREGROUND @"YB_ENTER_FOREGROUND" // 进入前台
  191 +
  192 +#define kAnalyticsYB_ENTER_BACKGROUND @"YB_ENTER_BACKGROUND" // 进入后台
  193 +
  194 +#define kAnalyticsYB_LAUNCH_APP @"YB_LAUNCH_APP" // 登陆APP
  195 +
  196 +#define kAnalyticsYB_EXIT_APP @"YB_EXIT_APP" // 退出APP
  197 +
  198 +#define kAnalyticsYB_UTM_SOURCE @"YB_UTM_SOURCE" // 推广渠道
  199 +
  200 +#define kAnalyticsYB_GLOBAL_GDS_LIST @"YB_GLOBAL_GDS_LIST" // 全球购-商品列表
  201 +
  202 +#define kAnalyticsYB_GLOBAL_CATEGORY @"YB_GLOBAL_CATEGORY" // 全球购-分类
  203 +
  204 +#define kAnalyticsYB_GLOBAL_BRAND @"YB_GLOBAL_BRAND" // 全球购-品牌
  205 +
  206 +#define kAnalyticsYB_GLOBAL_GDS_DT @"YB_GLOBAL_GDS_DT" // 全球购-商品详情
  207 +
  208 +#define kAnalyticsYB_GLOBAL_GDS_DT_BR @"YB_GLOBAL_GDS_DT_BR" // 全球购-商品详情页-品牌店铺
  209 +
  210 +#define kAnalyticsYB_GLOBAL_GDS_DT_SEL @"YB_GLOBAL_GDS_DT_SEL" // 全球购-商品详情-选择颜色尺码
  211 +
  212 +#define kAnalyticsYB_GLOBAL_GDS_DT_BUY @"YB_GLOBAL_GDS_DT_BUY" // 全球购-商品详情-立即购买
  213 +
  214 +#define kAnalyticsYB_GLOBAL_SC_LOGIN @"YB_GLOBAL_SC_LOGIN" // 全球购-购物车-登陆
  215 +
  216 +#define kAnalyticsYB_GLOBAL_SC_NOGDS @"YB_GLOBAL_SC_NOGDS" // 全球购-购物车-随便逛逛
  217 +
  218 +#define kAnalyticsYB_GLOBAL_SC_TOPAY @"YB_GLOBAL_SC_TOPAY" // 全球购-购物车-结算
  219 +
  220 +#define kAnalyticsYB_GLOBAL_SC_ORD @"YB_GLOBAL_SC_ORD" // 全球购-购物车-生成订单
  221 +
  222 +#define kAnalyticsYB_GLOBAL_SC_PAY @"YB_GLOBAL_SC_PAY" // 全球购-购物车-确认付款
  223 +
  224 +#define kAnalyticsYB_GLOBAL_SC_PAY_RES @"YB_GLOBAL_SC_PAY_RES" // 全球购-购物车-付款结果
  225 +
  226 +#define kAnalyticsYB_GLOBAL_SC_IDCARD @"YB_GLOBAL_SC_IDCARD" // 全球购-购物车-添加身份证
  227 +
  228 +#define kAnalyticsYB_GLOBAL_AC_IDCARD @"YB_GLOBAL_AC_IDCARD" // 全球购-地址选择-添加身份证
  229 +
  230 +#define kAnalyticsYB_GLOBAL_AE_IDNUM @"YB_GLOBAL_AE_IDNUM" // 全球购-地址编辑-身份证号
  231 +
  232 +#define kAnalyticsYB_GLOBAL_AE_IDEYE @"YB_GLOBAL_AE_IDEYE" // 全球购-地址编辑-眼睛
  233 +
  234 +#define kAnalyticsYB_GLOBAL_AE_IDPOS @"YB_GLOBAL_AE_IDPOS" // 全球购-地址编辑-身份证正面
  235 +
  236 +#define kAnalyticsYB_GLOBAL_AE_IDNEG @"YB_GLOBAL_AE_IDNEG" // 全球购-地址编辑-身份证反面
  237 +
  238 +#define kAnalyticsYB_GLOBAL_ORD_CANCEL @"YB_GLOBAL_ORD_CANCEL" // 全球购-订单-取消订单
  239 +
  240 +#define kAnalyticsYB_GLOBAL_ORD_PAY @"YB_GLOBAL_ORD_PAY" // 全球购-订单-立即支付
  241 +
  242 +#define kAnalyticsYB_GLOBAL_ORD_LOGIST @"YB_GLOBAL_ORD_LOGIST" // 全球购-订单-查看物流
  243 +
  244 +#define kAnalyticsYB_GLOBAL_ORD_DEL @"YB_GLOBAL_ORD_DEL" // 全球购-订单-删除订单
  245 +
  246 +#endif
@@ -164,7 +164,7 @@ @@ -164,7 +164,7 @@
164 - (void)testPrepareImmediUploadDic { 164 - (void)testPrepareImmediUploadDic {
165 NSLog(@"%@ start", self.name); 165 NSLog(@"%@ start", self.name);
166 166
167 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 167 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
168 168
169 NSDictionary *deviceJsonDic = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeDevice]; 169 NSDictionary *deviceJsonDic = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeDevice];
170 NSMutableArray *statusJsonArray = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus]; 170 NSMutableArray *statusJsonArray = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];
@@ -182,7 +182,7 @@ @@ -182,7 +182,7 @@
182 182
183 OCMExpect([networkMock setReachabilityStatusChangeBlock:[OCMArg any]]); 183 OCMExpect([networkMock setReachabilityStatusChangeBlock:[OCMArg any]]);
184 184
185 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 185 +// [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];
186 186
187 OCMVerifyAll(networkMock); 187 OCMVerifyAll(networkMock);
188 188
@@ -197,7 +197,7 @@ @@ -197,7 +197,7 @@
197 OCMStub(ClassMethod([locationManageMock locationServicesEnabled])).andReturn(YES); 197 OCMStub(ClassMethod([locationManageMock locationServicesEnabled])).andReturn(YES);
198 OCMExpect([locationManageMock startUpdatingLocation]); 198 OCMExpect([locationManageMock startUpdatingLocation]);
199 199
200 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 200 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
201 201
202 OCMVerifyAll(locationManageMock); 202 OCMVerifyAll(locationManageMock);
203 203
@@ -212,7 +212,7 @@ @@ -212,7 +212,7 @@
212 OCMStub(ClassMethod([locationManageMock locationServicesEnabled])).andReturn(NO); 212 OCMStub(ClassMethod([locationManageMock locationServicesEnabled])).andReturn(NO);
213 [[locationManageMock reject] startUpdatingLocation]; 213 [[locationManageMock reject] startUpdatingLocation];
214 214
215 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 215 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
216 216
217 OCMVerifyAll(locationManageMock); 217 OCMVerifyAll(locationManageMock);
218 218
@@ -231,7 +231,7 @@ @@ -231,7 +231,7 @@
231 - (void)testUpdateImmediUploadDicSuccess { 231 - (void)testUpdateImmediUploadDicSuccess {
232 NSLog(@"%@ start", self.name); 232 NSLog(@"%@ start", self.name);
233 233
234 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 234 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
235 [assembly updateImmediUploadDic]; 235 [assembly updateImmediUploadDic];
236 236
237 NSMutableArray *statusJsonArray = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus]; 237 NSMutableArray *statusJsonArray = [assembly.immediUploadItemDic objectForKey:JsonKeyDataTypeStatus];
@@ -353,7 +353,7 @@ @@ -353,7 +353,7 @@
353 - (void)testUploadImmedilyWithEvent { 353 - (void)testUploadImmedilyWithEvent {
354 NSLog(@"%@ start", self.name); 354 NSLog(@"%@ start", self.name);
355 355
356 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 356 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
357 YHEvent *data = [YHEvent new]; 357 YHEvent *data = [YHEvent new];
358 data.op = @"testEvent"; 358 data.op = @"testEvent";
359 OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]); 359 OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
@@ -373,7 +373,7 @@ @@ -373,7 +373,7 @@
373 - (void)testUploadImmedilyWithError { 373 - (void)testUploadImmedilyWithError {
374 NSLog(@"%@ start", self.name); 374 NSLog(@"%@ start", self.name);
375 375
376 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 376 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
377 YHError *data = [YHError new]; 377 YHError *data = [YHError new];
378 OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]); 378 OCMExpect([networkMock uploadLogData:[OCMArg any] completionBlock:[OCMArg any]]);
379 379
@@ -392,7 +392,7 @@ @@ -392,7 +392,7 @@
392 - (void)testUploadImmedilyWithDevice { 392 - (void)testUploadImmedilyWithDevice {
393 NSLog(@"%@ start", self.name); 393 NSLog(@"%@ start", self.name);
394 394
395 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 395 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
396 YHDevice *data = [YHDevice new]; 396 YHDevice *data = [YHDevice new];
397 397
398 XCTAssertThrows([assembly uploadImmedilyWithEvent:data]); 398 XCTAssertThrows([assembly uploadImmedilyWithEvent:data]);
@@ -403,7 +403,7 @@ @@ -403,7 +403,7 @@
403 - (void)testUploadImmedilyWithStatus { 403 - (void)testUploadImmedilyWithStatus {
404 NSLog(@"%@ start", self.name); 404 NSLog(@"%@ start", self.name);
405 405
406 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 406 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
407 YHStatus *data = [YHStatus new]; 407 YHStatus *data = [YHStatus new];
408 408
409 XCTAssertThrows([assembly uploadImmedilyWithEvent:data]); 409 XCTAssertThrows([assembly uploadImmedilyWithEvent:data]);
@@ -499,7 +499,7 @@ @@ -499,7 +499,7 @@
499 OCMExpect([partialMock updateLocation:newLocation]).andReturn(YES); 499 OCMExpect([partialMock updateLocation:newLocation]).andReturn(YES);
500 OCMExpect([partialMock updateImmediUploadDic]); 500 OCMExpect([partialMock updateImmediUploadDic]);
501 501
502 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"]; 502 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
503 [(FakeLocationManager *)assembly.locationManager updateLocations:@[newLocation]]; 503 [(FakeLocationManager *)assembly.locationManager updateLocations:@[newLocation]];
504 504
505 OCMVerifyAll(partialMock); 505 OCMVerifyAll(partialMock);
@@ -517,7 +517,7 @@ @@ -517,7 +517,7 @@
517 OCMExpect([partialMock updateLocation:newLocation]).andReturn(NO); 517 OCMExpect([partialMock updateLocation:newLocation]).andReturn(NO);
518 [[partialMock reject] updateImmediUploadDic]; 518 [[partialMock reject] updateImmediUploadDic];
519 519
520 - [assembly prepareImmediUploadDic:@"appId" sessionId:@"seesionId"]; 520 + [assembly prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
521 [(FakeLocationManager *)assembly.locationManager updateLocations:@[newLocation]]; 521 [(FakeLocationManager *)assembly.locationManager updateLocations:@[newLocation]];
522 522
523 OCMVerifyAll(partialMock); 523 OCMVerifyAll(partialMock);
@@ -130,8 +130,8 @@ @@ -130,8 +130,8 @@
130 - (void)testPrepareImmediUploadDicMethod { 130 - (void)testPrepareImmediUploadDicMethod {
131 NSLog(@"%@ start", self.name); 131 NSLog(@"%@ start", self.name);
132 132
133 - [[mock expect] prepareImmediUploadDic:@"appId" sessionId:@"sessionId"];  
134 - [mock prepareImmediUploadDic:@"appId" sessionId:@"sessionId"]; 133 + [[mock expect] prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
  134 + [mock prepareImmediUploadDic:@"appId" sessionId:@"sessionId" channelId:@"channelId"];
135 [mock verify]; 135 [mock verify];
136 136
137 NSLog(@"%@ end", self.name); 137 NSLog(@"%@ end", self.name);
@@ -75,7 +75,7 @@ @@ -75,7 +75,7 @@
75 NSLog(@"%@ start", self.name); 75 NSLog(@"%@ start", self.name);
76 76
77 OCMExpect(ClassMethod([crashReporterMock sharedInstance])); 77 OCMExpect(ClassMethod([crashReporterMock sharedInstance]));
78 - OCMExpect([assemblyAssistantMock prepareImmediUploadDic:@"appId" sessionId:[OCMArg any]]); 78 + OCMExpect([assemblyAssistantMock prepareImmediUploadDic:@"appId" sessionId:[OCMArg any] channelId:[OCMArg any]]);
79 79
80 [analytics startWithAppId:@"appId"]; 80 [analytics startWithAppId:@"appId"];
81 81