You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在React Native iOS模块中如何访问并Hook AppDelegate相关方法

Hook AppDelegate生命周期方法实现方案

方案1:监听系统通知(优先推荐,无侵入)

绝大多数系统定义的AppDelegate生命周期方法都有对应的全局通知,不需要Hook就能直接监听,不会和宿主App或其他第三方库产生冲突,是最安全的实现方式。
以applicationWillResignActive为例,对应系统通知为UIApplicationWillResignActiveNotification,示例代码如下:

// Objective-C 实现
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(onAppWillResignActive:) 
                                             name:UIApplicationWillResignActiveNotification 
                                           object:nil];

- (void)onAppWillResignActive:(NSNotification *)notification {
    // 你的业务逻辑
}
// Swift 实现
NotificationCenter.default.addObserver(self, selector: #selector(onAppWillResignActive), name: UIApplication.willResignActiveNotification, object: nil)

@objc func onAppWillResignActive() {
    // 你的业务逻辑
}

方案2:Runtime Method Swizzling(仅当无对应通知时使用)

如果你需要Hook的是AppDelegate中自定义的、没有对应系统通知的方法,可以使用Runtime方法交换实现:

#import <objc/runtime.h>

@implementation AppDelegateHookUtils

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class appDelegateCls = [UIApplication sharedApplication].delegate.class;
        SEL originalSel = @selector(applicationWillResignActive:);
        SEL swizzledSel = @selector(my_module_applicationWillResignActive:);
        
        Method originalMethod = class_getInstanceMethod(appDelegateCls, originalSel);
        Method swizzledMethod = class_getInstanceMethod(self, swizzledSel);
        
        // 优先尝试给原类添加方法,避免原类未实现该方法时Crash
        BOOL addSuccess = class_addMethod(appDelegateCls, originalSel, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
        if (addSuccess) {
            class_replaceMethod(appDelegateCls, swizzledSel, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

- (void)my_module_applicationWillResignActive:(UIApplication *)application {
    // 必须先调用原方法实现,否则会破坏宿主App原有逻辑
    [self my_module_applicationWillResignActive:application];
    // 你的业务逻辑
}

@end

注意事项:

  • 交换逻辑必须放在dispatch_once中执行,避免重复交换导致逻辑异常
  • 替换的方法名要加上你模块的唯一前缀,避免方法名冲突
  • 必须调用原方法的实现,不能阻断原有App的逻辑

方案3:代理转发(适用于SDK开发场景)

如果你的模块是对外发布的SDK,不想使用Swizzle避免和宿主App的Hook逻辑冲突,可以实现中间代理层:保存原AppDelegate对象,将UIApplication的delegate指向中间层,需要监听的方法在中间层实现后再转发给原代理,其余方法全部直接转发给原代理。该方案实现复杂度较高,需要处理多代理冲突问题,无特殊需求不推荐使用。

内容的提问来源于stack exchange,提问作者Ahmed Elrefaey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 14:45:04