【问题标题】:How to get task port of SpringBoard in iOS7 (Jailbroken)?如何在iOS7(越狱)中获取SpringBoard的任务端口?
【发布时间】:2014-02-09 14:37:29
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c iphone-privateapi cydia tweak


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,尼克,但你知道如何获取SpringBoard 的上下文ID吗?我需要使用taskPortOfContextId 来获取contexttask port
    • 也许我应该得到SBApplicationtask port,我该如何存档?你能看看这个:stackoverflow.com/questions/22243657/…,非常感谢!
    【解决方案2】:

    有一个 SpringboardService 框架。

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

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

    【讨论】:

    • 感谢您的帮助,我按照您的说法尝试了SBSSpringBoardServerPort(),但端口错误,您能在我的帖子添加中查看我上面的代码吗?谢谢!
    • 你应该显示一个你使用端口的代码。正如我所说,每个应用程序可能会出于不同目的公开多个端口。
    • 我需要得到一个端口来创建一个IOHIDEventSystemConnectionRefIOHID 系统,看起来我应该得到SpringBoardtask port,我怎样才能得到task port?谢谢!
    • @Suge 请问你有解决办法吗?我得到了一个解决方案,可以在 iOS7 模拟器上以编程方式发送事件,但在设备上没有,我认为问题出在任务端口...
    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多