首页 > 其他分享 >iOS开发基础136-防暴力点击

iOS开发基础136-防暴力点击

时间:2024-07-23 14:39:42浏览次数:8  
标签:Aspects iOS objc PreventSpam 点击 136 UIButton isIgnoring

要在Objective-C中创建一个高度可复用的工具类,以防止按钮的暴力点击,并且使用切面编程(AOP)的方式,我们可以考虑使用Aspects这个库来实现方法的拦截。以下是具体的实现步骤:

第一步:引入Aspects库

首先,需要将Aspects集成到项目中。Aspects是一个轻量级的AOP框架,允许你在运行时拦截类的实例方法和类方法。你可以通过CocoaPods来添加此库:

pod 'Aspects'

第二步:创建UIButton的Category

接下来,创建一个UIButton的Category,用于添加防暴力点击的逻辑。

UIButton+PreventSpam.h:

#import <UIKit/UIKit.h>

@interface UIButton (PreventSpam)

// 设置间隔时间,进行防暴力点击设置
- (void)setPreventSpamInterval:(NSTimeInterval)interval;

@end

UIButton+PreventSpam.m:

#import "UIButton+PreventSpam.h"
#import <objc/runtime.h>
#import <Aspects/Aspects.h>

static const char *UIButton_preventSpamIntervalKey = "UIButton_preventSpamIntervalKey";

@implementation UIButton (PreventSpam)

- (void)setPreventSpamInterval:(NSTimeInterval)interval {
    objc_setAssociatedObject(self, UIButton_preventSpamIntervalKey, @(interval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    // 使用Aspects进行方法拦截
    [self aspect_hookSelector:@selector(sendAction:to:forEvent:) withOptions:AspectPositionInstead usingBlock:^(id<AspectInfo> aspectInfo, SEL action, id target, UIEvent *event) {
        UIButton *button = aspectInfo.instance;
        if (button.isIgnoring) {
            return;
        }
        button.isIgnoring = YES;

        // 执行原始的 sendAction:to:forEvent: 方法
        // 这里直接调用原始方法是不合适的,因为这是一个拦截后的block,我们要重新invoke original invocation
        [[aspectInfo originalInvocation] invoke];
        
        // 延迟间隔时间后,重置为可以点击
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            button.isIgnoring = NO;
        });
    } error:NULL];
}

// 判断当前是否应该忽略点击,通过关联对象添加属性
- (void)setIsIgnoring:(BOOL)isIgnoring {
    objc_setAssociatedObject(self, @selector(isIgnoring), @(isIgnoring), OBJC_ASSOCIATION_ASSIGN);
}

- (BOOL)isIgnoring {
    return [objc_getAssociatedObject(self, @selector(isIgnoring)) boolValue];
}

@end

使用

在适当的位置设置按钮的点击间隔:

#import "UIButton+PreventSpam.h"

[myButton setPreventSpamInterval:1.0]; // 点击间隔设置为1秒

注意

  1. 本示例使用了Aspects库进行方法的拦截,这是一种运行时AOP的技巧。这里利用了Objective-C的动态特性。AOP可以帮助增加代码的可维护性和可复用性,但它也会增加代码的复杂性,使用时需要权衡。

  2. 使用关联对象(objc_setAssociatedObjectobjc_getAssociatedObject)来给UIButton动态添加属性,用于存储是否应该忽略点击和间隔时间,这是Objective-C扩展现有类功能的常用技巧。

  3. 在实际项目中,可能需要考虑多种情况和细节,如处理快速切换界面时按钮点击事件的响应等。

标签:Aspects,iOS,objc,PreventSpam,点击,136,UIButton,isIgnoring
From: https://www.cnblogs.com/chglog/p/18318351

相关文章

  • R750配置raid_通过bios
    新出厂服务器由于是uefi启动模式,开机引导过程中不会出现传统的raid卡配置界面,可以通过BIOS中进行Raid配置。 1.开机按F2选择SystemSetup进入BIOS。2.进入BIOS后,选择DeviceSettings。3.选择相应Raid卡,我这里是DellPERCH755。4.进入Raid卡界面后,选择MainMenu。5.......
  • iOS开发-多线程编程
    OC中常用的多线程编程技术:1.NSThreadNSThread是Objective-C中最基本的线程抽象,它允许程序员直接管理线程的生命周期。NSThread*myThread=[[NSThreadalloc]initWithTarget:selfselector:@selector(myThreadMainMethod:)object:nil];[myThreadstart];使用NSThread时,......
  • iOS面试题-load 和 initlize的区别
    +load和+initialize是两个与类的加载和初始化相关的特殊方法。它们在类的生命周期中的作用和调用时机有明显的区别。+load方法调用时机:+load在类初始加载进内存时调用,这通常发生在程序启动的时候,所有类和分类(Category)的+load方法在应用程序的生命周期中只会被调用一次。调用......
  • Android或iOS 与 REST/SOAP测试 工具推荐
    移动测试工具- 有助于自动测试Android或iOS应用程序1)AppiumAppium是用于移动应用程序自动化的开源测试工具之一。它允许用户测试各种原生、移动、web和混合应用程序。它还支持模拟器和模拟器上的自动测试。功能特点:这是一个简单的应用程序,需要很少的内存用于测试过程......
  • iOS开发基础135-Core Data
    Objective-C(OC)中使用CoreData是iOS应用开发中管理模型层对象的一种有效工具。CoreData使用ORM(对象关系映射)技术来抽象化和管理数据。这不仅可以节省时间,还能减少编程错误。以下是使用CoreData的详细介绍,包括示例代码,以及深入底层的一些分析。基本概念持久化......
  • SSM小说阅读网站-计算机毕业设计源码11362
    摘 要本文介绍了一个基于SSM框架和MySQL数据库的小说阅读网站的设计与实现。该网站旨在为用户提供一个方便、舒适的在线小说阅读平台。该小说阅读网站具有以下主要功能:用户注册与登录、小说分类浏览、小说搜索、阅读历史记录、小说畅听等。通过该网站,用户可以根据自己的兴......
  • 如何找到并点击特定颜色的pyautogui?
    我正在尝试创建一个脚本,一旦找到颜色就会单击它。我不知道怎么办。我所知道的是,代码将在“try”函数之后立即执行。frompyautoguiimport*importpyautoguiimporttimeimportkeyboardimportrandomimportwin32api,win32conimportwin32com.clientascomcltimport......
  • 封禁 NetBIOS Session Service 和 SMB 服务(特别是旧版本的SMB)可能是出于安全性考虑。
    封禁NetBIOSSessionService和SMB服务(特别是旧版本的SMB)可能是出于安全性考虑。这两种服务在过去的实现中存在一些安全漏洞和风险,特别是在现代网络环境中,这些风险可能会被利用来进行攻击或者未经授权的访问。下面是一些常见的安全考虑:中间人攻击:未加密的NetBIOS和旧版本......
  • Linux安全启动及Machine Owner Key(UEFI BIOS MBR GPT GRUB)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  无前言  只要装过各种系统的人都或多或少会接触到UEFI或者BIOS这样的概念。本文也不会对这些概念进行详解,本文主要把这些概念串起来,并引入MOK(Mach......
  • IOS七层模型对应的网络协议和物理设备
    以下是网络模型、对应的协议以及对应的物理设备的表格总结:网络模型层次主要功能对应协议对应物理设备物理层透明的传输比特流,确定机械及电气规范RS-232、V.35、RJ-45、FDDI等中继器、集线器、网线、调制解调器、网卡数据链路层将比特组装成帧和点到点的传递,物理地址寻址、......