iOS 判斷App是否已下載并打開

?遇到過這樣的需求:比如公司有償推廣某款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];

? ? }

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容