基本上,我想知道何时向用户显示摄像机的提要,以及从哪个应用程序触发的。

我试图钩住AVCaptureSession-(void)startRunning;

SBApplication *topApp = [(SpringBoard *)[UIApplication sharedApplication] _accessibilityFrontMostApplication];
不管用。事实证明,调用sharedApplication返回null。我也尝试在%c(SpringBoard)objc_getClass("SpringBoard")上调用该方法,但结果相同。

除此之外,该挂钩仅在“消息”应用中打开相机时才起作用,尽管我在“过滤器”字典中指定了多个捆绑包,例如com.apple.springboardcom.facebook.Facebook等。

我究竟做错了什么?其他应用程序不使用AVCaptureSession API吗?

最佳答案

SpringBoard类仅存在于SpringBoard进程中,因此%c(SpringBoard)objc_getClass("SpringBoard")在任何其他进程上将返回nil。

要获取要挂接的应用程序的当前捆绑包名称,可以使用[[NSBundle mainBundle] bundleIdentifier]。您必须使用某种形式的IPC / XPC来发送此信息以及有关您想了解的 session 的其他信息。接收端可以是SpringBoard进程,也可以是个人守护程序,以免其他任务阻塞SpringBoard。

至于您的问题“其他应用程序不使用AVCaptureSession API吗?”,某些应用程序可能会使用其他类来捕获图像/视频,从而使此挂钩无用。作为一名越狱开发人员,我发现苹果程序员不遵守严格的编码风格。也可能有其他较低级别的函数达到相同的目的,在这种情况下,您将需要做更多的工作,因为没有与C函数并行的类转储。

关于ios - 如何在越狱中进行调整AVCaptureSession的启动并获取启动它的应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23170884/

10-12 01:10