我正在尝试获取 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 文件:
将这两个文件包含在您的 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 权限。
关于iphone - ios中从PID获取应用程序的bundle id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11573822/