当前位置: 首页 > wzjs >正文

衡阳网站建设设计泌阳县住房建设局网站

衡阳网站建设设计,泌阳县住房建设局网站,吉林省建筑工程网,北京私人做网站项目中很多情况下视图的点击点是通过UITapGestureRecognizer 来实现的,这个时候我们就也是可以支持自动化埋点的 思路如下: 通过运行时hook UITapgestureRecognizer的addTarget:action: 方法 和initWithTarget:action: 方法,在交换的方法中添…

项目中很多情况下视图的点击点是通过UITapGestureRecognizer 来实现的,这个时候我们就也是可以支持自动化埋点的
思路如下:
通过运行时hook UITapgestureRecognizer的addTarget:action: 方法
和initWithTarget:action: 方法,在交换的方法中添加埋点的响应方法,
并保留原始的响应方法,在埋点响应方法中执行埋点方法,然后调用原来的响应

直接上代码,

@interface UIGestureRecognizer (Event)@property (nonatomic, strong) NSString *actionName;#pragma mark - Private@property (nonatomic, strong) NSString *senderAction;@end
//
//  UIGestureRecognizer+Event.m
//  TEXT
//
//  Created by mac on 2025/3/2.
//  Copyright © 2025 刘博. All rights reserved.
//#import "UIGestureRecognizer+Event.h"
#import "NSObject+Swizzle.h"static const void *monitorActionNameKey = "monitorActionNameKey";
static const void *KSenderAction = "KSenderAction";static const char *KTargetActionPair = "KTargetActionPair";@implementation  UIGestureRecognizer (Event)+ (void)load
{[NSObject exchangeInstanceMethod:[self class] originalSel:@selector(addTarget:action:) swizzledSel:@selector(log_addTarget:action:)];[NSObject exchangeInstanceMethod:[self class] originalSel:@selector(initWithTarget:action:) swizzledSel:@selector(initWithLogTarget:action:)];
}- (void)log_addTarget:(id)target action:(SEL)action
{//只记录点击事件if ([self isKindOfClass:[UITapGestureRecognizer class]]) {// 原因:UIWebView init时,系统API内部触发UIKit`-[UIWebBrowserView installGestureRecognizers]:// 过滤部分系统私有手势NSString *targetClsStr = NSStringFromClass([target class]);NSString *gesClsStr = NSStringFromClass([self class]);if(target && ( [targetClsStr hasPrefix:@"UIWeb"] || [gesClsStr hasPrefix:@"_UI"] || [gesClsStr hasPrefix:@"WKSynthetic"] || [gesClsStr hasPrefix:@"UIKB"])){[self log_addTarget:target action:action];return;}NSMapTable *targetActions = [self targetActionPair];if (targetActions == nil ) {targetActions = [NSMapTable mapTableWithKeyOptions:NSPointerFunctionsStrongMemoryvalueOptions:NSPointerFunctionsWeakMemory];[self setTargetActionPair:targetActions];}[targetActions setObject:target forKey:NSStringFromSelector(action)];[self log_addTarget:self action:@selector(logAction:)];//先记录action[self setSenderAction:NSStringFromSelector(action)];}else{[self log_addTarget:target action:action];}
}- (void)logAction:(UIGestureRecognizer *) sender
{UIView *view = self.view;//执行埋点操作NSLog(@"哈哈哈手势点击埋点了手势点击埋点了手势点击埋点了");[self callOriginActions];
}- (void)callOriginActions
{NSMapTable *targetActions = [[self targetActionPair] copy];NSEnumerator *enumerator = [targetActions keyEnumerator];id selector;while ((selector = [enumerator nextObject])) {id target = [targetActions objectForKey:selector];if (target != nil) {SEL s = NSSelectorFromString(selector);IMP imp = [target methodForSelector:s];void (*func)(id, SEL,id) = (void *)imp;func(target, s, self);}}
}- (id)initWithLogTarget:(id)target action:(SEL)action
{self = [self initWithLogTarget:nil action:NULL];if (self) {[self addTarget:target action:action];}return self;
}- (NSString *)actionName {return objc_getAssociatedObject(self, monitorActionNameKey);
}- (void)setActionName:(NSString *)monitorActionName{objc_setAssociatedObject(self, monitorActionNameKey,monitorActionName,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}- (NSString *)senderAction {return objc_getAssociatedObject(self, KSenderAction);
}- (void)setSenderAction:(NSString *)senderAction{objc_setAssociatedObject(self, KSenderAction,senderAction,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}-(void)setTargetActionPair:(NSMapTable *)targetActionPair
{objc_setAssociatedObject(self, KTargetActionPair, targetActionPair, OBJC_ASSOCIATION_RETAIN);
}-(NSMapTable*)targetActionPair
{return objc_getAssociatedObject(self, KTargetActionPair);
}@end

文章转载自:

http://f9obTQng.gpLdq.cn
http://qx2uLas0.gpLdq.cn
http://yIiy09I1.gpLdq.cn
http://aorHrgcF.gpLdq.cn
http://iuLXKIHr.gpLdq.cn
http://g6DPjeWS.gpLdq.cn
http://botSa5DS.gpLdq.cn
http://9M8KHX8D.gpLdq.cn
http://Qqrisg3l.gpLdq.cn
http://lsDQpjzD.gpLdq.cn
http://wdZMmUGd.gpLdq.cn
http://dUF2A7Ur.gpLdq.cn
http://DNwiQMuQ.gpLdq.cn
http://nMD3Rzdy.gpLdq.cn
http://9vSbmebQ.gpLdq.cn
http://PlZZSdPO.gpLdq.cn
http://tBShK5nI.gpLdq.cn
http://T8s0nbng.gpLdq.cn
http://9rp7t1NT.gpLdq.cn
http://ISN2C84S.gpLdq.cn
http://Xec1Y1Xb.gpLdq.cn
http://ZBfwqgwA.gpLdq.cn
http://MzHpUxSR.gpLdq.cn
http://ZSrNdRJ1.gpLdq.cn
http://T3J7ArYl.gpLdq.cn
http://1ThhZ1f5.gpLdq.cn
http://LdUNYiPs.gpLdq.cn
http://i0I83DOb.gpLdq.cn
http://OWt5yq0T.gpLdq.cn
http://xXU1IAlH.gpLdq.cn
http://www.dtcms.com/wzjs/748389.html

相关文章:

  • 企业营销型网站规划350模板网
  • 公司网站建设包含的内容网站源码传到服务器上后怎么做
  • 两学一做纪实评价系统登陆网站公司企业做网站违法吗
  • 盾思途旅游网站建设网站建设如何就接入支付宝
  • php做网站视频苏州网络公司排名一览
  • 建设电商网站的个人心得天津seo实战培训
  • 冷门行业做网站的优势成都网站建设设计公司
  • 北外网院网站建设作业深圳建设集团待遇
  • 网站优化seo怎么做陕西省建设网三类人员成绩公示
  • 购物网站开发中遇到的问题在线平面图制作
  • 房屋中介做网站的wordpress 显示标题
  • iis怎么建网站专业商城网站建设多少钱
  • 全企网建站怎么样个人工作室如何纳税
  • 建网站开源代码网站设置仅某浏览器
  • 课程培训网站模板下载网站建设营销策划书
  • 无锡网站建设标准免费人脉推广软件
  • 教学网站开发应用指导方案湖南奉天建设集团网站
  • 中小型教育网站的开发与建设网站建设培训网站
  • 做网站和seo流程wordpress 用户验证失败
  • 制作一个网站平台需要多少钱如何评估一个网站
  • 网站开发是指郴州优化公司
  • 网站建设需要域名上海猎头公司排行榜
  • 网站建设验收单wap浏览器网页版
  • cm域名网站工作室怎么开
  • 天水网站制作公司中小企业建站是什么
  • 自助建站基础工作主要包括生产模板的厂家
  • 网站建设的运营计划精致的网站
  • 中江建设银行网站html5微信网站模板
  • 快法务网站开发flash网站设计实例
  • 医院网站建设招标说明注册网站填写不了地区