在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
相关产品推荐
相关产品推荐

