Authored by 朱小军

Merge branch '627master' into 'master'

627master



See merge request !23
@@ -39,6 +39,7 @@ Pod::Spec.new do |s| @@ -39,6 +39,7 @@ Pod::Spec.new do |s|
39 "${PODS_ROOT}/../YH_Mall/Dependences/PowerfulBannerView", 39 "${PODS_ROOT}/../YH_Mall/Dependences/PowerfulBannerView",
40 ].join(' ') 40 ].join(' ')
41 } 41 }
  42 + ss.dependency "YH_FoundationKit"
42 end 43 end
43 44
44 s.subspec "AOP" do |ss| 45 s.subspec "AOP" do |ss|
@@ -57,6 +58,7 @@ Pod::Spec.new do |s| @@ -57,6 +58,7 @@ Pod::Spec.new do |s|
57 ss.dependency "YHEventReport/Core" 58 ss.dependency "YHEventReport/Core"
58 ss.dependency "YHEventReport/AOP" 59 ss.dependency "YHEventReport/AOP"
59 ss.dependency "YHEventReport/EventCollector" 60 ss.dependency "YHEventReport/EventCollector"
  61 + ss.dependency "YH_FoundationKit"
60 ss.source_files = 'YHEventReport/YHEventReport/YHEventReport/YH_EventCache/*.{h,m}' 62 ss.source_files = 'YHEventReport/YHEventReport/YHEventReport/YH_EventCache/*.{h,m}'
61 end 63 end
62 64
@@ -300,8 +300,8 @@ @@ -300,8 +300,8 @@
300 2EEBB0A220A978460069D069 /* YH_DeviceInfo */ = { 300 2EEBB0A220A978460069D069 /* YH_DeviceInfo */ = {
301 isa = PBXGroup; 301 isa = PBXGroup;
302 children = ( 302 children = (
303 - 2EEBB0A320A978C60069D069 /* YH_DeviceInfoMonitor.h */,  
304 2EEBB0A420A978C60069D069 /* YH_DeviceInfoMonitor.m */, 303 2EEBB0A420A978C60069D069 /* YH_DeviceInfoMonitor.m */,
  304 + 2EEBB0A320A978C60069D069 /* YH_DeviceInfoMonitor.h */,
305 ); 305 );
306 path = YH_DeviceInfo; 306 path = YH_DeviceInfo;
307 sourceTree = "<group>"; 307 sourceTree = "<group>";
@@ -121,10 +121,6 @@ @@ -121,10 +121,6 @@
121 121
122 + (NSDictionary *)factoryEventAppInfo:(YH_PerformanceAppInfo*)appInfo 122 + (NSDictionary *)factoryEventAppInfo:(YH_PerformanceAppInfo*)appInfo
123 { 123 {
124 - if (IsNilOrNull(appInfo)) {  
125 - return nil;  
126 - }  
127 -  
128 NSDictionary *commonInfo = [NSDictionary dictionaryWithObjectsAndKeys: 124 NSDictionary *commonInfo = [NSDictionary dictionaryWithObjectsAndKeys:
129 IsStrEmpty(appInfo.ps)?@"":appInfo.ps,YOHOAppReportKeyPS, 125 IsStrEmpty(appInfo.ps)?@"":appInfo.ps,YOHOAppReportKeyPS,
130 IsStrEmpty(appInfo.av)?@"":appInfo.av,YOHOAppReportKeyAV, 126 IsStrEmpty(appInfo.av)?@"":appInfo.av,YOHOAppReportKeyAV,
@@ -8,9 +8,9 @@ @@ -8,9 +8,9 @@
8 8
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 10
  11 +@class YH_Reachability;
11 @interface YH_PerformanceAppInfo : NSObject 12 @interface YH_PerformanceAppInfo : NSObject
12 13
13 -@property (copy, nonatomic) NSString *ak; // App key 应用标识  
14 @property (copy, nonatomic) NSString *udid; // 设备标识 14 @property (copy, nonatomic) NSString *udid; // 设备标识
15 @property (copy, nonatomic) NSString *ch; // 推广渠道号 15 @property (copy, nonatomic) NSString *ch; // 推广渠道号
16 @property (copy, nonatomic) NSString *os; // 操作系统 16 @property (copy, nonatomic) NSString *os; // 操作系统
@@ -28,6 +28,8 @@ @@ -28,6 +28,8 @@
28 @property (copy, nonatomic) NSString *mcc; //移动设备国家代码(Mobile Country Code,MCC) 28 @property (copy, nonatomic) NSString *mcc; //移动设备国家代码(Mobile Country Code,MCC)
29 @property (copy, nonatomic) NSString *mnc; //运营商码 移动设备网络代码英语:Mobile Network Code,MNC 29 @property (copy, nonatomic) NSString *mnc; //运营商码 移动设备网络代码英语:Mobile Network Code,MNC
30 30
31 --(void)resetSessionID; 31 +- (void)resetSessionID;
  32 +- (void)update;
  33 +- (void)updateNetStatusWithReachability:(YH_Reachability *)reachability;
32 34
33 @end 35 @end
@@ -18,118 +18,72 @@ @@ -18,118 +18,72 @@
18 #import "YH_EventUtil.h" 18 #import "YH_EventUtil.h"
19 #import "YHEventReport.h" 19 #import "YHEventReport.h"
20 #import "NSString+ER_URL.h" 20 #import "NSString+ER_URL.h"
  21 +#import <UserNotifications/UserNotifications.h>
  22 +#import "YH_Reachability.h"
21 23
22 @implementation YH_PerformanceAppInfo 24 @implementation YH_PerformanceAppInfo
23 25
24 -- (id)init  
25 -{ 26 +- (id)init {
26 self = [super init]; 27 self = [super init];
27 if (self) { 28 if (self) {
28 - self.ps = @"0";  
29 - self.idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];  
30 - [self loadCarrierInfo]; 29 + _ps = @"0";
  30 + _net = @"0";
  31 + [self update];
31 } 32 }
32 -  
33 return self; 33 return self;
34 } 34 }
35 35
36 --(void)resetSessionID{  
37 - if (self.sid) {  
38 - self.sid = nil;  
39 - }  
40 -}  
41 -  
42 -- (NSString *)ca {  
43 - if (!_ca || [_ca isEqualToString:kCarrierCodeChinaUnknown]) {  
44 - [self loadCarrierInfo];  
45 - }  
46 - return _ca;  
47 -}  
48 -  
49 -- (NSString*)ch  
50 -{  
51 - _ch = [[YHEventReport sharedInstance] channelId];  
52 - return _ch; 36 +- (void)update {
  37 + self.idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString] ?: @"";
  38 + self.ch = [[YHEventReport sharedInstance] channelId];
  39 + self.udid = [OpenUDID value];
  40 + self.os = @"iOS";
  41 + self.osv = [[UIDevice currentDevice] systemVersion] ?: @"Unknown";
  42 + self.av =[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] ?: @"";
  43 + self.ab = [[NSBundle mainBundle] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey] ?: @"";
  44 + [self loadCarrierInfo];
  45 + [self loadPushStatus];
  46 + [self loadDm];
53 } 47 }
54 48
55 --(NSString *)udid{  
56 - if (!_udid) {  
57 - _udid = [OpenUDID value];  
58 - }  
59 -  
60 - return _udid;  
61 -}  
62 -  
63 --(NSString *)os{  
64 - if (!_os) {  
65 - _os = @"iOS"; 49 +- (void)loadPushStatus {
  50 + if (IOS10) {
  51 + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  52 + [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) {
  53 + switch (settings.authorizationStatus) {
  54 + case UNAuthorizationStatusNotDetermined:
  55 + case UNAuthorizationStatusDenied:
  56 + self.ps = @"0";
  57 + break;
  58 + default:
  59 + self.ps = @"1";
  60 + break;
  61 + }
  62 + }];
  63 + } else {
  64 + if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {
  65 + self.ps = @"1";
  66 + }else {
  67 + self.ps = @"0";
  68 + }
66 } 69 }
67 - return _os;  
68 } 70 }
69 71
70 --(NSString *)osv{  
71 - if (!_osv) {  
72 - _osv= [[UIDevice currentDevice] systemVersion];  
73 - if (!_osv) {  
74 - _osv = @"Unknown";  
75 - }  
76 - }  
77 - return _osv; 72 +-(void)resetSessionID{
  73 + _sid = nil;
78 } 74 }
79 75
80 --(NSString *)dm{ 76 +-(void)loadDm{
81 if (!_dm) { 77 if (!_dm) {
82 _dm = [JTSHardwareInfo hardwareIdentifier]; 78 _dm = [JTSHardwareInfo hardwareIdentifier];
83 NSRange range = [_dm rangeOfString:@","]; 79 NSRange range = [_dm rangeOfString:@","];
84 if (range.location != NSNotFound) { 80 if (range.location != NSNotFound) {
85 _dm = [_dm stringByReplacingCharactersInRange:range withString:@"_"]; 81 _dm = [_dm stringByReplacingCharactersInRange:range withString:@"_"];
86 } 82 }
87 -  
88 if (!_dm) { 83 if (!_dm) {
89 _dm = @""; 84 _dm = @"";
90 } 85 }
91 } 86 }
92 - return _dm;  
93 -}  
94 -  
95 --(NSString *)av{  
96 - if (!_av) {  
97 - _av =[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];  
98 - if (!_av) {  
99 - _av = @"";  
100 - }  
101 - }  
102 - return _av;  
103 -}  
104 -  
105 --(NSString *)ab{  
106 - if (!_ab) {  
107 - _ab = [[NSBundle mainBundle] objectForInfoDictionaryKey:(__bridge NSString *)kCFBundleVersionKey];  
108 - if (!_ab) {  
109 - _ab = @"";  
110 - }  
111 - }  
112 - return _ab;  
113 -}  
114 -  
115 --(NSString *)net{  
116 - if (!_net) {  
117 - YH_Reachability *wifi = [YH_Reachability reachabilityForLocalWiFi];  
118 - YH_Reachability *conn = [YH_Reachability reachabilityForInternetConnection];  
119 - if ([conn currentReachabilityStatus] == YHNetworkStatusNotReachable)  
120 - {  
121 - _net =@"0";  
122 - }  
123 - else  
124 - {  
125 - if ([wifi currentReachabilityStatus] == YHNetworkStatusReachableViaWiFi) {  
126 - _net = @"1";  
127 - }else{  
128 - _net = @"4";  
129 - }  
130 - }  
131 - }  
132 - return _net;  
133 } 87 }
134 88
135 - (void)loadCarrierInfo 89 - (void)loadCarrierInfo
@@ -168,6 +122,16 @@ @@ -168,6 +122,16 @@
168 _ca = [currentCa copy]; 122 _ca = [currentCa copy];
169 } 123 }
170 124
  125 +- (void)updateNetStatusWithReachability:(YH_Reachability *)reachability {
  126 + if (reachability.currentReachabilityStatus == YHNetworkStatusNotReachable) {
  127 + self.net = @"0";
  128 + } else if (reachability.currentReachabilityStatus == YHNetworkStatusReachableViaWiFi) {
  129 + self.net = @"1";
  130 + } else {
  131 + self.net = @"4";
  132 + }
  133 +}
  134 +
171 -(NSString *)uid{ 135 -(NSString *)uid{
172 _uid = [[YHEventReport sharedInstance] uid]; 136 _uid = [[YHEventReport sharedInstance] uid];
173 return [_uid yh_md5String]; 137 return [_uid yh_md5String];
@@ -48,11 +48,6 @@ @@ -48,11 +48,6 @@
48 - (void)reportWithPointType:(YHPointType)type pointName:(YHEventReportPointName)name parameters:(NSDictionary *)param; 48 - (void)reportWithPointType:(YHPointType)type pointName:(YHEventReportPointName)name parameters:(NSDictionary *)param;
49 49
50 /** 50 /**
51 - * 上报http请求,请在 setTaskDidCompleteBlock 中调用  
52 - */  
53 -- (void)reportWithHttpRequestFinish:(NSURLRequest*)request response:(NSURLResponse*)response error:(NSError*)error;  
54 -  
55 -/**  
56 * @property 51 * @property
57 * 52 *
58 * @abstract 53 * @abstract
@@ -54,12 +54,6 @@ static NSArray *kYHEventReportIgnoredViewControllerArray; @@ -54,12 +54,6 @@ static NSArray *kYHEventReportIgnoredViewControllerArray;
54 54
55 @implementation YHEventReport 55 @implementation YHEventReport
56 56
57 -/**  
58 - * @abstract  
59 - * 返回初始化好的单例  
60 - *  
61 - * @return 返回的单例  
62 - */  
63 + (YHEventReport *)sharedInstance{ 57 + (YHEventReport *)sharedInstance{
64 static YHEventReport *sharedInstance = nil; 58 static YHEventReport *sharedInstance = nil;
65 59
@@ -231,25 +225,6 @@ static NSArray *kYHEventReportIgnoredViewControllerArray; @@ -231,25 +225,6 @@ static NSArray *kYHEventReportIgnoredViewControllerArray;
231 } 225 }
232 } 226 }
233 227
234 -  
235 -- (void)reportWithHttpRequestFinish:(NSURLRequest*)request response:(NSURLResponse*)response error:(NSError*)error  
236 -{  
237 - @try {  
238 - NSString *hostInHTTPField = [request.allHTTPHeaderFields objectForKey:@"Host"];  
239 - if ([YHEventReport sharedInstance].isPerformanceTrackEnabled && [YHEventReport sharedInstance].isHttpPerformanceTrackEnable && !error && ([[request.URL host] isEqualToString:YHEventReportHttpHost] || [hostInHTTPField isEqualToString:YHEventReportHttpHost])) {  
240 - NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;  
241 - NSDictionary *httpResponseHeaderFields = [httpResponse allHeaderFields];  
242 - NSString *contentLength = [NSString stringWithFormat:@"%lld",[[httpResponseHeaderFields objectForKey:@"Content-Length"] longLongValue]];  
243 - NSString *statusCode = [NSString stringWithFormat:@"%ld",(long)httpResponse.statusCode];  
244 - NSString *HTTPBodyStr = [[NSString alloc]initWithData:request.HTTPBody encoding:NSUTF8StringEncoding];  
245 -  
246 - [[YH_EventCollector sharedInstance] timeEventEndWithRequestUrl:[request.URL absoluteString] HTTPMethod:request.HTTPMethod statusCode:statusCode contentLength:contentLength HTTPBodyStr:HTTPBodyStr];  
247 - }  
248 - } @catch (NSException *exception) {  
249 - YHLog(@"%@ error: %@", self, exception);  
250 - }  
251 -}  
252 -  
253 #pragma mark - Exception handle methods 228 #pragma mark - Exception handle methods
254 // 发送本地存储的Exception数据 229 // 发送本地存储的Exception数据
255 - (void)uploadLocalErrorData 230 - (void)uploadLocalErrorData
@@ -12,12 +12,4 @@ @@ -12,12 +12,4 @@
12 12
13 + (YH_CrashReporter *)sharedInstance; 13 + (YH_CrashReporter *)sharedInstance;
14 14
15 -- (NSString *)callstackString;  
16 -  
17 -- (void)handleSignal:(NSDictionary *)userInfo;  
18 -  
19 -- (void)handleNSException:(NSDictionary *)userInfo;  
20 -  
21 --(NSString *)getStringFromArray:(NSArray *)array;  
22 -  
23 @end 15 @end
@@ -17,6 +17,15 @@ @@ -17,6 +17,15 @@
17 17
18 #pragma mark - C Fuctions 18 #pragma mark - C Fuctions
19 19
  20 +@interface YH_CrashReporter()
  21 +
  22 +- (NSString *)callstackString;
  23 +- (void)handleSignal:(NSDictionary *)userInfo;
  24 +- (void)handleNSException:(NSDictionary *)userInfo;
  25 +-(NSString *)getStringFromArray:(NSArray *)array;
  26 +
  27 +@end
  28 +
20 void yh_sighandler(int signal) 29 void yh_sighandler(int signal)
21 { 30 {
22 const char* names[NSIG]; 31 const char* names[NSIG];
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 11
12 @interface YH_EventCacheManager : NSObject 12 @interface YH_EventCacheManager : NSObject
13 13
14 -@property (nonatomic, assign) NSUInteger cacheFileUpperLimit; 14 +@property (nonatomic, assign) NSUInteger cacheFileUpperLimit;
15 15
16 + (YH_EventCacheManager *)sharedInstance; 16 + (YH_EventCacheManager *)sharedInstance;
17 17
@@ -47,6 +47,6 @@ @@ -47,6 +47,6 @@
47 */ 47 */
48 - (void)pushCrashData:(NSDictionary*)data; 48 - (void)pushCrashData:(NSDictionary*)data;
49 49
50 -- (void) startUploadMode:(YHEventReportStrategy)mode timeInterval:(long)timeIntervals; 50 +- (void)startUploadMode:(YHEventReportStrategy)mode timeInterval:(NSUInteger)timeIntervals;
51 51
52 @end 52 @end
@@ -7,7 +7,6 @@ @@ -7,7 +7,6 @@
7 // 7 //
8 8
9 #import "YH_EventCacheManager.h" 9 #import "YH_EventCacheManager.h"
10 -#import "YH_EventCacheFile.h"  
11 #import <UIKit/UIKit.h> 10 #import <UIKit/UIKit.h>
12 #import "YH_EventDataSession.h" 11 #import "YH_EventDataSession.h"
13 #import "YH_EventDataFactory.h" 12 #import "YH_EventDataFactory.h"
@@ -17,25 +16,27 @@ @@ -17,25 +16,27 @@
17 #import "YH_AnalyticEventData.h" 16 #import "YH_AnalyticEventData.h"
18 #import "YHLog.h" 17 #import "YHLog.h"
19 #import "YH_EventDataFactory.h" 18 #import "YH_EventDataFactory.h"
  19 +#import <YH_FoundationKit/YH_FoundationKit.h>
  20 +
  21 +static NSString *const kParamKeyDevice = @"device";
  22 +static NSString *const kParamKeyList = @"events";
  23 +static NSString *const kParamKeyType = @"type";
20 24
21 @interface YH_EventCacheManager() 25 @interface YH_EventCacheManager()
22 26
23 -//@property (strong, nonatomic) NSMutableArray *eventCacheArray;  
24 -@property (strong, nonatomic) NSMutableArray *performanceCacheArray; 27 +@property (strong, nonatomic) NSMutableArray *infoCacheArray;//cache custom & performance,click info send in realtime
25 @property (strong, nonatomic) YH_EventDataSession *eventDataSession; 28 @property (strong, nonatomic) YH_EventDataSession *eventDataSession;
26 -@property (nonatomic, assign) YHEventReportStrategy mode;  
27 -@property (nonatomic,strong)YH_PerformanceAppInfo *performanceAppInfo;  
28 -@property (nonatomic,strong)NSTimer *timer;  
29 -@property (nonatomic,assign)long timeInterval; 29 +@property (nonatomic, assign) YHEventReportStrategy mode;
  30 +@property (nonatomic,strong) YH_PerformanceAppInfo *appInfo;
  31 +@property (nonatomic,strong) dispatch_source_t timer;
  32 +@property (nonatomic,strong) dispatch_queue_t queue;
  33 +@property (nonatomic,assign) NSUInteger timeInterval;
  34 +@property (nonatomic, strong) YH_Reachability *intnetReachability;
30 35
31 @end 36 @end
32 37
33 @implementation YH_EventCacheManager 38 @implementation YH_EventCacheManager
34 39
35 -static NSString *kParamKeyDevice = @"device";  
36 -static NSString *kParamKeyList = @"events";  
37 -static NSString *kParamKeyType = @"type";  
38 -  
39 + (YH_EventCacheManager *)sharedInstance 40 + (YH_EventCacheManager *)sharedInstance
40 { 41 {
41 static YH_EventCacheManager *sharedInstance = nil; 42 static YH_EventCacheManager *sharedInstance = nil;
@@ -50,67 +51,33 @@ static NSString *kParamKeyType = @"type"; @@ -50,67 +51,33 @@ static NSString *kParamKeyType = @"type";
50 { 51 {
51 self = [super init]; 52 self = [super init];
52 if (self) { 53 if (self) {
53 - self.timeInterval = 30;  
54 - self.mode = YHEventReportStrategyInterval;  
55 - self.performanceAppInfo = [[YH_PerformanceAppInfo alloc] init];  
56 - self.timer = [NSTimer timerWithTimeInterval:self.timeInterval target:self selector:@selector(timerAction) userInfo:nil repeats:YES];  
57 - [[NSRunLoop mainRunLoop] addTimer:self.timer forMode: NSRunLoopCommonModes];  
58 -  
59 - [[NSNotificationCenter defaultCenter] addObserver:self  
60 - selector:@selector(handleMemoryWarning)  
61 - name:UIApplicationDidReceiveMemoryWarningNotification  
62 - object:nil];  
63 -  
64 - [[NSNotificationCenter defaultCenter] addObserver:self  
65 - selector:@selector(handleApplicationBackgrounding)  
66 - name:UIApplicationDidEnterBackgroundNotification  
67 - object:nil];  
68 -  
69 - [[NSNotificationCenter defaultCenter] addObserver:self  
70 - selector:@selector(handleDidFinishLaunch)  
71 - name:UIApplicationDidFinishLaunchingNotification  
72 - object:nil];  
73 - [[NSNotificationCenter defaultCenter] addObserver:self  
74 - selector:@selector(handleTerminate)  
75 - name:UIApplicationWillTerminateNotification  
76 - object:nil];  
77 -  
78 -  
79 -  
80 -  
81 - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshPushStatus) name:UIApplicationWillEnterForegroundNotification object:nil];  
82 -  
83 - [self refreshPushStatus];  
84 - [[YH_Reachability reachabilityForInternetConnection] startNotifier]; 54 + _timeInterval = 30;
  55 + _mode = YHEventReportStrategyInterval;
  56 + _appInfo = [[YH_PerformanceAppInfo alloc] init];
  57 + _eventDataSession = [[YH_EventDataSession alloc] init];
  58 + _infoCacheArray = [NSMutableArray array];
  59 + _queue = yh_gcdSerialQueue(@"cn.yoho.buy.eventReport.serial");
  60 + _intnetReachability = [YH_Reachability reachabilityForInternetConnection];
  61 + [_intnetReachability startNotifier];
  62 + [self startTimer];
  63 + [self yh_observeNotificationName:UIApplicationDidReceiveMemoryWarningNotification action:@selector(handleMemoryWarning)];
  64 + [self yh_observeNotificationName:UIApplicationDidEnterBackgroundNotification action:@selector(handleApplicationBackgrounding)];
  65 + [self yh_observeNotificationName:UIApplicationWillEnterForegroundNotification action:@selector(handleApplicationForerounding)];
  66 + [self yh_observeNotificationName:UIApplicationDidFinishLaunchingNotification action:@selector(handleDidFinishLaunch)];
  67 + [self yh_observeNotificationName:UIApplicationWillTerminateNotification action:@selector(handleTerminate)];
  68 + [self yh_observeNotificationName:UIApplicationWillEnterForegroundNotification action:@selector(refreshAppInfo)];
  69 + [self yh_observeNotificationName:kYHReachabilityChangedNotification action:@selector(networkStateChange:)];
85 } 70 }
86 return self; 71 return self;
87 } 72 }
88 73
89 - (void)dealloc 74 - (void)dealloc
90 { 75 {
91 - [self.timer invalidate];  
92 - [[YH_Reachability reachabilityForInternetConnection] stopNotifier]; 76 + [self cancelTimer];
  77 + [_intnetReachability stopNotifier];
93 [[NSNotificationCenter defaultCenter] removeObserver:self]; 78 [[NSNotificationCenter defaultCenter] removeObserver:self];
94 } 79 }
95 80
96 -#pragma mark - Getters  
97 -  
98 -- (NSMutableArray*)performanceCacheArray  
99 -{  
100 - if (_performanceCacheArray == nil) {  
101 - _performanceCacheArray = [[NSMutableArray alloc]initWithCapacity:0];  
102 - }  
103 - return _performanceCacheArray;  
104 -}  
105 -  
106 -- (YH_EventDataSession*)eventDataSession  
107 -{  
108 - if (_eventDataSession == nil) {  
109 - _eventDataSession = [[YH_EventDataSession alloc]init];  
110 - }  
111 - return _eventDataSession;  
112 -}  
113 -  
114 #pragma mark - public 81 #pragma mark - public
115 82
116 - (void)pushUIControlEvent:(NSString *)viewPath title:(NSString *)title content:(NSString *)content yh_pageName:(NSString *)yh_pageName yh_typeId:(NSString *)yh_typeId alias: (NSString *)yh_Alias 83 - (void)pushUIControlEvent:(NSString *)viewPath title:(NSString *)title content:(NSString *)content yh_pageName:(NSString *)yh_pageName yh_typeId:(NSString *)yh_typeId alias: (NSString *)yh_Alias
@@ -119,7 +86,6 @@ static NSString *kParamKeyType = @"type"; @@ -119,7 +86,6 @@ static NSString *kParamKeyType = @"type";
119 YHLog(@"UIControlEvent: viewPath can't empty!!!"); 86 YHLog(@"UIControlEvent: viewPath can't empty!!!");
120 return; 87 return;
121 } 88 }
122 -  
123 NSDictionary *param = @{ 89 NSDictionary *param = @{
124 kYHEventReportClickViewPath: viewPath, 90 kYHEventReportClickViewPath: viewPath,
125 kYHEventReportClickTitle: title ?: @"", 91 kYHEventReportClickTitle: title ?: @"",
@@ -128,16 +94,15 @@ static NSString *kParamKeyType = @"type"; @@ -128,16 +94,15 @@ static NSString *kParamKeyType = @"type";
128 kYHEventReportClickVCPageName: yh_pageName?:@"", 94 kYHEventReportClickVCPageName: yh_pageName?:@"",
129 kYHEventReportClickVCAlias: yh_Alias?:@"", 95 kYHEventReportClickVCAlias: yh_Alias?:@"",
130 }; 96 };
131 -  
132 YHLog(@"UIControlEvent: %@", param); 97 YHLog(@"UIControlEvent: %@", param);
133 -  
134 [self pushEventData:param]; 98 [self pushEventData:param];
135 -  
136 } 99 }
137 100
138 - (void)pushEventData:(NSDictionary*)data 101 - (void)pushEventData:(NSDictionary*)data
139 { 102 {
140 - [self pushData:[[YH_AnalyticEventData sharedInstance] analyticEventParameters:data] dataType:YHEventReportDataTypeClickEvent]; 103 + dispatch_async(self.queue, ^{
  104 + [self pushData:[[YH_AnalyticEventData sharedInstance] analyticEventParameters:data] dataType:YHEventReportDataTypeClickEvent];
  105 + });
141 } 106 }
142 107
143 - (void)pushPerformanceData:(NSDictionary*)data pointName:(YHEventReportPointName)name 108 - (void)pushPerformanceData:(NSDictionary*)data pointName:(YHEventReportPointName)name
@@ -146,19 +111,18 @@ static NSString *kParamKeyType = @"type"; @@ -146,19 +111,18 @@ static NSString *kParamKeyType = @"type";
146 [performanceDic setObject:@"PERFORMANCE" forKey:YOHOAppReportKeyPT]; 111 [performanceDic setObject:@"PERFORMANCE" forKey:YOHOAppReportKeyPT];
147 [performanceDic setObject:[YH_EventDataFactory getPointName:name] forKey:YOHOAppReportKeyPN]; 112 [performanceDic setObject:[YH_EventDataFactory getPointName:name] forKey:YOHOAppReportKeyPN];
148 113
149 - NSMutableDictionary *eventDic = [[YH_EventDataFactory factoryEventAppInfo:self.performanceAppInfo]mutableCopy]; 114 + NSMutableDictionary *eventDic = [NSMutableDictionary dictionary];
150 115
151 - if (!IsDictionaryClass(eventDic)) {  
152 - return;  
153 - }  
154 if (IsDictionaryClass(performanceDic)) { 116 if (IsDictionaryClass(performanceDic)) {
155 [eventDic addEntriesFromDictionary:performanceDic]; 117 [eventDic addEntriesFromDictionary:performanceDic];
156 } 118 }
157 - if (IsDictionaryClass(eventDic)) { 119 + if (IsDictionaryClass(data)) {
158 [eventDic setObject:data forKey:YOHOAppReportKeyPARAM]; 120 [eventDic setObject:data forKey:YOHOAppReportKeyPARAM];
159 } 121 }
160 -  
161 - [self pushData:eventDic dataType:YHEventReportDataTypePerformance]; 122 + dispatch_async(self.queue, ^{
  123 + [eventDic addEntriesFromDictionary:[YH_EventDataFactory factoryEventAppInfo:self.appInfo]];
  124 + [self pushData:eventDic dataType:YHEventReportDataTypePerformance];
  125 + });
162 } 126 }
163 127
164 - (void)pushCustomData:(NSDictionary*)data pointType:(YHPointType)type pointName:(YHEventReportPointName)name{ 128 - (void)pushCustomData:(NSDictionary*)data pointType:(YHPointType)type pointName:(YHEventReportPointName)name{
@@ -166,103 +130,96 @@ static NSString *kParamKeyType = @"type"; @@ -166,103 +130,96 @@ static NSString *kParamKeyType = @"type";
166 [performanceDic setObject:[YH_EventDataFactory getPointType:type] forKey:YOHOAppReportKeyPT]; 130 [performanceDic setObject:[YH_EventDataFactory getPointType:type] forKey:YOHOAppReportKeyPT];
167 [performanceDic setObject:[YH_EventDataFactory getPointName:name] forKey:YOHOAppReportKeyPN]; 131 [performanceDic setObject:[YH_EventDataFactory getPointName:name] forKey:YOHOAppReportKeyPN];
168 132
169 - NSMutableDictionary *eventDic = [[YH_EventDataFactory factoryEventAppInfo:self.performanceAppInfo]mutableCopy];  
170 -  
171 - if (!IsDictionaryClass(eventDic)) {  
172 - return;  
173 - }  
174 - if (IsDictionaryClass(performanceDic)) { 133 + dispatch_async(self.queue, ^{
  134 + NSMutableDictionary *eventDic = [[YH_EventDataFactory factoryEventAppInfo:self.appInfo] mutableCopy];
175 [eventDic addEntriesFromDictionary:performanceDic]; 135 [eventDic addEntriesFromDictionary:performanceDic];
176 - }  
177 -  
178 - switch (type) {  
179 - case YHPT_NETWORK: 136 +
  137 + switch (type) {
  138 + case YHPT_NETWORK:
180 { 139 {
181 - [self.eventDataSession getbaiduNetStatus:eventDic completionBlock:^(NSTimeInterval cts, NSInteger errCode) {  
182 - NSMutableDictionary *appendDict = [[NSMutableDictionary alloc] initWithDictionary:data];  
183 -  
184 - [appendDict setValue:[NSString stringWithFormat:@"%zd",errCode] forKey:YOHOAppReportKeyJsonKeyErrorTEC];  
185 - [appendDict setValue:[NSString stringWithFormat:@"%ld",(long)cts] forKey:YOHOAppReportKeyJsonKeyErrorCTS];  
186 - [eventDic setValue:appendDict forKey:YOHOAppReportKeyPARAM];  
187 -  
188 - [self pushData:eventDic dataType:YHEventReportDataTypeCustom];  
189 - }]; 140 + [self checkBaiduStatusWithEventData:eventDic customData:data];
190 } 141 }
191 - break;  
192 - case YHPT_AD: 142 + break;
  143 + case YHPT_AD:
193 { 144 {
194 if ([data valueForKey:YOHOAppReportKeyJsonKeyErrorTEC]) { 145 if ([data valueForKey:YOHOAppReportKeyJsonKeyErrorTEC]) {
195 - [self.eventDataSession getbaiduNetStatus:eventDic completionBlock:^(NSTimeInterval cts, NSInteger errCode) {  
196 - NSMutableDictionary *appendDict = [[NSMutableDictionary alloc] initWithDictionary:data];  
197 -  
198 - [appendDict setValue:[NSString stringWithFormat:@"%zd",errCode] forKey:YOHOAppReportKeyJsonKeyErrorTEC];  
199 - [appendDict setValue:[NSString stringWithFormat:@"%ld",(long)cts] forKey:YOHOAppReportKeyJsonKeyErrorCTS];  
200 - [eventDic setValue:appendDict forKey:YOHOAppReportKeyPARAM];  
201 -  
202 - [self pushData:eventDic dataType:YHEventReportDataTypeCustom];  
203 - }]; 146 + [self checkBaiduStatusWithEventData:eventDic customData:data];
204 } else { 147 } else {
205 [eventDic setValue:data forKey:YOHOAppReportKeyPARAM]; 148 [eventDic setValue:data forKey:YOHOAppReportKeyPARAM];
206 [self pushData:eventDic dataType:YHEventReportDataTypeCustom]; 149 [self pushData:eventDic dataType:YHEventReportDataTypeCustom];
207 } 150 }
208 } 151 }
209 - break;  
210 - default: 152 + break;
  153 + default:
211 { 154 {
212 [eventDic setValue:data forKey:YOHOAppReportKeyPARAM]; 155 [eventDic setValue:data forKey:YOHOAppReportKeyPARAM];
213 [self pushData:eventDic dataType:YHEventReportDataTypeCustom]; 156 [self pushData:eventDic dataType:YHEventReportDataTypeCustom];
214 } 157 }
215 - break;  
216 - } 158 + break;
  159 + }
  160 + });
217 } 161 }
218 162
219 -- (void)pushCrashData:(NSDictionary*)data{  
220 - NSMutableDictionary *eventDic = [[YH_EventDataFactory factoryEventAppInfo:self.performanceAppInfo]mutableCopy];  
221 -  
222 - if (!IsDictionaryClass(eventDic) ||!IsDictionaryClass(data)) { 163 +- (void)checkBaiduStatusWithEventData:(NSMutableDictionary *)eventDic customData:(NSDictionary *)data {
  164 + weakify(self);
  165 + [self.eventDataSession getbaiduNetStatusWithCompletionBlock:^(NSTimeInterval cts, NSInteger errCode) {
  166 + strongify(self);
  167 + NSMutableDictionary *appendDict = [[NSMutableDictionary alloc] initWithDictionary:data];
  168 + [appendDict setValue:[NSString stringWithFormat:@"%zd",errCode] forKey:YOHOAppReportKeyJsonKeyErrorTEC];
  169 + [appendDict setValue:[NSString stringWithFormat:@"%ld",(long)cts] forKey:YOHOAppReportKeyJsonKeyErrorCTS];
  170 + [eventDic setValue:appendDict forKey:YOHOAppReportKeyPARAM];
  171 + dispatch_async(self.queue, ^{
  172 + [self pushData:eventDic dataType:YHEventReportDataTypeCustom];
  173 + });
  174 + }];
  175 +}
  176 +
  177 +- (void)pushCrashData:(NSDictionary*)data {
  178 + if (!IsDictionaryClass(data) || data.count <= 0) {
223 return; 179 return;
224 } 180 }
225 -  
226 - [eventDic addEntriesFromDictionary:data];  
227 -  
228 - [self pushData:[eventDic copy] dataType:YHEventReportDataTypeCustom]; 181 + dispatch_async(self.queue, ^{
  182 + NSMutableDictionary *eventDic = [[YH_EventDataFactory factoryEventAppInfo:self.appInfo] mutableCopy];
  183 + [eventDic addEntriesFromDictionary:data];
  184 + [self pushData:[eventDic copy] dataType:YHEventReportDataTypeCustom];
  185 + });
229 } 186 }
230 187
231 #pragma mark - private 188 #pragma mark - private
232 - (void)pushData:(NSDictionary*)data dataType:(YHEventReportDataType)type 189 - (void)pushData:(NSDictionary*)data dataType:(YHEventReportDataType)type
233 { 190 {
234 if (type == YHEventReportDataTypeClickEvent) { 191 if (type == YHEventReportDataTypeClickEvent) {
235 - [self.eventDataSession uploadEventData:data tag:nil result:^(BOOL isSuc, id tag, NSError *error) {  
236 - }]; 192 + [self.eventDataSession uploadEventData:data tag:nil result:nil];
237 }else { 193 }else {
238 if (self.mode == YHEventReportStrategyInterval) { 194 if (self.mode == YHEventReportStrategyInterval) {
239 - @synchronized (self.performanceCacheArray) {  
240 - [self.performanceCacheArray addObject:data];  
241 - } 195 + [self.infoCacheArray addObject:data];
242 }else{ 196 }else{
  197 + weakify(self);
243 [self.eventDataSession uploadPerformanceData:[self getPerformanceFormatData:@[data] type:YHEventReportTrackDataTypeNONE] tag:nil result:^(BOOL isSuc, id tag, NSError *error) { 198 [self.eventDataSession uploadPerformanceData:[self getPerformanceFormatData:@[data] type:YHEventReportTrackDataTypeNONE] tag:nil result:^(BOOL isSuc, id tag, NSError *error) {
  199 + if (!isSuc) {
  200 + strongify(self);
  201 + dispatch_async(self.queue, ^{
  202 + [self.infoCacheArray addObject:data];
  203 + });
  204 + }
244 }]; 205 }];
245 } 206 }
246 } 207 }
247 } 208 }
248 209
249 -- (void) startUploadMode:(YHEventReportStrategy)mode timeInterval:(long)timeIntervals; 210 +- (void)startUploadMode:(YHEventReportStrategy)mode timeInterval:(NSUInteger)timeIntervals;
250 { 211 {
251 - _mode = mode;  
252 - self.timeInterval = timeIntervals;  
253 - if (mode == YHEventReportStrategyInterval) {  
254 - if (self.timer == nil) {  
255 - //定时上传  
256 - self.timer = [NSTimer timerWithTimeInterval:self.timeInterval target:self selector:@selector(timerAction) userInfo:nil repeats:YES];  
257 - [[NSRunLoop mainRunLoop] addTimer:self.timer forMode: NSRunLoopCommonModes]; 212 + dispatch_async(self.queue, ^{
  213 + _mode = mode;
  214 + if (timeIntervals > 0 && timeIntervals < 5 * 60) {
  215 + self.timeInterval = timeIntervals;
258 } 216 }
259 - }else{  
260 - if (self.timer) {  
261 - [self.timer invalidate];  
262 - self.timer = nil; 217 + if (mode == YHEventReportStrategyInterval) {
  218 + [self startTimer];
  219 + }else{
  220 + [self cancelTimer];
263 } 221 }
264 - }  
265 - 222 + });
266 } 223 }
267 224
268 - (NSMutableDictionary*)getPerformanceFormatData:(NSArray*)dataArray type:(YHEventReportTrackDataType)type 225 - (NSMutableDictionary*)getPerformanceFormatData:(NSArray*)dataArray type:(YHEventReportTrackDataType)type
@@ -278,135 +235,151 @@ static NSString *kParamKeyType = @"type"; @@ -278,135 +235,151 @@ static NSString *kParamKeyType = @"type";
278 } 235 }
279 236
280 [performanceAryDic setObject:[YH_EventDataFactory getDataType:type] forKey:kParamKeyType]; 237 [performanceAryDic setObject:[YH_EventDataFactory getDataType:type] forKey:kParamKeyType];
281 - [performanceAryDic setObject:[YH_EventDataFactory getDeviceInfo:self.performanceAppInfo] forKey:kParamKeyDevice]; 238 + [performanceAryDic setObject:[YH_EventDataFactory getDeviceInfo:self.appInfo] forKey:kParamKeyDevice];
282 239
283 return performanceAryDic; 240 return performanceAryDic;
284 } 241 }
285 242
286 --(NSString *)getPointName:(YHEventReportPointName)pointName{  
287 - NSString *str = @"";  
288 - switch (pointName) {  
289 - case YHPN_VIEWCONTROLLER:  
290 - str = @"PAGE";  
291 - break;  
292 - case YHPN_WEBVIEW:  
293 - str = @"WEBVIEW";  
294 - break;  
295 - case YHPN_IMAGEVIEW:  
296 - str = @"IMAGE";  
297 - break;  
298 - case YHPN_BUTTON:  
299 - str = @"BUTTON";  
300 - break;  
301 - case YHPN_GESTURERECOGNIZER:  
302 - str = @"GESTURERECOGNIZER";  
303 - break;  
304 - default:  
305 - break;  
306 - }  
307 -  
308 - return str;  
309 -}  
310 -  
311 --(NSString *)getDataType:(YHEventReportTrackDataType)type{  
312 - NSString *str = @"";  
313 -  
314 - switch (type) {  
315 - case YHEventReportTrackDataTypeStart:  
316 - str = @"start";  
317 - break;  
318 - case YHEventReportTrackDataTypeDestory:  
319 - str = @"destory";  
320 - break;  
321 - case YHEventReportTrackDataTypeStop:  
322 - str = @"stop";  
323 - break;  
324 - case YHEventReportTrackDataTypeHeartbeat:  
325 - str = @"hb";  
326 - break;  
327 - case YHEventReportTrackDataTypeNONE:  
328 - str = @"realTime";  
329 - break;  
330 - default:  
331 - break;  
332 - }  
333 -  
334 - return str;  
335 -}  
336 -  
337 -- (void)refreshPushStatus  
338 -{  
339 - if (IOS10) {// system is iOS10  
340 - UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];  
341 - [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) {  
342 - switch (settings.authorizationStatus) {  
343 - case UNAuthorizationStatusNotDetermined:  
344 - self.performanceAppInfo.ps = @"0";  
345 - break;  
346 - case UNAuthorizationStatusDenied:  
347 - self.performanceAppInfo.ps = @"0";  
348 - break;  
349 - default:  
350 - self.performanceAppInfo.ps = @"1";  
351 - break;  
352 - }  
353 - }];  
354 - } else {//iOS8  
355 - if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {  
356 - self.performanceAppInfo.ps = @"1";  
357 - }else {  
358 - self.performanceAppInfo.ps = @"0";  
359 - }  
360 - } 243 +- (void)refreshAppInfo {
  244 + dispatch_async(self.queue, ^{
  245 + [self.appInfo update];
  246 + });
361 } 247 }
362 248
363 #pragma mark - NSNotification 249 #pragma mark - NSNotification
364 - (void)handleMemoryWarning 250 - (void)handleMemoryWarning
365 { 251 {
366 - if (self.mode == YHEventReportStrategyInterval) {  
367 - @synchronized (self.performanceCacheArray) {  
368 - [self.performanceCacheArray removeAllObjects]; 252 + dispatch_async(self.queue, ^{
  253 + if (self.mode == YHEventReportStrategyInterval) {
  254 + //todo save to disk
  255 + [self.infoCacheArray removeAllObjects];
369 } 256 }
370 - } 257 + });
371 } 258 }
372 - (void)handleDidFinishLaunch 259 - (void)handleDidFinishLaunch
373 { 260 {
374 - if (self.mode == YHEventReportStrategyInterval) {  
375 - [self uploadPerformanceDataWithType:YHEventReportTrackDataTypeStart];  
376 - } 261 + dispatch_async(self.queue, ^{
  262 + if (self.mode == YHEventReportStrategyInterval) {
  263 + [self loadDiskCachedEventInfoToMemArray:self.infoCacheArray];
  264 + [self clearDiskCache];
  265 + [self uploadEventAndCustomInfo:self.infoCacheArray type:YHEventReportTrackDataTypeStart completion:^(BOOL isSuccess) {
  266 + if (isSuccess) {
  267 + dispatch_async(self.queue, ^{
  268 + [self.infoCacheArray removeAllObjects];
  269 + });
  270 + }
  271 + }];
  272 + }
  273 + });
377 } 274 }
378 275
379 - (void)handleTerminate 276 - (void)handleTerminate
380 { 277 {
381 - if (self.mode == YHEventReportStrategyInterval) {  
382 - [self uploadPerformanceDataWithType:YHEventReportTrackDataTypeDestory];  
383 - } 278 + dispatch_sync(self.queue, ^{// block until send over
  279 + if (self.mode == YHEventReportStrategyInterval) {
  280 + NSArray *array = [self.infoCacheArray copy];
  281 + [self.infoCacheArray removeAllObjects];
  282 + [self saveToDiskOfInfo:array];
  283 + [self uploadEventAndCustomInfo:array type:YHEventReportTrackDataTypeDestory completion:^(BOOL isSuccess) {
  284 + if (isSuccess) {
  285 + [self clearDiskCache];
  286 + }
  287 + }];
  288 + }
  289 + });
384 } 290 }
385 291
386 - (void)handleApplicationBackgrounding 292 - (void)handleApplicationBackgrounding
387 { 293 {
388 - [self.performanceAppInfo resetSessionID];  
389 - if (self.mode == YHEventReportStrategyInterval) {  
390 - [self uploadPerformanceDataWithType:YHEventReportTrackDataTypeStop];  
391 - } 294 + dispatch_async(self.queue, ^{
  295 + [self.appInfo resetSessionID];
  296 + if (self.mode == YHEventReportStrategyInterval) {
  297 + NSArray *array = [self.infoCacheArray copy];
  298 + [self.infoCacheArray removeAllObjects];
  299 + [self saveToDiskOfInfo:array];
  300 + [self uploadEventAndCustomInfo:array type:YHEventReportTrackDataTypeStop completion:^(BOOL isSuccess) {
  301 + if (isSuccess) {
  302 + [self clearDiskCache];
  303 + }
  304 + }];
  305 + }
  306 + });
  307 +}
  308 +
  309 +- (void)handleApplicationForerounding {
  310 + dispatch_async(self.queue, ^{
  311 + [self loadDiskCachedEventInfoToMemArray:self.infoCacheArray];
  312 + [self clearDiskCache];
  313 + });
  314 +}
  315 +
  316 +- (void)networkStateChange:(NSNotification *)note {
  317 + dispatch_async(self.queue, ^{
  318 + [self.appInfo updateNetStatusWithReachability:self.intnetReachability];
  319 + });
392 } 320 }
393 321
394 #pragma mark - timer 322 #pragma mark - timer
395 -- (void)timerAction  
396 -{  
397 - [self uploadPerformanceDataWithType:YHEventReportTrackDataTypeHeartbeat]; 323 +
  324 +- (void)startTimer {
  325 + if (!_timer) {
  326 + weakify(self);
  327 + _timer = yh_gcdTimer(_queue, _timeInterval, ^{
  328 + strongify(self);
  329 + [self timerAction];
  330 + });
  331 + }
  332 +}
  333 +
  334 +- (void)cancelTimer {
  335 + if (_timer) {
  336 + dispatch_cancel(_timer);
  337 + _timer = nil;
  338 + }
  339 +}
  340 +
  341 +- (void)timerAction {
  342 + if (!self.infoCacheArray.count) {
  343 + return;
  344 + }
  345 + [self uploadEventAndCustomInfo:self.infoCacheArray type:YHEventReportTrackDataTypeHeartbeat completion:^(BOOL isSuccess) {
  346 + if (isSuccess) {
  347 + dispatch_async(self.queue, ^{
  348 + [self.infoCacheArray removeAllObjects];
  349 + });
  350 + }
  351 + }];
398 } 352 }
399 353
400 #pragma mark - upload performance data 354 #pragma mark - upload performance data
401 --(void)uploadPerformanceDataWithType:(YHEventReportTrackDataType)type{  
402 - @synchronized (self.performanceCacheArray) {  
403 - [self.eventDataSession uploadPerformanceData:[self getPerformanceFormatData:self.performanceCacheArray type:type] tag:nil result:^(BOOL isSuc, id tag, NSError *error) {  
404 - }]; 355 +-(void)uploadEventAndCustomInfo:(NSArray *)infoCacheArray type:(YHEventReportTrackDataType)type completion:(void(^)(BOOL isSuccess))completion {
  356 + [self.eventDataSession uploadPerformanceData:[self getPerformanceFormatData:infoCacheArray type:type] tag:nil result:^(BOOL isSuc, id tag, NSError *error) {
  357 + BLOCK_EXEC(completion, isSuc);
  358 + }];
  359 +}
  360 +
  361 +- (void)saveToDiskOfInfo:(NSArray *)infoArray {
  362 + [infoArray writeToFile:[self cachePath] atomically:YES];
  363 +}
  364 +
  365 +- (void)loadDiskCachedEventInfoToMemArray:(NSMutableArray *)memArray {
  366 + if (![[NSFileManager defaultManager] fileExistsAtPath:[self cachePath]]) {
  367 + return;
405 } 368 }
406 -  
407 - @synchronized (self.performanceCacheArray) {  
408 - [self.performanceCacheArray removeAllObjects]; 369 + NSArray *array = [NSArray arrayWithContentsOfFile:[self cachePath]];
  370 + if (array.count) {
  371 + [memArray addObjectsFromArray:array];
409 } 372 }
410 } 373 }
411 374
  375 +- (void)clearDiskCache {
  376 + if ([[NSFileManager defaultManager] fileExistsAtPath:[self cachePath]]) {
  377 + [[NSFileManager defaultManager] removeItemAtPath:[self cachePath] error:nil];
  378 + }
  379 +}
  380 +
  381 +- (NSString *)cachePath {
  382 + return [NSTemporaryDirectory() stringByAppendingPathComponent:@"event.cache"];
  383 +}
  384 +
412 @end 385 @end
@@ -9,22 +9,26 @@ @@ -9,22 +9,26 @@
9 #import <Foundation/Foundation.h> 9 #import <Foundation/Foundation.h>
10 #import "YHEventReportMacros.h" 10 #import "YHEventReportMacros.h"
11 11
  12 +typedef void (^YHDataUploadCompletion)(BOOL isSuc,id tag, NSError *error);
  13 +typedef void (^YHBaiduCheckCompletion)(NSTimeInterval cts, NSInteger errCode);
  14 +
12 @interface YH_EventDataSession : NSObject 15 @interface YH_EventDataSession : NSObject
13 16
14 /** 17 /**
15 * @abstract 18 * @abstract
16 - * 上传event数据 19 + * 上传click event数据
17 * //data -array -dic 20 * //data -array -dic
18 */ 21 */
19 -- (void) uploadEventData:(id)parameters tag:(id)tag result:(void (^)(BOOL isSuc,id tag, NSError *error))result; 22 +- (void)uploadEventData:(id)parameters tag:(id)tag result:(YHDataUploadCompletion)result;
20 23
21 /** 24 /**
22 * @abstract 25 * @abstract
23 - * 上传性能数据 26 + * 上传性能数据 & custome
24 * //data -array -dic 27 * //data -array -dic
25 */ 28 */
26 -- (void) uploadPerformanceData:(id)parameters tag:(id)tag result:(void (^)(BOOL isSuc,id tag, NSError *error))result; 29 +- (void)uploadPerformanceData:(id)parameters tag:(id)tag result:(YHDataUploadCompletion)result;
27 30
28 //图片or接口异常下百度连接状态上报 31 //图片or接口异常下百度连接状态上报
29 -- (void)getbaiduNetStatus:(NSDictionary *)parameters completionBlock:(void (^)(NSTimeInterval cts, NSInteger errCode))diagnosisBlock; 32 +- (void)getbaiduNetStatusWithCompletionBlock:(YHBaiduCheckCompletion)diagnosisBlock;
  33 +
30 @end 34 @end
@@ -13,59 +13,32 @@ @@ -13,59 +13,32 @@
13 #import "NSData+YHERGZip.h" 13 #import "NSData+YHERGZip.h"
14 #import "NSString+ER_URL.h" 14 #import "NSString+ER_URL.h"
15 #import "YHEventReport.h" 15 #import "YHEventReport.h"
  16 +#import <YH_FoundationKit/YH_FoundationKit.h>
16 17
17 -#define kYOHOEventReportURL @"http://analysis.yohobuy.com/yas_mobile"//@"http://172.16.10.128:8081/eventreport"  
18 -  
19 -#define kYOHOPerformanceReportURL @"http://app.yoho.cn/collect/v3"//@"http://172.16.6.108/collect/v2"  
20 -  
21 -#define kYOHONetworkDiagnosisURL @"https://m.baidu.com" 18 +static NSString *const kYOHOEventReportURL = @"http://analysis.yohobuy.com/yas_mobile";//@"http://172.16.10.128:8081/eventreport"
  19 +static NSString *const kYOHOPerformanceReportURL = @"http://app.yoho.cn/collect/v3";//@"http://172.16.6.108/collect/v2"
  20 +static NSString *const kYOHONetworkDiagnosisURL = @"https://m.baidu.com";
22 21
23 @interface YH_EventDataSession() 22 @interface YH_EventDataSession()
24 23
  24 +//request template
25 @property (nonatomic,strong)NSMutableURLRequest *uploadEventRequest; 25 @property (nonatomic,strong)NSMutableURLRequest *uploadEventRequest;
26 -  
27 @property (nonatomic,strong)NSMutableURLRequest *uploadPerformanceRequest; 26 @property (nonatomic,strong)NSMutableURLRequest *uploadPerformanceRequest;
28 -  
29 @property (nonatomic,strong)NSMutableURLRequest *networkDiagnosisRequest; 27 @property (nonatomic,strong)NSMutableURLRequest *networkDiagnosisRequest;
30 28
31 @property (nonatomic,strong)NSURLSession *uploadSession; 29 @property (nonatomic,strong)NSURLSession *uploadSession;
32 30
33 -@property (nonatomic,assign)BOOL canUpload;  
34 -  
35 @end 31 @end
36 32
37 @implementation YH_EventDataSession 33 @implementation YH_EventDataSession
38 34
39 -- (instancetype)init  
40 -{  
41 - self = [super init];  
42 - if (self) {  
43 - self.canUpload = YES;  
44 - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kYHReachabilityChangedNotification object:nil];  
45 - }  
46 - return self;  
47 -}  
48 -  
49 -- (void)dealloc  
50 -{  
51 - [[NSNotificationCenter defaultCenter] removeObserver:self];  
52 -}  
53 -  
54 #pragma mark - public 35 #pragma mark - public
55 36
56 -- (void)uploadEventData:(id)parameters tag:(id)tag result:(void (^)(BOOL isSuc,id tag, NSError *error))result 37 +- (void)uploadEventData:(id)parameters tag:(id)tag result:(YHDataUploadCompletion)result
57 { 38 {
58 #if !TARGET_IPHONE_SIMULATOR 39 #if !TARGET_IPHONE_SIMULATOR
59 - if (![YHEventReport sharedInstance].isClickEventTrackEnabled) {  
60 - return;  
61 - }  
62 -  
63 - if (!self.canUpload) {  
64 - return;  
65 - }  
66 - 40 +
67 NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil]; 41 NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];
68 -  
69 NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 42 NSString *parsJsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
70 NSString *parsStr = [[NSString stringWithFormat:@"_mlogs=%@",erSafeValue(parsJsonStr)]er_encodedString]; 43 NSString *parsStr = [[NSString stringWithFormat:@"_mlogs=%@",erSafeValue(parsJsonStr)]er_encodedString];
71 NSData* xmlData = [parsStr dataUsingEncoding:NSUTF8StringEncoding]; 44 NSData* xmlData = [parsStr dataUsingEncoding:NSUTF8StringEncoding];
@@ -75,10 +48,9 @@ @@ -75,10 +48,9 @@
75 [self.uploadEventRequest setValue:(@(self.uploadEventRequest.HTTPBody.length)).description forHTTPHeaderField:@"Content-Length"]; 48 [self.uploadEventRequest setValue:(@(self.uploadEventRequest.HTTPBody.length)).description forHTTPHeaderField:@"Content-Length"];
76 NSURLSessionDataTask *task = [self.uploadSession dataTaskWithRequest:self.uploadEventRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 49 NSURLSessionDataTask *task = [self.uploadSession dataTaskWithRequest:self.uploadEventRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
77 if (error) { 50 if (error) {
78 - //YHLog(@"error = %@",error);  
79 - result(NO,tag,error); 51 + BLOCK_EXEC(result, NO, tag, error);
80 }else{ 52 }else{
81 - result(YES,tag,nil); 53 + BLOCK_EXEC(result, YES, tag, nil);
82 } 54 }
83 }]; 55 }];
84 56
@@ -86,20 +58,14 @@ @@ -86,20 +58,14 @@
86 #endif 58 #endif
87 } 59 }
88 60
89 -- (void)uploadPerformanceData:(id)parameters tag:(id)tag result:(void (^)(BOOL isSuc,id tag, NSError *error))result 61 +- (void)uploadPerformanceData:(id)parameters tag:(id)tag result:(YHDataUploadCompletion)result
90 { 62 {
91 #if !TARGET_IPHONE_SIMULATOR 63 #if !TARGET_IPHONE_SIMULATOR
92 - if (![YHEventReport sharedInstance].isPerformanceTrackEnabled && ![YHEventReport sharedInstance].isAppReportEnable) {  
93 - return;  
94 - }  
95 -  
96 - if (!self.canUpload) {  
97 - return;  
98 - } 64 +
99 NSData *postData = [self getBodyData:parameters]; 65 NSData *postData = [self getBodyData:parameters];
100 if (!postData) { 66 if (!postData) {
101 NSError *nullError = [[NSError alloc] initWithDomain:@"YoHoErrorDomain" code:-11111 userInfo:@{NSLocalizedDescriptionKey:@"data 不能为空!"}]; 67 NSError *nullError = [[NSError alloc] initWithDomain:@"YoHoErrorDomain" code:-11111 userInfo:@{NSLocalizedDescriptionKey:@"data 不能为空!"}];
102 - result(NO,nil,nullError); 68 + BLOCK_EXEC(result, NO, tag, nullError);
103 return; 69 return;
104 } 70 }
105 71
@@ -107,10 +73,9 @@ @@ -107,10 +73,9 @@
107 [self.uploadPerformanceRequest setValue:(@(self.uploadPerformanceRequest.HTTPBody.length)).description forHTTPHeaderField:@"Content-Length"]; 73 [self.uploadPerformanceRequest setValue:(@(self.uploadPerformanceRequest.HTTPBody.length)).description forHTTPHeaderField:@"Content-Length"];
108 NSURLSessionDataTask *task = [self.uploadSession dataTaskWithRequest:self.uploadPerformanceRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 74 NSURLSessionDataTask *task = [self.uploadSession dataTaskWithRequest:self.uploadPerformanceRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
109 if (error) { 75 if (error) {
110 - //YHLog(@"error = %@",error);  
111 - result(NO,tag,error); 76 + BLOCK_EXEC(result, NO, tag, error);
112 }else{ 77 }else{
113 - result(YES,tag,nil); 78 + BLOCK_EXEC(result, YES, tag, nil);
114 } 79 }
115 }]; 80 }];
116 81
@@ -119,7 +84,7 @@ @@ -119,7 +84,7 @@
119 } 84 }
120 85
121 #pragma mark 百度连接状态诊断 86 #pragma mark 百度连接状态诊断
122 -- (void)getbaiduNetStatus:(NSDictionary *)parameters completionBlock:(void (^)(NSTimeInterval cts, NSInteger errCode))diagnosisBlock 87 +- (void)getbaiduNetStatusWithCompletionBlock:(YHBaiduCheckCompletion)diagnosisBlock
123 { 88 {
124 if (!diagnosisBlock) { 89 if (!diagnosisBlock) {
125 return; 90 return;
@@ -138,9 +103,9 @@ @@ -138,9 +103,9 @@
138 } else { 103 } else {
139 ect = error.code; 104 ect = error.code;
140 } 105 }
141 - diagnosisBlock(durationTime,ect); 106 + BLOCK_EXEC(diagnosisBlock, durationTime, ect);
142 }else{ 107 }else{
143 - diagnosisBlock(durationTime,httpResponse.statusCode); 108 + BLOCK_EXEC(diagnosisBlock, durationTime, httpResponse.statusCode);
144 } 109 }
145 }]; 110 }];
146 111
@@ -204,23 +169,7 @@ @@ -204,23 +169,7 @@
204 NSURL *url = [NSURL URLWithString:kYOHONetworkDiagnosisURL]; 169 NSURL *url = [NSURL URLWithString:kYOHONetworkDiagnosisURL];
205 _networkDiagnosisRequest = [NSMutableURLRequest requestWithURL:url]; 170 _networkDiagnosisRequest = [NSMutableURLRequest requestWithURL:url];
206 } 171 }
207 -  
208 return _networkDiagnosisRequest; 172 return _networkDiagnosisRequest;
209 } 173 }
210 174
211 -  
212 -#pragma mark - NSNotificationCenter  
213 -- (void)networkStateChange  
214 -{  
215 - YH_Reachability *wifi = [YH_Reachability reachabilityForLocalWiFi];  
216 - YH_Reachability *conn = [YH_Reachability reachabilityForInternetConnection];  
217 -  
218 - if ([wifi currentReachabilityStatus] == YHNetworkStatusNotReachable && [conn currentReachabilityStatus] == YHNetworkStatusNotReachable) {  
219 - //YHLog(@"没有网络");  
220 - self.canUpload = NO;  
221 - }else {  
222 - //YHLog(@"有网络");  
223 - self.canUpload = YES;  
224 - }  
225 -}  
226 @end 175 @end