2011-11-26 6 views
39

C'è un'app chiamata "Activity Monitor Touch" nell'App Store, che mostra i processi in background e la memoria libera.Come ottenere informazioni sulla memoria libera e sui processi in esecuzione in un'app approvata dall'App Store? (Sì, ce n'è uno!)

Quindi ci deve essere una API pubblica per accedere a queste informazioni. La prova:

evidence

evidence

sto già alla ricerca di giorni, ma non riesce a trovare alcun buon punto di partenza. In che modo questa app può capire tutto questo senza alcun jailbreak/hacking/ecc.?

Fino a poco tempo fa ero sicuro che qualcosa di simile fosse assolutamente impossibile su iOS.

ho found questo frammento di codice:

- (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; 
} 

Ma non riesco a farlo funzionare su iPhone. Xcode non conosce questi simboli: CTL_KERN, KERN_PROC, KERN_PROC_ALL

Quindi, ovviamente, devo importare un file di intestazione o una libreria. Qualcuno sa dove queste cose appartengono e come devono essere importate le intestazioni per fare in modo che funzioni?

+0

[domanda potenzialmente correlate legata qui] (http://stackoverflow.com/questions/3823266/is-it-legal-to-use-the-well-known-free-memory-code- in-ipad-iphone-app) –

+0

Ma è ufficialmente permesso da Apple di usarlo ?! Forse le App in Store hanno avuto solo fortuna di entrare ?! – davidOhara

+0

Questa app non è più disponibile. Ma l'utilizzo di sysctl non è vietato dalle app. Guarda un sacco di app che fanno cose simili. Cerca il monitoraggio dell'attività sul negozio iOS. –

risposta

35

funziona come un fascino:

#import <sys/sysctl.h> 
+0

Qualche alternativa per iOS 9? – CamHart

31

sysctl non è più accessibile a iOS in modalità sandbox 9 apps.

Da WWDC 2015 sessione 703 Privacy e App:

In iOS 9, la sandbox ora impedisce un processo di accedere ai kern.proc, kern.procargs e valori kern.procargs2 per altri processi

e

applicazioni iOS non sono autorizzati a vedere quello che altre applicazioni sono in esecuzione

Quindi, anche se trovi un modo, è probabile che tu venga rifiutato dall'App Store.

https://developer.apple.com/videos/play/wwdc2015-703/

+0

Grazie reti pubblicitarie. Questo è il motivo per cui non possiamo avere cose belle. Sì, Cina, sto guardando nella tua direzione generale. – picciano

Problemi correlati