我知道我们可以使用contextIdAtPositiontaskPortOfContextId来获取顶部应用程序的mach_port_t,但是在某些应用程序中时,我们不能使用contextIdAtPosition来获取SpringBoard的上下文ID(它位于背景中) ),那么如何获得mach_port_tSpringBoard?谢谢!

最佳答案

根据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

关于ios - 如何在iOS7(越狱)中获取SpringBoard的任务端口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21660397/

10-09 09:09