2011-11-26 50 views
39

在App Store中有一個名爲「Activity Monitor Touch」的應用程序,它顯示後臺進程以及可用內存。如何在App Store批准的應用程序中獲取有關可用內存和正在運行的進程的信息? (是的,有一個!)

所以必須有一個公共API來訪問這些信息。證據:

evidence

evidence

我已經尋找天,但找不到任何很好的起點。這個應用程序如何在沒有任何越獄/黑客攻擊等的情況下將所有這些東西弄出來?

直到最近,我確信像iOS這樣的東西是絕對不可能的。

我已經found此代碼段:

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

但我不能讓它在iPhone上運行。 Xcode不知道這些符號: CTL_KERN,KERN_PROC,KERN_PROC_ALL

所以我當然必須導入一個頭文件或庫。有沒有人知道這些屬於哪裏,以及如何導入頭文件以實現此功能?

+0

[此處鏈接可能相關的問題](http://stackoverflow.com/questions/3823266/is-it-legal-to-use-the-well-known-free-memory-code- in-ipad-iphone-app) –

+0

但是蘋果正式允許使用它嗎?!也許Store中的應用程序只有運氣才能進入?! – davidOhara

+0

此應用程序不再可用。但是,使用sysctl不會禁止應用程序。看到一堆做類似的東西的應用程序。在iOS商店中搜索活動監視器。 –

回答

35

就像一個魅力:

#import <sys/sysctl.h> 
+0

iOS 9的任何替代品? – CamHart

31

sysctl不再是沙盒的iOS 9應用程序訪問。

從WWDC 2015會話703的隱私和應用程序:

在iOS系統9中,沙箱現在防止進程訪問其他 的 kern.proc,kern.procargs和kern.procargs2值處理

iOS應用程序不允許看其他應用程序正在運行的

所以,即使您找到方法,您很可能會被App Store拒絕。

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

+0

謝謝Ad Networks。這就是爲什麼我們不能有好的東西。是的,中國,我正在看你的大方向。 – picciano

相關問題