IOS高级开发~开机启动&无限后台运行&监听进程

非越狱情况下实现:

开机启动:App安装到IOS设备设备之后,无论App是否开启过,只要IOS设备重启,App就会随之启动;

无限后台运行:应用进入后台状态,可以无限后台运行,不被系统kill;

监听进程:可获IOS设备运行除系统外的App(包括正在运行和后台运行);


配置项目 plist文件

添加:

<key>UIBackgroundModes</key>

<array>

<string>voip</string>

</array>


功能类:ProccessHelper

#import <Foundation/Foundation.h>  
  
@interface ProccessHelper : NSObject  
  
+ (NSArray *)runningProcesses;  
  
@end  

[cpp] view plaincopyprint?
#import "ProccessHelper.h"  
//#include<objc/runtime.h>  
#include <sys/sysctl.h>  
  
#include <stdbool.h>  
#include <sys/types.h>  
#include <unistd.h>  
#include <sys/sysctl.h>  
  
@implementation ProccessHelper  
  
//You can determine if your app is being run under the debugger with the following code from  
static bool AmIBeingDebugged(void)  
// Returns true if the current process is being debugged (either  
// running under the debugger or has a debugger attached post facto).  
{  
    int                 junk;  
    int                 mib[4];  
    struct kinfo_proc   info;  
    size_t              size;  
      
    // Initialize the flags so that, if sysctl fails for some bizarre  
    // reason, we get a predictable result.  
      
    info.kp_proc.p_flag = 0;  
      
    // Initialize mib, which tells sysctl the info we want, in this case  
    // we're looking for information about a specific process ID.  
      
    mib[0] = CTL_KERN;  
    mib[1] = KERN_PROC;  
    mib[2] = KERN_PROC_PID;  
    mib[3] = getpid();  
      
    // Call sysctl.  
      
    size = sizeof(info);  
    junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);  
    assert(junk == 0);  
      
    // We're being debugged if the P_TRACED flag is set.  
      
    return ( (info.kp_proc.p_flag & P_TRACED) != 0 );  
}  
  
//返回所有正在运行的进程的 id,name,占用cpu,运行时间  
//使用函数int   sysctl(int *, u_int, void *, size_t *, void *, size_t)  
+ (NSArray *)runningProcesses  
{  
    //指定名字参数,按照顺序第一个元素指定本请求定向到内核的哪个子系统,第二个及其后元素依次细化指定该系统的某个部分。  
    //CTL_KERN,KERN_PROC,KERN_PROC_ALL 正在运行的所有进程  
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL ,0};  
      
      
    size_t miblen = 4;  
    //值-结果参数:函数被调用时,size指向的值指定该缓冲区的大小;函数返回时,该值给出内核存放在该缓冲区中的数据量  
    //如果这个缓冲不够大,函数就返回ENOMEM错误  
    size_t size;  
    //返回0,成功;返回-1,失败  
    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);  
                process = NULL;  
            }  
            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--)  
                {  
                    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
                    NSString * processID = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_pid];  
                    NSString * processName = [[NSString alloc] initWithFormat:@"%s", process[i].kp_proc.p_comm];  
                    NSString * proc_CPU = [[NSString alloc] initWithFormat:@"%d", process[i].kp_proc.p_estcpu];  
                    double t = [[NSDate date] timeIntervalSince1970] - process[i].kp_proc.p_un.__p_starttime.tv_sec;  
                    NSString * proc_useTiem = [[NSString alloc] initWithFormat:@"%f",t];  
                    NSString *startTime = [[NSString alloc] initWithFormat:@"%ld", process[i].kp_proc.p_un.__p_starttime.tv_sec];  
                    NSString * status = [[NSString alloc] initWithFormat:@"%d",process[i].kp_proc.p_flag];  
                      
                    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];  
                    [dic setValue:processID forKey:@"ProcessID"];  
                    [dic setValue:processName forKey:@"ProcessName"];  
                    [dic setValue:proc_CPU forKey:@"ProcessCPU"];  
                    [dic setValue:proc_useTiem forKey:@"ProcessUseTime"];  
                    [dic setValue:proc_useTiem forKey:@"ProcessUseTime"];  
                    [dic setValue:startTime forKey:@"startTime"];  
                      
                    // 18432 is the currently running application  
                    // 16384 is background  
                    [dic setValue:status forKey:@"status"];  
                      
                    [processID release];  
                    [processName release];  
                    [proc_CPU release];  
                    [proc_useTiem release];  
                    [array addObject:dic];  
                    [startTime release];  
                    [status release];  
                    [dic release];  
                      
                    [pool release];  
                }  
                  
                free(process);  
                process = NULL;  
                //NSLog(@"array = %@",array);  
                  
                return array;  
            }  
        }  
    }  
      
    return nil;  
}  
  
@end  

实现代码:

systemprocessArray = [[NSMutableArray arrayWithObjects:  
                                @"kernel_task",  
                                @"launchd",  
                                @"UserEventAgent",  
                                @"wifid",  
                                @"syslogd",  
                                @"powerd",  
                                @"lockdownd",  
                                @"mediaserverd",  
                                @"mediaremoted",  
                                @"mDNSResponder",  
                                @"locationd",  
                                @"imagent",  
                                @"iapd",  
                                @"fseventsd",  
                                @"fairplayd.N81",  
                                @"configd",  
                                @"apsd",  
                                @"aggregated",  
                                @"SpringBoard",  
                                @"CommCenterClassi",  
                                @"BTServer",  
                                @"notifyd",  
                                @"MobilePhone",  
                                @"ptpd",  
                                @"afcd",  
                                @"notification_pro",  
                                @"notification_pro",  
                                @"syslog_relay",  
                                @"notification_pro",  
                                @"springboardservi",  
                                @"atc",  
                                @"sandboxd",  
                                @"networkd",  
                                @"lsd",  
                                @"securityd",  
                                @"lockbot",  
                                @"installd",  
                                @"debugserver",  
                                @"amfid",  
                                @"AppleIDAuthAgent",  
                                @"BootLaunch",  
                                @"MobileMail",  
                                @"BlueTool",  
                                nil] retain];  

- (void)applicationDidEnterBackground:(UIApplication *)application  
{  
    while (1) {  
        sleep(5);  
        [self postMsg];  
    }  
      
[cpp] view plaincopyprint?
    [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{  
        NSLog(@"KeepAlive");  
    }];  
}  
  
- (void)applicationWillResignActive:(UIApplication *)application  
{  
}  
- (void)applicationWillEnterForeground:(UIApplication *)application  
{  
}  
- (void)applicationDidBecomeActive:(UIApplication *)application  
{  
}  
- (void)applicationWillTerminate:(UIApplication *)application  
{  
}  
  
#pragma mark -  
#pragma mark - User Method  
  
- (void) postMsg  
{  
    //上传到服务器  
    NSURL *url = [self getURL];  
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];  
    NSError *error = nil;  
    NSData *received = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];  
      
    if (error) {  
        NSLog(@"error:%@", [error localizedDescription]);  
    }  
      
    NSString *str = [[NSString alloc]initWithData:received encoding:NSUTF8StringEncoding];  
    NSLog(@"%@",str);  
}  
  
- (NSURL *) getURL  
{  
    UIDevice *device = [UIDevice currentDevice];  
      
    NSString* uuid = @"TESTUUID";  
    NSString* manufacturer = @"apple";  
    NSString* model = [device model];  
    NSString* mobile = [device systemVersion];  
      
    NSString *msg = [NSString stringWithFormat:@"Msg:%@  Time:%@", [self processMsg], [self getTime]];  
    CFShow(msg);  
      
    /  省略部分代码  /  
      
    NSString *urlStr = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
    NSURL *url = [NSURL URLWithString:urlStr];  
      
    return url;  
}  
  
- (BOOL) checkSystemProccess:(NSString *) proName  
{  
    if ([systemprocessArray containsObject:proName]) {  
        return YES;  
    }  
    return NO;  
}  
  
- (BOOL) checkFirst:(NSString *) string  
{  
    NSString *str = [string substringToIndex:1];  
    NSRange r = [@"ABCDEFGHIJKLMNOPQRSTUVWXWZ" rangeOfString:str];  
      
    if (r.length > 0) {  
        return YES;  
    }  
    return NO;  
}  
  
- (NSString *) processMsg  
{  
    NSArray *proMsg = [ProccessHelper runningProcesses];  
  
    if (proMsg == nil) {  
        return nil;  
    }  
      
    NSMutableArray *proState = [NSMutableArray array];  
    for (NSDictionary *dic in proMsg) {  
          
        NSString *proName = [dic objectForKey:@"ProcessName"];  
        if (![self checkSystemProccess:proName] && [self checkFirst:proName]) {  
            NSString *proID = [dic objectForKey:@"ProcessID"];  
            NSString *proStartTime = [dic objectForKey:@"startTime"];  
              
            if ([[dic objectForKey:@"status"] isEqualToString:@"18432"]) {  
                NSString *msg = [NSString stringWithFormat:@"ProcessName:%@ - ProcessID:%@ - StartTime:%@ Running:YES", proName, proID, proStartTime];  
                [proState addObject:msg];  
            } else {  
                NSString *msg = [NSString stringWithFormat:@"ProcessName:%@ - ProcessID:%@ - StartTime:%@ Running:NO", proName, proID, proStartTime];  
                [proState addObject:msg];  
            }  
        }  
    }  
      
    NSString *msg = [proState componentsJoinedByString:@"______"];  
    return msg;  
}  
  
// 获取时间  
- (NSString *) getTime  
{  
    NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];  
    formatter.dateStyle = NSDateFormatterMediumStyle;  
    formatter.timeStyle = NSDateFormatterMediumStyle;  
    formatter.locale = [NSLocale currentLocale];  
      
    NSDate *date = [NSDate date];  
      
    [formatter setTimeStyle:NSDateFormatterMediumStyle];  
    NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];  
    NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];  
    NSInteger unitFlags = NSYearCalendarUnit |  
    NSMonthCalendarUnit |  
    NSDayCalendarUnit |  
    NSWeekdayCalendarUnit |  
    NSHourCalendarUnit |  
    NSMinuteCalendarUnit |  
    NSSecondCalendarUnit;  
    comps = [calendar components:unitFlags fromDate:date];  
    int year = [comps year];  
    int month = [comps month];  
    int day = [comps day];  
    int hour = [comps hour];  
    int min = [comps minute];  
    int sec = [comps second];  
      
    NSString *time = [NSString stringWithFormat:@"%d-%d-%d %d:%d:%d", year, month, day, hour, min, sec];  
     
    return time;  
}  
  
@end  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值