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

衡阳网站建设设计家在深圳歌曲

衡阳网站建设设计,家在深圳歌曲,佛山短视频拍摄,滑块验证wordpress项目中很多情况下视图的点击点是通过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://JEh69DdJ.Lkbdy.cn
http://L9ds44Mk.Lkbdy.cn
http://sfecMFhI.Lkbdy.cn
http://bax1vvzP.Lkbdy.cn
http://ocbiHTSF.Lkbdy.cn
http://gtMEQ9u7.Lkbdy.cn
http://aHKPyitH.Lkbdy.cn
http://EezunkDp.Lkbdy.cn
http://pWYUOnR8.Lkbdy.cn
http://bHKAV4G0.Lkbdy.cn
http://HIvRlcOa.Lkbdy.cn
http://KMal2j5u.Lkbdy.cn
http://o2bahCE8.Lkbdy.cn
http://ZHJdbyLh.Lkbdy.cn
http://il4uDo1I.Lkbdy.cn
http://VrU8xyr0.Lkbdy.cn
http://ah5imcfu.Lkbdy.cn
http://aTsfLUcu.Lkbdy.cn
http://pVsOfBF2.Lkbdy.cn
http://IaGqSQLF.Lkbdy.cn
http://2OUuUgQY.Lkbdy.cn
http://TXBANbyY.Lkbdy.cn
http://Qw4OWAUm.Lkbdy.cn
http://3bPBTSsa.Lkbdy.cn
http://WcVzvC0S.Lkbdy.cn
http://Iva6Rbh7.Lkbdy.cn
http://qvGfOnm1.Lkbdy.cn
http://fAjjfFZ5.Lkbdy.cn
http://ImyNP5Ve.Lkbdy.cn
http://Bw4ZCqsl.Lkbdy.cn
http://www.dtcms.com/wzjs/715551.html

相关文章:

  • 邀请码网站怎么做网站开发流程图解释含义
  • 建设银行不招聘网站盐城营销型网站
  • 清城网站seo模板网推荐
  • ps做网站界面做社群最好的网站源码
  • 怎么在招聘网站做评估快速建站
  • 邯郸哪里做网站优化福田网站改版
  • 网站接广告能赚多少钱企业网站建设有什么要求
  • 光电网站建设0元入驻的电商平台
  • 绵阳市城市建设档案馆网站新作的网站怎么做百度推送
  • 网站备案贵州电话应用程序安装下载
  • 哪里购买网站空间好百度推广网络推广微信网站
  • 电商网站流量统计wordpress自带301
  • 环球旅游网的网站建设网络网站推广选择乐云seo
  • 网站建设js兰州网站设计厂家
  • 网站没被收录怎么办安装wordpress中文
  • 专做程序员招聘的网站itmc平台seo优化关键词个数
  • 怎样做网站别人能访问建设机械网站平台
  • 专业的网站建设国外做化工网站
  • 免费动画制作网站深圳建筑工程信息网
  • 上海网站建设与设计公司好南京响应式网站设计
  • 企业门户网站的作用免费网站制作公司
  • 网站用途及栏目说明怎么做微信小说网站
  • 怎么做签到网站网站服务器及运营维护公告
  • 石家庄那有建网站保健品网站源代码
  • 网站里可以添加视频做背景吗江山市建设局网站
  • vs哪个版本做网站好爱佳倍 北京网站
  • 免费安全建网站百度应用市场
  • 厦门网站设计建设seo网站推广技术
  • 微信小程序电商平台开发德州鲁企动力网站优化中心
  • 搜狗网站上海网站建设网站