182 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
		
		
			
		
	
	
			182 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
|  | //
 | ||
|  | //  TAFirebaseSyncData.m
 | ||
|  | //  ThinkingSDK.default-Base-Core-Extension-Util-iOS
 | ||
|  | //
 | ||
|  | //  Created by wwango on 2022/9/28.
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #import "TAFirebaseSyncData.h"
 | ||
|  | #import <objc/runtime.h>
 | ||
|  | //#import <objc/message.h>
 | ||
|  | 
 | ||
|  | @implementation TAFirebaseSyncData
 | ||
|  | 
 | ||
|  | #pragma clang diagnostic push
 | ||
|  | #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
 | ||
|  | 
 | ||
|  | - (void)syncThirdData:(id<TAThinkingTrackProtocol>)taInstance property:(NSDictionary *)property {
 | ||
|  |     
 | ||
|  |     if (!self.customPropety || [self.customPropety isKindOfClass:[NSDictionary class]]) {
 | ||
|  |         self.customPropety = @{};
 | ||
|  |     }
 | ||
|  |     
 | ||
|  | //    NSString *distinctId = [taInstance getDistinctId] ? [taInstance getDistinctId] : @"";
 | ||
|  | //
 | ||
|  | //    Class cls = NSClassFromString(@"FIRAnalytics");
 | ||
|  | //    SEL sel = NSSelectorFromString(@"setUserID:");
 | ||
|  | //    if (cls && [cls respondsToSelector:sel]) {
 | ||
|  | //        [cls performSelector:sel withObject:distinctId];
 | ||
|  | //    }
 | ||
|  |     
 | ||
|  |     [self registTDMethods];
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #pragma mark - Firebase Analytics
 | ||
|  | 
 | ||
|  | //// 原始方法实现
 | ||
|  | //void (*ori_method_logEventWithOrigin_IMP)(id, SEL, id, BOOL, id, id);
 | ||
|  | //// 交换方法实现
 | ||
|  | //void method_td_logEventWithOrigin_IMP(id self, SEL _cmd, id orgin, BOOL isPublicEvent, id name, id parameters) {
 | ||
|  | //    NSLog(@"This is a dynamic method: [%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
 | ||
|  | //    if(ori_method_logEventWithOrigin_IMP) {
 | ||
|  | //        ori_method_logEventWithOrigin_IMP(self, _cmd, orgin, isPublicEvent, name, parameters);
 | ||
|  | //    }
 | ||
|  | //}
 | ||
|  | 
 | ||
|  | //// 原始方法实现
 | ||
|  | //void (*ori_method_queueOperationWithBlock_IMP)(id, SEL, id);
 | ||
|  | //// 交换方法实现
 | ||
|  | //void method_td_queueOperationWithBlock_IMP(id self, SEL _cmd, id block) {
 | ||
|  | //    NSLog(@"This is a dynamic method: [%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
 | ||
|  | //    if(ori_method_queueOperationWithBlock_IMP) {
 | ||
|  | //        ori_method_queueOperationWithBlock_IMP(self, _cmd, block);
 | ||
|  | //    }
 | ||
|  | //}
 | ||
|  | 
 | ||
|  | // 原始方法实现
 | ||
|  | void (*ori_method_notifyEventListeners_IMP)(id, SEL, id);
 | ||
|  | // 交换方法实现
 | ||
|  | void method_td_notifyEventListeners_IMP(id self, SEL _cmd, id notify) {
 | ||
|  |     NSString *name = [notify valueForKey:@"_name"];
 | ||
|  |     //NSString *origin = [notify valueForKey:@"_origin"];
 | ||
|  |     NSDictionary *parameters = [notify valueForKey:@"_parameters"];
 | ||
|  |     [NSClassFromString(@"TDAnalytics") performSelector:NSSelectorFromString(@"track:properties:") withObject:name withObject:parameters];
 | ||
|  |     if(ori_method_notifyEventListeners_IMP) {
 | ||
|  |         ori_method_notifyEventListeners_IMP(self, _cmd, notify);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // 原始方法实现
 | ||
|  | void (*ori_method_setUserPropertyString_IMP)(id, SEL, id, id);
 | ||
|  | // 交换方法实现
 | ||
|  | void method_td_setUserPropertyString_IMP(id self, SEL _cmd, id value, id name) {
 | ||
|  |     [NSClassFromString(@"TDAnalytics") performSelector:NSSelectorFromString(@"setSuperProperties:") withObject:[NSDictionary dictionaryWithObject:value forKey:name]];
 | ||
|  |     if(ori_method_setUserPropertyString_IMP) {
 | ||
|  |         ori_method_setUserPropertyString_IMP(self, _cmd, value, name);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | // 原始方法实现
 | ||
|  | void (*ori_method_setUserID_IMP)(id, SEL, id);
 | ||
|  | // 交换方法实现
 | ||
|  | void method_td_setUserID_IMP(id self, SEL _cmd, id userId) {
 | ||
|  |     [NSClassFromString(@"TDAnalytics") performSelector:NSSelectorFromString(@"setSuperProperties:") withObject:[NSDictionary dictionaryWithObject:userId forKey:@"userId"]];
 | ||
|  |     if(ori_method_setUserID_IMP) {
 | ||
|  |         ori_method_setUserID_IMP(self, _cmd, userId);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // 原始方法实现
 | ||
|  | void (*ori_method_setDefaultEventParameters_IMP)(id, SEL, id);
 | ||
|  | // 交换方法实现
 | ||
|  | void method_td_setDefaultEventParameters_IMP(id self, SEL _cmd, id parameters) {
 | ||
|  |     [NSClassFromString(@"TDAnalytics") performSelector:NSSelectorFromString(@"setSuperProperties:") withObject:parameters];
 | ||
|  |     if(ori_method_setDefaultEventParameters_IMP) {
 | ||
|  |         ori_method_setDefaultEventParameters_IMP(self, _cmd, parameters);
 | ||
|  |     }
 | ||
|  | }
 | ||
|  | 
 | ||
|  | - (void)registTDMethods {
 | ||
|  |     static dispatch_once_t onceToken;
 | ||
|  |     dispatch_once(&onceToken, ^{
 | ||
|  |         
 | ||
|  |         // APMAnalytics method exchange
 | ||
|  |         Class desClass_APMAnalytics = objc_getClass("APMAnalytics");
 | ||
|  |         Class metaClass_APMAnalytics = object_getClass(desClass_APMAnalytics);
 | ||
|  |         bool ret = NO;
 | ||
|  |         //ret = class_addMethod(metaClass_APMAnalytics, NSSelectorFromString(@"td_logEventWithOrigin:isPublicEvent:name:parameters:"), (IMP)(method_td_logEventWithOrigin_IMP), "v@:@B@@");
 | ||
|  |         //if (ret) {
 | ||
|  |         //    Method method_logEventWithOrigin = class_getClassMethod(metaClass_APMAnalytics, NSSelectorFromString(@"logEventWithOrigin:isPublicEvent:name:parameters:"));
 | ||
|  |         //    Method method_td_logEventWithOrigin = class_getClassMethod(metaClass_APMAnalytics, NSSelectorFromString(@"td_logEventWithOrigin:isPublicEvent:name:parameters:"));
 | ||
|  |         //    //保存原始实现
 | ||
|  |         //    ori_method_logEventWithOrigin_IMP = (void(*)(id, SEL, id, BOOL, id, id))method_getImplementation(method_logEventWithOrigin);
 | ||
|  |         //    //交换方法实现
 | ||
|  |         //    method_exchangeImplementations(method_logEventWithOrigin, method_td_logEventWithOrigin);
 | ||
|  |         //}
 | ||
|  |         
 | ||
|  |         //ret = class_addMethod(metaClass_APMAnalytics, NSSelectorFromString(@"td_queueOperationWithBlock:"), (IMP)(method_td_queueOperationWithBlock_IMP), "v@:@");
 | ||
|  |         //if (ret) {
 | ||
|  |         //    Method method_queueOperationWithBlock = class_getClassMethod(metaClass_APMAnalytics, NSSelectorFromString(@"queueOperationWithBlock:"));
 | ||
|  |         //    Method method_td_queueOperationWithBlock = class_getClassMethod(metaClass_APMAnalytics, NSSelectorFromString(@"td_queueOperationWithBlock:"));
 | ||
|  |         //    //保存原始实现
 | ||
|  |         //    ori_method_queueOperationWithBlock_IMP = (void(*)(id, SEL, id))method_getImplementation(method_queueOperationWithBlock);
 | ||
|  |         //    //交换方法实现
 | ||
|  |         //    method_exchangeImplementations(method_queueOperationWithBlock, method_td_queueOperationWithBlock);
 | ||
|  |         //}
 | ||
|  | 
 | ||
|  |         ret = class_addMethod(metaClass_APMAnalytics, NSSelectorFromString(@"td_notifyEventListeners:"), (IMP)(method_td_notifyEventListeners_IMP), "v@:@");
 | ||
|  |         if (ret) {
 | ||
|  |             Method method_notifyEventListeners = class_getClassMethod(metaClass_APMAnalytics, NSSelectorFromString(@"notifyEventListeners:"));
 | ||
|  |             Method method_td_notifyEventListeners = class_getClassMethod(metaClass_APMAnalytics, NSSelectorFromString(@"td_notifyEventListeners:"));
 | ||
|  |             //保存原始实现
 | ||
|  |             ori_method_notifyEventListeners_IMP = (void(*)(id, SEL, id))method_getImplementation(method_notifyEventListeners);
 | ||
|  |             //交换方法实现
 | ||
|  |             method_exchangeImplementations(method_notifyEventListeners, method_td_notifyEventListeners);
 | ||
|  |         }
 | ||
|  |         
 | ||
|  |         
 | ||
|  |         // FIRAnalytics method exchange
 | ||
|  |         Class desClass_FIRAnalytics = objc_getClass("FIRAnalytics");
 | ||
|  |         Class metaClass_FIRAnalytics = object_getClass(desClass_FIRAnalytics);
 | ||
|  |         ret = class_addMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"td_setUserPropertyString:forName:"), (IMP)(method_td_setUserPropertyString_IMP), "v@:@@");
 | ||
|  |         if (ret) {
 | ||
|  |             Method method_setUserPropertyString = class_getClassMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"setUserPropertyString:forName:"));
 | ||
|  |             Method method_td_setUserPropertyString = class_getClassMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"td_setUserPropertyString:forName:"));
 | ||
|  |             //保存原始实现
 | ||
|  |             ori_method_setUserPropertyString_IMP = (void(*)(id, SEL, id, id))method_getImplementation(method_setUserPropertyString);
 | ||
|  |             //交换方法实现
 | ||
|  |             method_exchangeImplementations(method_setUserPropertyString, method_td_setUserPropertyString);
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         
 | ||
|  |         ret = class_addMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"td_setUserID:"), (IMP)(method_td_setUserID_IMP), "v@:@");
 | ||
|  |         if (ret) {
 | ||
|  |             Method method_setUserID = class_getClassMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"setUserID:"));
 | ||
|  |             Method method_td_setUserID = class_getClassMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"td_setUserID:"));
 | ||
|  |             //保存原始实现
 | ||
|  |             ori_method_setUserID_IMP = (void(*)(id, SEL, id))method_getImplementation(method_setUserID);
 | ||
|  |             //交换方法实现
 | ||
|  |             method_exchangeImplementations(method_setUserID, method_td_setUserID);
 | ||
|  |         }
 | ||
|  |         
 | ||
|  |         
 | ||
|  |         ret = class_addMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"td_setDefaultEventParameters:"), (IMP)(method_td_setDefaultEventParameters_IMP), "v@:@");
 | ||
|  |         if (ret) {
 | ||
|  |             Method method_setDefaultEventParameters = class_getClassMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"setDefaultEventParameters:"));
 | ||
|  |             Method method_td_setDefaultEventParameters = class_getClassMethod(metaClass_FIRAnalytics, NSSelectorFromString(@"td_setDefaultEventParameters:"));
 | ||
|  |             //保存原始实现
 | ||
|  |             ori_method_setDefaultEventParameters_IMP = (void(*)(id, SEL, id))method_getImplementation(method_setDefaultEventParameters);
 | ||
|  |             //交换方法实现
 | ||
|  |             method_exchangeImplementations(method_setDefaultEventParameters, method_td_setDefaultEventParameters);
 | ||
|  |         }
 | ||
|  |     });
 | ||
|  | }
 | ||
|  | 
 | ||
|  | #pragma clang diagnostic pop
 | ||
|  | 
 | ||
|  | @end
 |