2015-02-06 4 views
4

Есть ли способ узнать, как долго работают приложения на переднем плане? У меня есть три возможных решения в виду:Отслеживание времени работы приложения iOS

I. Расход использование батареи и уровень потребления батареи (IOS 8, а затем сказать вам использование батареи приложения, но потребление Тесто будет трудно справиться)

II , мониторинг системных процессов

III. используйте журналы диагностики Apple. Такой подход довольно «бэкдор». Плюс я не уверен, что Apple позволяет нам использовать эту информацию или нет.

Может ли кто-нибудь сказать мне, если какое-либо из вышеуказанных решений реалистично? Если нет, я хочу знать, можно ли вообще выяснить продолжительность запуска приложения на iOS?

+0

Не ваше собственное приложение, а другие приложения? Как вы узнаете, что это за приложения? –

+1

Да другие приложения. Есть приложения, такие как batteryDoctor, которые говорят вам о потреблении батареи в разных приложениях, поэтому это возможно. – angerhang

+1

Удалось ли отслеживать время работы других приложений? Какое у вас обновление? – Imran

ответ

4

Вы не можете получить доступ к каким-либо данным из других приложений. Поскольку каждое приложение работает в собственной песочнице, и поэтому у вас нет возможности сделать это. Вы не можете знать, из-за потребляемой ею батареи, сколько времени работает приложение. Это зависит от того, какие рамки он использует и т. Д. Также, если это игра с графикой высокого разрешения и т. Д.

Итак: Ни одна из ваших идей не возможна.

1

С помощью sysctl вы можете получить много информации о запущенных процессах. См. В этом коде, вы можете найти все запущенные процессы, а также время начала каждого процесса. Этот код не является частным API, поэтому его следует принять Apple в случае его публикации в Apple Store. Взгляните в «struct kinfo_proc» в sysctl.h, вы найдете полезную информацию. Я не знаю, как определить, находится ли процесс на переднем плане или на заднем плане. Я могу найти только start_time, а затем вычислить время выполнения. Однако, когда вы запускаете это приложение на переднем плане, другие процессы, вероятно, находятся в фоновом режиме, не так ли?

#import <sys/sysctl.h> 

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

        struct timeval t = process[i].kp_proc.p_un.__p_starttime; 
        long ms = t.tv_sec; 
        NSDate *startDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:ms]; 

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

       free(process); 
       return array; 
      } 
     } 
    } 

    return nil; 
} 
Смежные вопросы