Can we retrieve the applications currently running in iPhone and iPad
Asked Answered
C

2

13

Can we retrieve the applications currently running in iPhone and iPad?

UPDATE

Can we do it in jail broken phones? Can we do it for an app for CYDIA Store?

Chemash answered 30/11, 2010 at 10:23 Comment(0)
O
29

You can get a list of running processes and from process ids may be you can figure out which ones are system processes and which one are 3rd party apps, but anyway I don't believe you can use it in application for appstore. (code taken from here)

- (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;
}:
Ovalle answered 30/11, 2010 at 10:32 Comment(5)
@Krishnan, this code works on non-jailbroken device, but Apple may forbid using this feature in application. If you target Cydia store you can do that ( I think (but not 100% sure) I've seen an application that works like a task manager - displaying all running application and allowing to terminate them)Ovalle
Thanks for that. If you get to know any other info regarding this, please share it.Chemash
You can definitely do something like this on the App Store. Here's the evidence: #8276078Dextrous
@DmitryIsakov have you found a way around this for iOS9+ ?Blastosphere
@ValerioSantinelli: This method works if you are outside of the sandbox. If you want the list, create an unsandboxed helper and then use IPC to fetch it from that helper.Orchidaceous
L
2

Why would you loop until you run put of memory? I think this is a lot simpler ;)

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);
Lheureux answered 7/9, 2012 at 11:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.