【问题标题】:get the bundle id of app from PID in ios从ios中的PID获取应用程序的捆绑ID
【发布时间】:2012-07-20 06:16:36
【问题描述】:

我正在尝试获取当前在 iphone 上运行的所有后台应用程序的列表。 我可以这样做,但我实际上得到的是所有后台应用程序 PID 的列表。

所以我有两个问题,

首先 我可以使用它的捆绑 ID 启动一个应用程序,但不能使用它的 PID。 是否可以使用 PID 启动应用程序?

第二 如果我只有它的 PID,有没有办法访问应用程序包 ID?

我知道这可以在 mac 上完成

[[NSRunningApplication runningApplicationWithProcessIdentifier:pid] bundleIdentifier]

但是可以在iphone上完成吗?

【问题讨论】:

  • 我没听错 - 您想以编程方式在另一个应用程序中启动后台运行的应用程序吗?如果是这样,我怀疑这是可能的,而且肯定是被禁止的。
  • 正确,我忘了说我正在尝试创建越狱调整,所以可能吗?
  • 所以你为越狱设备制作应用程序?会在设备的安全性和声誉方面造成漏洞的应用程序?以防万一您听取经验丰富的开发人员的建议 - 离开这个黄昏的工作。

标签: iphone bundle jailbreak launch pid


【解决方案1】:

我在 iOS(公共或私有)5.0 标头中找不到NSRunningApplication(我很确定我到处检查过,但我可能是错的......)

可能有多种方法可以做到这一点,但其中一种应该可以工作......

首先,获取有关正在运行的进程的信息。如果您无法获取捆绑 ID,但可以获取应用程序的路径,那就足够了。您可以通过以下几种方式之一做到这一点:

1) See this answer on stack overflow 或者this one。我不确定这些技术是否可以使用可执行路径...我没有深入探索它们。

2)可以通过ps shell 命令获取进程信息。例如,在命令行中使用ps -Aef 命令:

iPhone4:~/Applications/8AA99EA8-9CFC-4C17-9BD1-7C2812EDAAD4/Starbucks.app mobile$ ps -Aef
  UID   PID  PPID   C     STIME TTY           TIME CMD

  501   281     1   0   0:00.00 ??         1:02.39 /Applications/MobilePhone.app/MobilePhone
  501   282     1   0   0:00.00 ??         2:26.40 /Applications/MobileMail.app/MobileMail
  501   479     1   0   0:00.00 ??         5:45.01 /Applications/MobileSafari.app/MobileSafari
  501   490     1   0   0:00.00 ??         0:45.62 /Applications/Music~iphone.app/Music~iphone
  501   912     1   0   0:00.00 ??         0:17.65 /var/mobile/Applications/8AA99EA8-9CFC-4237-9BD1-7C2812AAAAD4/Starbucks.app/Starbucks
  501  1933     1   0   0:00.00 ??         0:51.72 /var/mobile/Applications/9962D9AE-087C-4D2E-A6AB-151230DBCDB09/Skype.app/Skype
  501  2106     1   0   0:00.00 ??         1:11.68 /var/mobile/Applications/20DCED79-B1EE-48F4-B3E1-75E9C25A0908C/Netflix.app/Netflix
  501  2259     1   0   0:00.00 ??         0:03.83 /Applications/Stocks.app/Stocks
  501  2292     1   0   0:00.00 ??         0:07.05 /var/mobile/Applications/33713030-9D3D-4BAC-8182-282973B2E5E0/ZillowMap.app/ZillowMap
  501  2568     1   0   0:00.00 ??         0:12.91 /var/mobile/Applications/55216130-10D8-498C-B477-AD18A4982E18/eBay.app/eBay
  501  2587     1   0   0:00.00 ??         0:05.10 /var/mobile/Applications/2A8DEAAD-8244-45C0-BEA9-20DA290B0117/Moviefone.app/Moviefone

我删除了一些输出,但您可以看到一些正在运行的应用程序 (*.app)。

因此,在您的应用程序中,您可以使用 systemexec 调用运行 "ps -Aef >> /var/mobile/Library/MyAppName/ps.txt",将输出发送到临时文件。然后,解析该文件以获得结果。

3) 我还在网上找到了一份 Darwin 开源的副本,并对其进行了一些修改,以便将此类数据收集到 C 字符串缓冲区中,可以通过编程方式对其进行解析。在此处获取头文件和 .c 文件:

darwin.c

darwin.h

在您的 Xcode 项目中包含这两个文件和 #include "darwin.h"。然后,像这样使用它:

OS_initialize();
size_t buffSize = 20000;  // you may need to increase this!
char buffer[buffSize];

int bytes = OS_get_table(buffer, buffSize);
if (bytes > 0) {
    self.textView.text = [NSString stringWithCString: buffer encoding: NSASCIIStringEncoding];
}

现在您有了应用程序的安装位置,打开这些目录下的 Info.plists

NSString* filename = @"/var/mobile/Applications/8AA99EA8-9CFC-4237-9BD1-7C2812EDAAD4/Starbucks.app/Info.plist";
NSDictionary* dict = 
    [[NSDictionary alloc] initWithContentsOfFile: filename];
NSString* bundleID = [dict valueForKey: @"CFBundleIdentifier"];

并读取他们的捆绑包 ID。

为了完成这项工作,您可能需要为您的应用获得 root 权限。

See here on how to do that.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多