iOS 11适配:LSApplicationWorkspace无法获取应用安装列表解决方案

之前网上的一些解决方案是通过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,

iOS 11适配:LSApplicationWorkspace无法获取应用安装列表解决方案_第1张图片
image

在点击安装和安装完成后发生了变化,也就是我们可以通过这个变量来记录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系统越来越让人蛋疼了。

你可能感兴趣的:(iOS 11适配:LSApplicationWorkspace无法获取应用安装列表解决方案)