我知道我们可以使用contextIdAtPosition
和taskPortOfContextId
来获取顶部应用程序的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
关于ios - 如何在iOS7(越狱)中获取SpringBoard的任务端口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21660397/