iOS學(xué)習(xí)(二十八)AppID/應(yīng)用ID/Bundle ID 獲取、查詢和使用

很多時候我們認(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ū)分。參考文章,官方文檔說明:

AppID.png

一、獲取App的BundleID

自己的App很好獲取,本文略過。

方法一:

借助其他平臺獲取,已微信為例。使用電腦打開,獲取到id(這個是AppStore上的id)。

AppStore上的id.png

點(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即可。

搜索bundleId.png

這個方法的好處是不用自己去找,搜索即可,對于海外的App只用不同地區(qū)搜索即可。

方法二:

借助AppStore獲取,搜索到App后點(diǎn)擊分享。

獲取查詢Id.png

用紅框中任意方式保存連接,即可獲取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。這樣就需要使用一些工具了(比如這個)。

yacd.png

如何獲取別人的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;
}

私有API參考文章

使用三:其他

如發(fā)現(xiàn)更多的使用方式會再補(bǔ)充

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

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

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