美文网首页项目经验iOS学习专题iOS 开发
iOS统计整个App 每个按钮的点击次数

iOS统计整个App 每个按钮的点击次数

作者: 猫爪 | 来源:发表于2015-10-16 23:10 被阅读5856次

<code>GitHub上的Demo,是最新的代码</code>ClickCountOfButton

在开发的时候需要一个问题,在产品已经完成后,产品经理来了一句

今天上架,顺道统计整个App 每个按钮的点击次数,进行数据分析 

东西都做完了,还整这个,项目原因<code>不能使用友盟</code>,但是作为一个技术宅,如果做不出来,那不是也太逊了吗,于是对需求进行了分析

  • 1.统计每个按钮的点击次数,可以给按钮增加一个 <code >clickedCount</code> 属性每次执行方法<code>clickedCount++</code>

  • 2.如果对象销毁,成员属性就释放,显然这个方法的背后还要做点什么

  • 3.如此同时,整个项目都做完,项目所有的按钮也完毕,如果要增加属性,然后在每个按钮的点击后执行的方法中要添加一些代码,这不是要搞死人的节奏吗,一个项目中的按钮, 何其多啊,而且当时使用的是<code>UIButton</code>系统自带的想一想 ,我所有的点击事件,都是<code>UIButton</code>,怎么拦截<code>UIButton</code>的添加点击事件了,同时还要记录点击的次数

  • 方法一 <code> 继承</code> <code>UIButton</code> (果断放弃,因为整个项目都完成了,可以说项目在没有这个需求下是可以没有问题的,如果使用这个方法,改动太大,那么程序出错的风险也就大,同时时间太长,再次,万一哪个按钮忘记改了,那就没统计到)

  • 方法二 <code>分类</code>(不需要改源代码的任何代码,只需要增加一个分类,侵入性小,采取)

  • 方法三 <code>runtime</code>这里也用到了

使用分类重写UIButton的方法

    /** 拦截了UIButton 所有的  
     - (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; 
    方法*/
    - (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents{  
 
     //block循环引用
     __weak typeof(target) weakTarget = target;

    //利用 关联对象 给UIButton 增加了一个 block 
     [self  setCurrentActionBlock:^{ 
        //运行时 发送 消息 执行方法
         ((void (*)(void *, SEL, UIView *))objc_msgSend)((__bridge void *)(weakTarget), action , nil); 
     }]; 
        //拦截了本身要执行的action 先执行,写下来的 xw_clicked:方法       
        [super addTarget:self action:@selector(xw_clicked:) forControlEvents:controlEvents];
    }

    //拦截了按钮点击后要执行的代码
    - (void)xw_clicked:(UIButton *)sender{  
      //统计 
      self.btnClickedCount++; 
      NSLog(@"%@ 点击 %ld次 ",[sender titleForState:UIControlStateNormal], self.btnClickedCount);  
      //执行原来要执行的方法 
      sender.currentActionBlock();
    }
      //在分类中增加了 btnClickedCount的 (setter 和 getter)方法,使用关联对象增加了相关的成员空间
    - (NSInteger)btnClickedCount{  
        id tmp = objc_getAssociatedObject(self, &xw_btnClickedCount); 
        NSNumber *number = tmp; 
        return number.integerValue;
    }

    - (void)setBtnClickedCount:(NSInteger)btnClickedCount{ 
        objc_setAssociatedObject(self, &xw_btnClickedCount, @(btnClickedCount), OBJC_ASSOCIATION_ASSIGN);
    }

测试代码

     - (void)viewDidLoad { 
        [super viewDidLoad];  
        //添加两个按钮到View上面 
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
        btn.frame = (CGRect){100,200,50,50}; 
        [btn addTarget:self action:@selector(btn1Clicked:) forControlEvents:UIControlEventTouchUpInside]; 
        [btn setTitle:@"添加A" forState:UIControlStateNormal]; [self.view addSubview:btn];   
        UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
        btn2.frame = (CGRect){200,200,50,50}; 
        [btn2 addTarget:self action:@selector(btn2Clicked:) forControlEvents:UIControlEventTouchUpInside]; 
        [btn2 setTitle:@"添加B" forState:UIControlStateNormal]; 
        [self.view addSubview:btn2];
     }
    #pragma mark - 按钮点击事件
    - (void)btn1Clicked:(UIButton *)btn{ 
        NSLog(@"btn1");  
     }
    - (void)btn2Clicked:(UIButton *)btn{ 
        NSLog(@"btn2");
    }
        ```
####效果![这里写图片描述](http:https://img.haomeiwen.com/i624018/561592e95be52b3a?imageMogr2/auto-orient/strip)

Demo下载地址:https://github.com/boyXiong/ClickCountOfButton
个人微信:wrdxxs
个人开源:https://github.com/boyXiong/XWSwiftRefresh
关注我,就会不断推出新文章

相关文章

  • iOS统计整个App 每个按钮的点击次数

    GitHub上的Demo,是最新的代码 ClickCountOfButton 在开发的时候需要一个问题,在产品已经...

  • iOS-UIButton 统计整个App 每个按钮的点击次数

    https://www.jianshu.com/p/2ba67cb09126 https://www.jiansh...

  • php记录点击量

    以下demo是记录某一按钮点击次数,延伸记录文章浏览次数,app里功能使用频率统计先建一张点击量统计表 我这里按天...

  • 移动端的无码统计

    无需开发介入,也可以统计移动App上按钮的点击次数(解放开发),只要是跟 App 开发相关的同学都对埋点统计有些了...

  • iOS微信支付结果页面返回原程序按钮

    关于iOS微信支付返回原程序按钮点击处理事件 1:点击右上角的返回App按钮 点击此按钮,走的是正常微信结果回调方...

  • AutoIt模拟鼠标操作

    MouseClick ( “按钮” [, X坐标, Y坐标 [, 点击次数 [, 速度 ]]] ) 按钮(默认点击...

  • iOS 防止button重复点击

    iOS防止button重复点击 按钮点击控制处理-Runtime IOS应用防止按钮连续点击 - 简书

  • JavaScript点击计数的实现

    关键词:点击计数 我们做个小实例,当鼠标点击每个按钮时,显示点击该按钮的次数 通常初学者会这样做 我思来想去,觉得...

  • Swift集成友盟统计:

    公司运营部提了一个需求需要统计打开某个页面的次数,点击某个按钮的次数和定时器自动关闭的次数,上次因为就这一个地方,...

  • Xcode9 iOS11适配

    1.iOS11UIToolBar上添加的按钮点击实效 测试总结:iOS11一下按钮可以正常点击iOS11以上按钮点...

网友评论

  • 44bda64c4fc7:我自定义了 好多button 只写一个UIButton的分类可以吗?
    猫爪:@前端k 可以
  • oldmonster:好像没有在info.plist中添加对访问相册的权限提示(这样会直接crash),其他的功能都是ok,赞一个
  • e42e05e62c38:怎么让点击次数 在没有连续点击的时候清零呢
    猫爪:看到你的评论,我临时想的一个建议: 需要自己设计 一个 定时器 作为监听 , 当 定时器到时间的时候,如果还没点击,就清零
  • 4b9107e9027b:我也碰到了前面两条评论说的问题,我的手机9.3.5的系统版本,点击NavigationItem也是会崩溃,出现Bad Access。后来我发现是导航栏上的按钮点击后,action跟一般的Button不一样,统一为“_sendAction:withEvent:”。我后来把这个类里面的“wx_addTarget:action:forControlEvents:”方法改成了“wx_sendAction: to: forEvent:”方法,setActionBlock 里面改成“((void (*)(void *, SEL, typeof(weakSelf),UIEvent* ))objc_msgSend)((__bridge void *)(weakTarget), action , weakSelf,event);”其他相关的地方也跟着修改了,点击导航栏上的按钮就没问题了。现在用真机9.3.5和模拟器10.1都是正常的。
    喝酸奶舔下盖:这个问题确实是导航栏的item上点击方法引起的,7楼正解!
  • 钢铁少侠:发现一个bug,如果是这样写的 NavigationItem,点击就会崩溃掉
    UIBarButtonItem *backButton1 =[[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"back.png"] style:UIBarButtonItemStylePlain target:self action:@selector(backToList:)];
    喝酸奶舔下盖:这个解决了没呢???
  • xixi007:这个处理在iOS9 打开相册之后 点击相册的取消 按钮 会crash 有办法解决不
    xixi007:@猫爪 稍等 我弄一个 上去
    xixi007:@猫爪 是从git 上面下载的。报错在 //运行时 发送 消息 执行方法
    ((void (*)(void *, SEL, UIButton *))objc_msgSend)((__bridge void *)(weakTarget), action , weakSelf);

    }];
    猫爪:@xixi007 是下载的Github的Demo不,Github上面的,我更新了代码
  • AKyS佐毅:建议还是使用切面编程AOP
  • 0176039ba631:@猫爪 我复制你的代码过去,同一个按钮连续点击到13次就会崩
    fei_飞:点击到第13次确实会崩,我把btnClickedCount中换成OBJC_ASSOCIATION_RETAIN_NONATOMIC就好了
    猫爪:@本杰明将军 这是一个简单的思路,代码,你可以在我给的那个网址上面下载,复制过去或许有点问题,项目统计不是这样统计的,你可以使用全局字典,或者模型,来记录更详细的信息,
  • 0176039ba631:记录点击次数的btnClickedCount动态添加set方法的策略应该换成 OBJC_ASSOCIATION_RETAIN_NONATOMIC
    95c9800fdf47:@本杰明将军 不需要的,直接assion 就行了
    猫爪:@本杰明将军 不是对象类型,不需要retain

本文标题:iOS统计整个App 每个按钮的点击次数

本文链接:https://www.haomeiwen.com/subject/rblacttx.html