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

?遇到過這樣的需求:比如公司有償推廣某款A(yù)PP,要客戶端判斷該用戶有沒有下載,下載了就直接打開,沒下載就跳到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;

}

不過,調(diào)用私有API對于要上線的APP還是有審核被拒的風(fēng)險的,有其他方法的可以分享下


2.判斷后,如果存在要打開APP,當(dāng)然還是少補了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];

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容