?遇到過這樣的需求:比如公司有償推廣某款APP丢胚,要客戶端判斷該用戶有沒有下載青瀑,下載了就直接打開堡纬,沒下載就跳到AppStore下載撰糠。
1.判斷用戶是否已下載
首先后臺會給一個app的bundleID瞬痘,根據(jù)bundleID來查看有沒有這個app故慈,方法如下:
開始接手項目的時候是采用蘋果私有的API獲取手機所有的app信息框全,找出bundleID 相同的一個。不過iOS10之后這個私有API就已經(jīng)給封了拆撼。
別灰心,蘋果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)
實現(xiàn)方法
//是否可以啟動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];
? ? }
}