我们能够获取iPhone和iPad中当前正在运行的应用程序吗?

13

我们能否检索当前在iPhone和iPad上运行的应用程序?

更新

我们能否在越狱手机上执行此操作?我们能否针对CYDIA商店的应用进行此操作?

2个回答

29
你可以获取正在运行的进程列表,从进程ID中可以确定哪些是系统进程,哪些是第三方应用程序,但无论如何我不相信你可以将其用于应用商店的应用程序中。(代码来源:这里
- (NSArray *)runningProcesses {

    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
    size_t miblen = 4;

    size_t size;
    int st = sysctl(mib, miblen, NULL, &size, NULL, 0);

    struct kinfo_proc * process = NULL;
    struct kinfo_proc * newprocess = NULL;

    do {

        size += size / 10;
        newprocess = realloc(process, size);

        if (!newprocess){

            if (process){
                free(process);
            }

            return nil;
        }

        process = newprocess;
        st = sysctl(mib, miblen, process, &size, NULL, 0);

    } while (st == -1 && errno == ENOMEM);

    if (st == 0){

        if (size % sizeof(struct kinfo_proc) == 0){
            int nprocess = size / sizeof(struct kinfo_proc);

            if (nprocess){

                NSMutableArray * array = [[NSMutableArray alloc] init];

                for (int i = nprocess - 1; i >= 0; i--){

                    NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];
                    NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];

                    NSDictionary * dict = [[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:processID, processName, nil] 
                                                                        forKeys:[NSArray arrayWithObjects:@"ProcessID", @"ProcessName", nil]];
                    [processID release];
                    [processName release];
                    [array addObject:dict];
                    [dict release];
                }

                free(process);
                return [array autorelease];
            }
        }
    }

    return nil;
}:

2
@Krishnan,这段代码可在未越狱的设备上运行,但苹果可能禁止在应用程序中使用此功能。如果您想针对Cydia商店进行开发,可以这样做(我认为(但不确定)我曾经看到过一款类似任务管理器的应用程序-显示所有正在运行的应用程序并允许终止它们)。 - Vladimir
谢谢你。如果你得到了关于这个的任何其他信息,请分享给我。 - RK-
5
在App Store上确实可以做类似的事情。这是证据:https://dev59.com/D2sy5IYBdhLWcg3w2Bo6 - dontWatchMyProfile
@DmitryIsakov 你有找到iOS9+ 的解决方法吗? - Valerio Santinelli
@ValerioSantinelli:如果您在沙盒之外,此方法有效。如果您想要列表,请创建一个非沙盒助手,然后使用IPC从该助手获取它。 - kennytm

2
为什么要循环直到内存用尽?我认为这样会简单得多 ;)
size_t size;
struct kinfo_proc *procs = NULL;
int status;

int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };

status  = sysctl(mib, 4, NULL, &size, NULL, 0);
procs   = malloc(size);
status  = sysctl(mib, 4, procs, &size, NULL, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接