之前网上的一些解决方案是通过MobileContainerManager.framework来进行判断的。
if([[UIDevice currentDevice].systemVersionfloatValue] >=11.0) {
NSBundle*container = [NSBundlebundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if([container load]) {
Class appContainer = NSClassFromString(@"MCMAppContainer");
id manager = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:bundleId withObject:nil];
if(manager) returnYES;
returnNO;
}
returnNO;
}else{//非iOS11通过获取安装列表判断即可}
这个方法是在我们没有重appStore下载的时候是可行的,比如自己ipa拉到一些助手工具(同步助手)进行安装时,这个方法是可以判断,但是当应用是重appStore下载的时候是不可行的,当我们在appStore点击获取应用,进度条刚要走的时候获取到的manager就不为空了,也就是app还没安装完成就提示安装完成了,这就不准确了,在通过用ida对MobileContainerManager.framework进行解析之后发现了MCMContainer 有个方法获取uuid,
在点击安装和安装完成后发生了变化,也就是我们可以通过这个变量来记录app是否安装完成,下面是重新判断的代码:
if([[UIDevice currentDevice].systemVersionfloatValue] >=11.0) {
NSBundle*container = [NSBundlebundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if([container load]) {
Class appContainer = NSClassFromString(@"MCMAppContainer");
id manager = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:bundleId withObject:nil];
id uuid = [manager performSelector:@selector(uuid)];
if(manager) return uuid;
return nil;
}
return nil;
}else{//非iOS11通过获取安装列表判断即可}
总结:
通过这种方法判断的方式不是很直接的方法,需要获取uuid的两个状态下的值来进行对比,但是在暂时没有找到更好的方法的时候可以用下,毕竟现在苹果iOS系统越来越让人蛋疼了。