关于ios:iOS-逆向-私有方法LSApplicationWorkspace

8次阅读

共计 3652 个字符,预计需要花费 10 分钟才能阅读完成。

获取 LSApplicationWorkspace 头文件:
https://github.com/JaviSoto/i…
获取手机中所有装置的 app 办法

-(void)getAppPlist
{

Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];

NSArray*apps = [workspace performSelector:@selector(allApplications)];

// NSArray*appsActivity = [workspace performSelector:@selector(applicationForUserActivityDomainName)];


NSMutableArray*appsIconArr = [NSMutableArray array];

NSMutableArray*appsNameArr = [NSMutableArray array];



NSLog(@"apps: %@",apps);

[apps enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL* stop) {NSDictionary*boundIconsDictionary = [obj performSelector:@selector(boundIconsDictionary)];
    
    NSString*iconPath = [NSString stringWithFormat:@"%@/%@.png", [[obj performSelector:@selector(resourcesDirectoryURL)]path], [[[boundIconsDictionary objectForKey:@"CFBundlePrimaryIcon"]objectForKey:@"CFBundleIconFiles"]lastObject]];
    
    UIImage*image = [[UIImage alloc]initWithContentsOfFile:iconPath];
    
    id name = [obj performSelector:@selector(localizedName)];
    
    if(image)
        
    {[appsIconArr addObject:image];
        
        [appsNameArr addObject: name];
    }
    

// NSLog(@”iconPath = %@”, iconPath);

    
    NSLog(@"name = %@", name);
    

// 输入 app 的属性

    NSLog(@"%@",[self properties_aps:obj]);
    
    NSLog(@"_____________________________________________\n");
    NSDictionary * appPropertices = [self properties_aps:obj];
    
}];


// 通过 applicationIdentifier id。判断是否装置某个 APP
BOOL isInstall = [workspace performSelector:@selector(applicationIsInstalled:) withObject:@"com.tencent.xin"];


if (isInstall) {
    // 通过 bundle id。关上一个 APP
    [workspace performSelector:@selector(openApplicationWithBundleID:) withObject:@"com.tencent.xin"];
}else{NSLog(@"您还没装置");
}

}

// 获取 app 的属性。

  • (NSDictionary *)properties_aps:(id)objc

{


NSMutableDictionary *props = [NSMutableDictionary dictionary];

unsigned int outCount, i;

objc_property_t *properties = class_copyPropertyList(, &outCount);

for (i = 0; i<outCount; i++)
    
{objc_property_t property = properties[i];
    
    const char* char_f =property_getName(property);
    
    NSString *propertyName = [NSString stringWithUTF8String:char_f];
    
    id propertyValue = ;
    
    if (propertyValue) [props setObject:propertyValue forKey:propertyName];
    
}

free(properties);

return props;

}
通过定时器一直的调度 能够用上面的办法失去 所有正在下载的 app

-(void)updateInstallList{

void *lib = dlopen("/System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices", RTLD_LAZY);

if (lib)
{Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");
    id AAURLConfiguration1 = [LSApplicationWorkspace defaultWorkspace];
    
    if (AAURLConfiguration1)
    {id arrApp = [AAURLConfiguration1 allApplications];
        
        for (int i=0; i<[arrApp count]; i++) {LSApplicationProxy *LSApplicationProxy = [arrApp objectAtIndex:i];
            NSString* bundleId =[LSApplicationProxy applicationIdentifier];
            NSString* name = [LSApplicationProxy localizedName];
            
            NSProgress *progress = (NSProgress *)[LSApplicationProxy installProgress];
            InstallingModel *model = [self getInstallModel:bundleId];

            // 如果是正在下载状态
            if (progress)
            {
                
                // 曾经检测到的
                if (model) {model.progress = [progress localizedDescription];
                    model.status  =  [NSString stringWithFormat:@"%@",[[progress userInfo] valueForKey:@"installState"]];
                    // 第一次检测到的
                }else{InstallingModel *model = [[InstallingModel alloc] init];
                    model.appName = name;
                    model.bundleID = bundleId;
                    model.progress = [progress localizedDescription];
                    model.status  = [NSString stringWithFormat:@"%@",[[progress userInfo] valueForKey:@"installState"]];
                    
                    [_installedAry addObject:model];
                }
                
            }
        }
    }
    
    if (lib) dlclose(lib);
}

}
通过 bundle id。判断是否装置和关上 app

// 通过 applicationIdentifier id。判断是否装置某个 APP

    BOOL isInstall = [workspace performSelector:@selector(applicationIsInstalled:) withObject:@"com.tencent.xin"];


    if (isInstall) {
        // 通过 bundle id。关上一个 APP
        [workspace performSelector:@selector(openApplicationWithBundleID:) withObject:@"com.tencent.xin"];
    }else{NSLog(@"您还没装置");
    }

=

正文完
 0