很多時候我們認(rèn)為 AppID、應(yīng)用ID、Bundle ID 是同一個東西, 是iOS應(yīng)用的唯一標(biāo)識(在創(chuàng)建提交的app時還有一個id ,那個是AppStore上的ID(也叫 trackId),和這里沒有關(guān)系)。
注:
AppID 和 Bundle ID 本質(zhì)上是不同的,只是我們大部分時候不去區(qū)分。參考文章,官方文檔說明:

一、獲取App的BundleID
自己的App很好獲取,本文略過。
方法一:
借助其他平臺獲取,已微信為例。使用電腦打開,獲取到id(這個是AppStore上的id)。

點(diǎn)擊這個連接,會跳轉(zhuǎn)到介紹界面,此時為https://apps.apple.com/cn/app/id414478124,這個連接最后id后面的部分也就是上述顯示的App ID(AppStore 中的ID)。
這時,地址欄輸入https://itunes.apple.com/lookup?id=XXXX,這里的XXXX替換為上面的ID,按回車后會自動下載一個文件,打開后搜索bundleId即可。

這個方法的好處是不用自己去找,搜索即可,對于海外的App只用不同地區(qū)搜索即可。
方法二:
借助AppStore獲取,搜索到App后點(diǎn)擊分享。

用紅框中任意方式保存連接,即可獲取AppStore 中的ID,再通過方法一中的網(wǎng)址替換id去查詢。
此方法更為精準(zhǔn),有些統(tǒng)計平臺中統(tǒng)計的信息不及時可以通過這樣的方式去獲取。但是這個方法有個缺點(diǎn)就是搜索的內(nèi)容和App賬號地區(qū)有關(guān)系,如果是中國區(qū)賬號就只能搜索到中國區(qū)發(fā)布的App。如果要搜索其他地區(qū)的App就需要用注冊地區(qū)是該地區(qū)的賬號登錄(也有切換賬號地區(qū)的方法,本文不做介紹)。
方法三:
以上方法只適用于發(fā)布到AppStore上的App。有些App并不發(fā)布,或者要看系統(tǒng)的App。這樣就需要使用一些工具了(比如這個)。

如何獲取別人的BundleID?
方法四:
在有iPA安裝文件的情況下,直接顯示包內(nèi)容,然后查找.plist文件,查詢即可。
二、使用BundleID
由于BundleID 具有唯一性,即可以根據(jù)此對特定的App進(jìn)行一些操作,比如獲取沙盒路徑等。
使用一:通過bundleID 查詢信息
https://itunes.apple.com/lookup?bundleId=XXXX,這里的XXXX替換為bundleId,按回車后會自動下載一個文件,內(nèi)容和上面通過id打開的內(nèi)容是一樣的
使用二:通過私有API獲取信息
1.比如查詢有沒有安裝該App(代碼未驗(yàn)證可用):
+(void)isInstallLDApp:(NSString *)APPId
{
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:@selector(defaultWorkspace)];
NSArray *allApplications = [workspace performSelector:@selector(allApplications)];
NSInteger count = 0;
for (NSString *appStr in allApplications) {
NSString *app = [NSString stringWithFormat:@"%@",appStr];//轉(zhuǎn)換成字符串
NSRange range = [app rangeOfString: APPId];//是否包含這個bundle ID
if (range.length > 1)
{
count ++;
}
}
if (count >= 1) {
NSLog(@"已安裝");
}else{
NSLog(@"沒有安裝");
}
}
NSLog(@"是否安裝%d",[IHUtility checkAPPIsExist:@" 這里填寫需要檢測的bundleID "]);
LSApplicationWorkspace這個類,在iOS 11以后,這個類失效了,所有只能在iOS 10及以下的真機(jī)使用。
2.獲取其他信息,比如沙盒路徑等(代碼未驗(yàn)證可用):
LSApplicationWorkspace 和 LSApplicationProxy 里的一系列方法可以獲取應(yīng)用的相關(guān)信息。
先遍歷所有所有應(yīng)用列表,然后從應(yīng)用列表里過濾目錄應(yīng)用,從中獲取包括沙盒路徑、可執(zhí)行文件名、bundleID、版本等等。
比如獲取微信的沙盒目錄(com.tencent.xin) 實(shí)例如下:
-(NSString*) getWeChatSandboxPath{
NSMutableArray *arrayAppInfo = [[NSMutableArray alloc] init];
//獲取應(yīng)用程序列表
Class cls = NSClassFromString(@"LSApplicationWorkspace");
id s = [(id)cls performSelector:NSSelectorFromString(@"defaultWorkspace")];
NSArray *array = [s performSelector:NSSelectorFromString(@"allApplications")];
Class LSApplicationProxy_class = NSClassFromString(@"LSApplicationProxy");
for (LSApplicationProxy_class in array){
NSString *strBundleID = [LSApplicationProxy_class performSelector:
@selector(bundleIdentifier)];
//獲取應(yīng)用的相關(guān)信息
NSString *strVersion = [LSApplicationProxy_class performSelector:@selector(bundleVersion)];
NSString *strShortVersion = [LSApplicationProxy_class performSelector:
@selector(shortVersionString)];
NSURL *strContainerURL = [LSApplicationProxy_class performSelector:@selector(containerURL)];
NSString *strContainerDataPath = [strContainerURL path];
NSURL *strResourcesDirectoryURL = [LSApplicationProxy_class performSelector:
@selector(resourcesDirectoryURL)];
NSString *strContainerBundlePath = [strResourcesDirectoryURL path];
NSString *strLocalizedName = [LSApplicationProxy_class performSelector:
@selector(localizedName)];
NSString *strBundleExecutable = [LSApplicationProxy_class performSelector:
@selector(bundleExecutable)];
//NSLog(@"bundleID:%@ localizedName: %@", strBundleID, strLocalizedName);
if ([strBundleID isEqualToString:@"com.tencent.xin"]) {
return strContainerDataPath;
}
}
return nil;
}
使用三:其他
如發(fā)現(xiàn)更多的使用方式會再補(bǔ)充