基本上,我想知道什么时候向用户展示了相机画面,以及这是从哪个应用程序触发的。
我试图 Hook AVCaptureSession
的 -(void)startRunning;
但是
SBApplication *topApp = [(SpringBoard *)[UIApplication sharedApplication] _accessibilityFrontMostApplication];
不工作。结果是调用 sharedApplication
返回 null
。我也试过在 %c(SpringBoard)
或 objc_getClass("SpringBoard")
上调用方法,但结果相同。
除此之外,钩子(Hook)仅在消息应用程序中打开相机时才起作用,尽管我在过滤器字典中指定了几个 bundle ,如 com.apple.springboard
、com.facebook.Facebook
等
我做错了什么? AVCaptureSession
API 是否被其他应用程序使用?
最佳答案
SpringBoard 类仅存在于 SpringBoard 进程中,因此 %c(SpringBoard)
或 objc_getClass("SpringBoard")
将在任何其他进程中返回 nil。
要获取您正在挂接的应用程序的当前包名称,您可以使用 [[NSBundle mainBundle] bundleIdentifier]
。您必须使用某种形式的 IPC/XPC 来发送此信息以及有关您想了解的 session 的其他信息。接收端可以是 SpringBoard 进程或个人守护进程,以免因额外任务而阻塞 SpringBoard。
至于您的问题“AVCaptureSession
API 不是被其他应用程序使用了吗?”,可能某些应用程序使用其他类来捕获图像/视频,从而导致此 Hook 无用。作为一名越狱开发者,我和许多其他人一样发现,Apple 程序员并不遵守严格的编码风格。还可以有其他较低级别的函数来实现相同的目的,在这种情况下,您将需要做更多的工作,因为没有与 C 函数并行的类转储。
关于ios - 如何在越狱调整中检测 AVCaptureSession 启动并获取哪个应用程序启动它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23170884/