基本上,我想知道何时向用户显示摄像机的提要,以及从哪个应用程序触发的。
我试图钩住AVCaptureSession
的-(void)startRunning;
但SBApplication *topApp = [(SpringBoard *)[UIApplication sharedApplication] _accessibilityFrontMostApplication];
不管用。事实证明,调用sharedApplication
返回null
。我也尝试在%c(SpringBoard)
或objc_getClass("SpringBoard")
上调用该方法,但结果相同。
除此之外,该挂钩仅在“消息”应用中打开相机时才起作用,尽管我在“过滤器”字典中指定了多个捆绑包,例如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吗?”,某些应用程序可能会使用其他类来捕获图像/视频,从而使此挂钩无用。作为一名越狱开发人员,我发现苹果程序员不遵守严格的编码风格。也可能有其他较低级别的函数达到相同的目的,在这种情况下,您将需要做更多的工作,因为没有与C函数并行的类转储。
关于ios - 如何在越狱中进行调整AVCaptureSession的启动并获取启动它的应用程序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23170884/