iphone - ios中从PID获取应用程序的bundle id

标签 iphone bundle jailbreak launch pid

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

所以我有两个问题,

第一 我可以使用其 bundle ID 启动应用程序,但不能使用其 PID。 是否可以启动带有 PID 的应用程序?

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

我知道这可以在 Mac 上完成

[[NSRunningApplication runningApplicationWithProcessIdentifier:pid] bundleIdentifier]

但是可以在 iPhone 上完成吗?

最佳答案

我在 iOS(公共(public)或私有(private))5.0 header 中找不到 NSRunningApplication (我很确定我检查了所有地方,但我可能是错的......)

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

首先,获取有关正在运行的进程的信息。如果您无法获取 bundle 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)。

因此,在您的应用中,您可以使用系统exec 调用,将输出发送到临时文件。然后,解析该文件以获取结果。

3) 我还在网上找到了 Darwin 开源的副本,并对它进行了一些修改,将此类数据收集到 C 字符串缓冲区中,可以通过编程方式进行解析。在此处获取 header 和 .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.plist

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"];

并读取它们的 bundle ID。

为了实现此功能,您可能需要获得应用的 root 权限。

See here on how to do that .

关于iphone - ios中从PID获取应用程序的bundle id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11573822/

相关文章:

ios - 在 iphone 中启动没有 URL 架构的其他应用程序?

ios - xcode 4.2.1 构建失败不允许操作

iphone - iPhone应用程式当机(Jettisoned)问题

ios - 如何自定义分组表格 View 单元格的背景/边框颜色?

php - 从手机到网站的客户端/服务器安全

ios - iOS 中场景和 View 的区别

ruby-on-rails - jRuby bundle 安装错误

Azure 发布版本不显示 bundle

python - 如何通过 Python 为 Python 脚本创建 Mac 应用程序包

ios - 如何在越狱的ios设备上启用热点服务