如何在iOS7(越狱)获得SpringBoard的任务端口?

我知道我们可以使用contextIdAtPositiontaskPortOfContextId来获得前端应用程序的mach_port_t ,但是当在一些应用程序中时,我们不能使用contextIdAtPosition来获取SpringBoard的上下文ID(它在后台),那么我们如何获得mach_port_t SpringBoard ? 谢谢!

根据http://theiphonewiki.com/wiki//System/Library/LaunchDaemons/com.apple.SpringBoard.plist,SpringBoard已经暴露了很多的服务。 其中两个可能(或可能不)是你的兴趣:

  • “com.apple.iohideventsystem”
  • “com.apple.springboard”

以下是通过服务名称查询端口的示例代码。

 #include <mach/mach.h> #include "bootstrap.h" #include <stdio.h> #include <stdlib.h> #define CHECK_MACH_ERROR(a) do {kern_return_t rr = (a); if ((rr) != KERN_SUCCESS) \ { printf("Mach error %x (%s) on line %d of file %s\n", (rr), mach_error_string((rr)), __LINE__, __FILE__); abort(); } } while (0) int main(int argc, char **argv, char **envp) { mach_port_t bp = MACH_PORT_NULL; mach_port_t sp = MACH_PORT_NULL; kern_return_t err = task_get_bootstrap_port(mach_task_self(), &bp); CHECK_MACH_ERROR(err); printf("bp:%d\n", bp); err = bootstrap_look_up(bp, "com.apple.iohideventsystem", &sp); CHECK_MACH_ERROR(err); printf("iohideventsystem:%d\n", sp); err = bootstrap_look_up(bp, "com.apple.springboard", &sp); CHECK_MACH_ERROR(err); printf("springboard:%d\n", sp); // need to deallocate ports before exit return 0; } 

输出:

 my-iPad:~ root# /usr/bin/port_query bp:519 iohideventsystem:4099 springboard:4355 

有一个SpringboardService框架。

它有一个函数SBSSpringBoardServerPort() ,它返回Springboard的mach端口。

注意:每个应用程序可能有多个mach端口,所以我不确定它是否是您需要的。