【iOS】私有API的使用

API 的分類

iOS 中的 API 大致分為三種:Published API(公開的 API)熊户、UnPublished API(未公開的 API)和 Private API(私有 API)嚷堡。 我們?nèi)粘J褂玫?API 都是公開的 API艇棕,存放在 Frameworks 框架中串塑。而未公開的 API 是指雖然也存放在 Frameworks 框架中北苟,但是卻沒有在蘋果的官方文檔中有使用說明、代碼介紹等記錄的 API友鼻。 私有 API 則是指存放在 PrivateFrameworks 框架中的 API彩扔。通常,這兩者都被稱作私有 API借杰,不過在使用方法上還是有一定區(qū)別的进泼。蘋果明確規(guī)定上架 Appstore 的應(yīng)用不能使用私有 API,不過自己私下玩一玩還是挺有意思的绞惦。私有 api 的頭文件在 Xcode 中是無法查看的洋措,需要使用class-dump導(dǎo)出,不過早有大神導(dǎo)出了完整的頭文件供我們使用王滤,大家可以前往 Github 查看滓鸠。

UnPublished API(未公開 API)

未公開的 API 雖然也存放在 Frameworks 框架中,但是卻沒有在蘋果的官方文檔中有使用說明糜俗、代碼介紹等記錄。按蘋果的說法珠月,未公開的 API 還不夠成熟楔敌,可能還會變動,等完全成型了之后就會變成公開的 API庆聘,但是目前不對其提供承諾,系統(tǒng)版本升級后可能會失效掏觉。下面用一個例子來說明未公開 API 的使用方法。在 MobileCoreServices.framework框架中有一個叫做LSApplicationWorkspace 的類织盼,利用該類可以獲取到手機上應(yīng)用的各種信息酱塔,包括已安裝列表,正在安裝列表等等唐全,如圖:

屏幕快照 2017-08-04 下午5.32.51.png

接下來我們就嘗試利用代碼調(diào)用該 API蕊玷,示例程序如下:

Class LSApplicationWorkspace_Class = NSClassFromString(@"LSApplicationWorkspace");
NSObject *workspace = [LSApplicationWorkspace_Class performSelector:NSSelectorFromString(@"defaultWorkspace")];
NSArray *appList = [workspace performSelector:NSSelectorFromString(@"allApplications")];
for (id app in appList) {
   NSLog(@"%@", [app performSelector:NSSelectorFromString(@"applicationIdentifier")]);
}

我們獲取到的數(shù)組中存放的實際上是LSApplicationProxy類型的對象垃帅,該對象有一個名為 applicationIdentifier 的屬性,如圖所示:

屏幕快照 2017-08-04 下午5.36.51.png

調(diào)用此屬性方庭,即可得到應(yīng)用的包名信息酱固,如下圖所示:

屏幕快照 2017-08-04 下午5.38.52.png

可以看到,未公開 API 的調(diào)用實際上只需要將類名龄减、方法名等從字符串進行轉(zhuǎn)化扇苞,隨后利用 performSelector 方法進行調(diào)用即可欺殿,相當簡單。

Private API(私有 API)

私有 API 是指存放在 PrivateFrameworks 框架中的 API鳖敷。私有 API 的調(diào)用與未公開 API 唯一的差別在于調(diào)用私有 API 之前需要先加載私有 API 所在的庫到內(nèi)存當中脖苏。下面我們用MobileContainerManager.framework中的一個類MCMAppContainer來做介紹,利用該API可以根據(jù)包名來判斷某APP是否存在定踱,不過無法確定應(yīng)用的狀態(tài)為安裝中或已安裝棍潘,調(diào)用方法如下:

NSBundle *container = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if ([container load]) {
    Class appContainer = NSClassFromString(@"MCMAppContainer");
    id test = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:@"com.tencent.xin" withObject:nil];
    if (test) {
        NSLog(@"存在該應(yīng)用");
    }
}

當然,還有另外一種加載方法,如下:

#import <dlfcn.h>

void *lib = dlopen("/System/Library/PrivateFrameworks/MobileContainerManager.framework", RTLD_LAZY);
if (lib) {
    Class appContainer = NSClassFromString(@"MCMAppContainer");
    id test = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:@"com.tencent.xin" withObject:nil];
    if (test) {
       NSLog(@"存在該應(yīng)用");
    }
    dlclose(lib);
}

繞過審核

雖然公開 API 中已經(jīng)提供了大量封裝好的方法亦歉,但是架不住產(chǎn)品經(jīng)理的各種奇葩需求恤浪。工作過程中很有可能會遇到公開 API 解決不了問題的時候。這個時候我們就不得不求助于私有 API 了肴楷。可是一旦使用私有 API赛蔫,上架 Appstore 又成為了一個難題砂客。這里提供一種繞過審核的方法,不過不太提倡使用呵恢,被逼無奈的情況下可以嘗試一下鞠值。當然,這種方法也還是會有審核時被查出的風險渗钉。

蘋果審核時可能會通過檢索關(guān)鍵詞來檢查私有 API 的使用情況彤恶,因此我們可以嘗試先將類名、方法名鳄橘、路徑名等進行加密處理声离,當調(diào)用私有 API 時,將加密后的字符串傳入解密方法中進行解密處理挥唠。如下所示:

//base64編碼
- (NSString *)encodeString:(NSString *)string
{
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
    NSString *encodedStr = [data base64EncodedStringWithOptions:0];
    return encodedStr;
}
//base64解碼
- (NSString *)decodeString:(NSString *)string
{
    NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
    NSString *decodedStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return decodedStr;
}
//調(diào)用私有api
- (void)testPrivateApi
{
    NSString *path = [self decodeString:@"L1N5c3RlbS9MaWJyYXJ5L1ByaXZhdGVGcmFtZXdvcmtzL01vYmlsZUNvbnRhaW5lck1hbmFnZXIuZnJhbWV3b3Jr"];
    NSBundle *container = [NSBundle bundleWithPath:path];
    if ([container load]) {
        Class appContainer = NSClassFromString([self decodeString:@"TUNNQXBwQ29udGFpbmVy"]);
        NSString *sel = [self decodeString:@"Y29udGFpbmVyV2l0aElkZW50aWZpZXI6ZXJyb3I6"];
        id test = [appContainer performSelector:NSSelectorFromString(sel) withObject:@"com.tencent.xin" withObject:nil];
        if (test) {
            NSLog(@"存在該應(yīng)用");
        }
    } 
}

由于代碼中沒有出現(xiàn)類名抵恋、方法名焕议、路徑名等關(guān)鍵詞宝磨,可以極大降低審核時被發(fā)現(xiàn)的可能性。當然盅安,此方法僅供參考唤锉,不建議使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末别瞭,一起剝皮案震驚了整個濱河市窿祥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝙寨,老刑警劉巖晒衩,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異墙歪,居然都是意外死亡听系,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門虹菲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來靠胜,“玉大人,你說我怎么就攤上這事±四” “怎么了陕习?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長址愿。 經(jīng)常有香客問我该镣,道長,這世上最難降的妖魔是什么响谓? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任拌牲,我火速辦了婚禮,結(jié)果婚禮上歌粥,老公的妹妹穿的比我還像新娘塌忽。我一直安慰自己,他們只是感情好失驶,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布土居。 她就那樣靜靜地躺著,像睡著了一般嬉探。 火紅的嫁衣襯著肌膚如雪擦耀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天涩堤,我揣著相機與錄音眷蜓,去河邊找鬼。 笑死胎围,一個胖子當著我的面吹牛吁系,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播白魂,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汽纤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了福荸?” 一聲冷哼從身側(cè)響起蕴坪,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敬锐,沒想到半個月后背传,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡台夺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年径玖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒养。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡挺狰,死狀恐怖明郭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丰泊,我是刑警寧澤薯定,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站瞳购,受9級特大地震影響话侄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜学赛,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一年堆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏浇,春花似錦变丧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至滴劲,卻和暖如春攻晒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背班挖。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工鲁捏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萧芙。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓给梅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親末购。 傳聞我的和親對象是個殘疾皇子破喻,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)盟榴,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 滿懷期待的做夢,遍體鱗傷的成長几莽;形成自己的生活方式迅办,有一個簡單且屬于自己的夢,多么美好啊章蚣。滿懷期待的去做自己的夢站欺,...
    劉泰安閱讀 252評論 0 0
  • 忙于世間俗世務(wù) 驚覺尋春已是遲 春天就要結(jié)束 大拙 春天要走了 我還在懷念樹的角度思考 走在植物的皇冠...
    豬大拙閱讀 612評論 1 3
  • 圣誕節(jié),有片片雪花飄落在窗前贾虽,有麋鹿和銅鈴還有可愛的圣誕老人逃糟,對于很多女孩子來說每年過圣誕節(jié)最期待的,是第二天醒來...
    啊大河向東流閱讀 253評論 0 0