2015-02-06 3 views
4

포 그라운드에있는 앱이 얼마나 오래 실행되고 있는지 알 수있는 방법이 있습니까?앱의 실행 시간 추적하기 iOS

I. 사용 배터리 소모와 배터리 소모 속도 (아이폰 OS 8 이상 당신에게 응용 프로그램의 배터리 사용을 말해하지만 타자의 소비가 처리하기 어려울 것)

II : 나는 마음에 세 가지 솔루션을 가지고 . 시스템 프로세스 모니터 사용

III. Apple의 진단 로그를 사용하십시오. 이 접근 방식은 꽤 "백도어"입니다. 게다가 Apple이 정보를 사용하도록 허용했는지 여부는 확실하지 않습니다.

누군가 위의 해결책 중 하나라도 사실인지 말해 줄 수 있습니까? 그렇지 않다면, iOS에서 실행중인 앱의 지속 시간을 아는 것이 가능하다는 것을 알고 싶습니다.

+0

자신의 앱이 아닌 다른 앱? 앱이 무엇인지 어떻게 알 수 있습니까? –

+1

예. 다른 앱입니다. batteryDoctor와 같은 앱이있어 여러 앱의 배터리 사용량을 알려주므로 가능한 것입니다. – angerhang

+1

다른 앱의 실행 시간을 추적하는 데 성공 했습니까? 업데이트 내용은 무엇입니까? – Imran

답변

4

다른 앱의 데이터에는 액세스 할 수 없습니다. 모든 응용 프로그램은 자체 샌드 박스에서 작동하므로 그렇게 할 수 없습니다. 당신은 그것이 소모하는 배터리, 애플 리케이션이 얼마나 오래 실행되고 있는지 알 수 없습니다. 그것은 그것이 사용하는 프레임 워크에 따라 다릅니다. 또한 고해상도 그래픽 등 게임 인 경우.

다음 중 귀하의 아이디어는 없습니다.

1

sysctl을 사용하면 실행중인 프로세스에 대한 많은 정보를 얻을 수 있습니다. 이 코드를 보면 실행중인 모든 프로세스와 각 프로세스의 시작 시간을 확인할 수 있습니다. 이 코드는 비공개 API가 아니므로 Apple Store에 게시하는 경우 Apple에서 승인해야합니다. sysctl.h의 'struct kinfo_proc'을 살펴보면 유용한 정보를 찾을 수 있습니다. 프로세스가 포 그라운드인지 백그라운드인지를 어떻게 감지 할 지 모르겠습니다. 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; 
}