使用公共/非公共/私有API在设备上获得顶级UIWIndow/UIView

Ida*_*she 2 objective-c ios

我试图找出如何找到利用非公开/私有API最顶部的视图,有没有什么办法做这件事(的iOS 7.1.2)?

编辑:

也许我不清楚,无论现在哪个应用程序处于活动状态(facebook,whatsapp,游戏,锁屏,日历等),我都希望得到最顶级的视图.

Rya*_*ton 6

选项

如果我理解正确,你想要在另一个应用程序窗口的顶部显示UIView.在应用程序沙箱中,您只能访问自己的应用程序窗口.然而,越狱将允许你这样做,但这并不简单.

为了在应用程序之上显示视图,您有三种选择.您选择哪个选项取决于您要执行的操作.

  1. 将代码注入第三方应用程序
  2. 将代码注入SpringBoard
  3. 使用方法1和2的组合.

选项1

如果您选择使用此路由,则您的代码将在每个第三方应用程序中运行.这允许您修改应用程序的视图层次结构以显示您自己的窗口,甚至可以修改现有窗口.由于您的代码在应用程序中运行,您只需调用以下命令即可获取密钥窗口:

[[UIApplication sharedApplication] keyWindow]
Run Code Online (Sandbox Code Playgroud)

选项2

如果选择此选项,则无论打开哪个应用程序,您的代码都将运行.通过获取主窗口,您可以显示任何内容的UI,包括系统警报.我在rpendleton/tutorials/so-26032688上向GitHub发布了一个这样的例子.该示例在用户将手机从静音状态中随时显示警报.检索SpringBoard窗口的代码是:

[[NSClassFromString(@"SBUIController") sharedInstance] window]
Run Code Online (Sandbox Code Playgroud)

选项3

第三个选项,也是您最终可能使用的选项,是选项1和2的组合.在这种情况下,您将代码注入第三方应用程序,然后与SpringBoard通信以确定需求要完成.通常,您的应用程序将与SpringBoard通信,然后SpringBoard可以将该信息转发到所需的应用程序.您可以在应用程序和第三方应用程序之间直接通信,但我没有尝试过.

通讯

为了在您的应用程序和SpringBoard/或其他第三方应用程序之间进行通信,您需要使用消息传递系统.进行此通信的简单方法是通过名为RocketBootstrap的开源库.

截图

左侧的屏幕截图来自我在GitHub上发布的示例,右侧的屏幕截图来自我的一个调整AppScan.虽然我在两者中都有提醒,但您可以显示您想要的任何视图.

示例2截图