iOS 9 以上的系统判断设备上是否有安装某app的两个方法:(主要是通过canOpenURL来打判断app是否存在)
方法一:
1、首先要知道你要判断的这款app的UrlSchemes 是什么? 如图:
2、在自己的项目中添加白名单
3、 在代码中调用Application 的canopenUrl 的方法判断设备时候有对应的应用 程序,返回YES表示已安装了该app
代码如下:
// 判断有没有安装该app
-(BOOL)checkAPPIsExist:(NSString*)URLScheme{
NSURL* url;
if ([URLScheme containsString:@"://"]) {
url = [NSURL URLWithString:[NSString stringWithFormat:@"%@",URLScheme]];
} else {
url = [NSURL URLWithString:[NSString stringWithFormat:@"%@://",URLScheme]];
}
if ([[UIApplication sharedApplication] canOpenURL:url]){
return YES;
} else {
return NO;
}
}
这个方法首先要知道 app 的UrlSchemes.
方法二
1、 获取iOS设备上所有已经安装的app
-(void)getAllApp
{
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
NSArray *allApplications = [workspace performSelector:@selector(allApplications)];//这样就能获取到手机中安装的所有App
NSLog(@"设备上安装的所有app:%@",allApplications);
}
2、判断iOS设备上是否有安装某个app,判断依据是根据app 的Bundle Id。我们上一步所获取到的allApplications数组中的元素是一个LSApplicationProxy类型的,我们要把这个转换成字符串, 这个字符串中不只包含了App的bundle ID,还包含了安装的路径,因为这个路径不唯一不确定,我们判断是否安装了某个App只需判断这个字符串中的bundle ID,所有我们还要对字符串做处理。前提是要知道你要判断的这个app的Bundle ID 是什么
-(void)isInstallLDApp:(NSArray *)allAPP
{
NSInteger count = 0;
for (NSString *appStr in allAPP) {
NSString *app = [NSString stringWithFormat:@"%@",appStr];//转换成字符串
NSRange range = [app rangeOfString:@"LdWBrowserIPhone"];//是否包含这个bundle ID
if (range.length > 1)
{
count ++;
}
}
if (count >= 1) {
NSLog(@"已安装");
}else{
NSLog(@"没有安装");
}
}
这个方法完美解决添加白名单的限制 ,但是遍历的过程中可能会消耗性能, App Store审核可能会被拒,前提是要知道你要判断的这个app的Bundle ID 是什么
参考