iOS:查找用户打开本应用时导致播客/音乐音频暂停的依赖库
定位第三方库抢占AVAudioSession的调试方案
方案1:符号断点法(无需修改任何代码,最快定位)
- 打开Xcode的断点导航器(
Cmd + 8快捷键可直接打开),点击左下角+号选择符号断点(Symbolic Breakpoint) - 依次添加2个断点的符号:
-[AVAudioSession setActive:withOptions:error:]-[AVAudioSession setCategory:mode:options:error:]
- 运行App触发音频中断的场景,断点命中后查看左侧调用栈列表,就能直接看到是哪个Pod库的代码触发了AVAudioSession的修改。
方案2:系统日志过滤法
- 连接测试设备到Xcode,点击顶部菜单
Window -> Devices and Simulators,选择当前测试设备后点击Open Console - 在Console的搜索框输入过滤规则:
process:你的App名 AND subsystem:com.apple.avfoundation - 启动App触发中断,日志会输出AVAudioSession状态变更的完整上下文,包含调用方库名、设置的音频分类、抢占原因等信息。
方案3:运行时Hook验证(适合断点触发不清晰的场景)
在App启动最早期(比如main.m或者AppDelegate的didFinishLaunchingWithOptions最开头)添加如下调试代码,运行后查看控制台打印的调用栈即可定位调用方:
#import <objc/runtime.h> #import <AVFoundation/AVFoundation.h> @implementation AVAudioSession (DebugAudioInterrupt) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method origin = class_getInstanceMethod(self, @selector(setActive:withOptions:error:)); Method debug = class_getInstanceMethod(self, @selector(debug_setActive:withOptions:error:)); method_exchangeImplementations(origin, debug); }); } - (BOOL)debug_setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError **)error { NSLog(@"AVAudioSession被调用,调用栈:\n%@", [NSThread callStackSymbols]); return [self debug_setActive:active withOptions:options error:error]; } @end
调试完成后直接删除这段代码即可,无需修改任何Pod依赖或业务逻辑。
内容的提问来源于stack exchange,提问作者Kevv Keka
相关产品推荐
相关产品推荐

