遇到过这样的需求:比如公司有偿推广某款APP,要客户端判断该用户有没有下载,下载了就直接打开,没下载就跳到AppStore下载。
1.判断用户是否已下载
首先后台会给一个app的bundleID,根据bundleID来查看有没有这个app,方法如下:
开始接手项目的时候是采用苹果私有的API获取手机所有的app信息,找出bundleID 相同的一个。不过iOS10之后这个私有API就已经给封了。
别灰心,苹果MobileContainerManager私有API,可以直接判断这个bundleID是否存在,代码如下:
//检查App是否已安装
+ (BOOL)checkAppIsInstalled:(NSString*)bundleIdentifier{
BOOLisCanOpen =NO;
NSBundle *container = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if([containerload]) {
ClassappContainer =NSClassFromString(@"MCMAppContainer");
idtest = [appContainerperformSelector:@selector(containerWithIdentifier:error:)withObject:bundleIdentifierwithObject:nil];
if(test) {
isCanOpen =YES;
}
}
return isCanOpen;
}
不过,调用私有API对于要上线的APP还是有审核被拒的风险的,有其他方法的可以分享下
2.判断后,如果存在要打开APP,当然还是少补了bundleID
首先宏定义
#define SuppressPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)
实现方法
//是否可以启动App
- (void)openAppWithBundleID:(NSString *)bundleID {
Class lsawsc = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [lsawsc performSelector:NSSelectorFromString(@"defaultWorkspace")];
// iOS6 没有defaultWorkspace
if([workspace respondsToSelector:NSSelectorFromString(@"openApplicationWithBundleID:")]) { [workspace performSelector:NSSelectorFromString(@"openApplicationWithBundleID:") withObject:bundleID];
}
}