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;
}
자신의 앱이 아닌 다른 앱? 앱이 무엇인지 어떻게 알 수 있습니까? –
예. 다른 앱입니다. batteryDoctor와 같은 앱이있어 여러 앱의 배터리 사용량을 알려주므로 가능한 것입니다. – angerhang
다른 앱의 실행 시간을 추적하는 데 성공 했습니까? 업데이트 내용은 무엇입니까? – Imran