私有API的使用

私有API是指蘋果未公開的一些方法,通常情況下這些方法不允許開發者使用,通常情況是指上架AppStore。私有API可以實現一些開放API不能實現的效果,功能強大,效果非凡。蘋果不允許使用,是因為有些私有API會侵犯用戶隱私,但使用私有API也并非一定會侵犯用戶隱私,這要看開發者怎么用了。
企業級賬號發布供內部人使用的APP,可以使用私有API。發布到其他APP平臺供越獄手機下載的APP,也有可能使用了私有API。這兩者沒有蘋果審核把關,私有API可以隨便使用。蘋果明令禁止使用私有API的APP上架AppStore!但凡事無絕對,AppStore上也不乏使用私有API的應用,使用辦法有很多,比如熱更新。不被蘋果發現就行,發現了輕者下架,重者封號。
我想看看私有API到底能干些啥,寫了一個測試私有API的小項目,涉及到的知識點大多數來源于網絡,在此感謝大神們的知識共享。項目很小,知識很淺,歡迎拍磚吐槽。
項目代碼: privateApiApps
開發環境: Xcode 8.2.1,iPhone 6,iOS 10.2
項目截圖:


獲取iPhone上安裝的app
app相關信息

參考資料:
iOS-Runtime-Headers

獲取iOS設備上安裝的應用列表

獲取iPhone中安裝的APP列表
Class LSAppClass = objc_getClass("LSApplicationWorkspace");NSObject *workspace = [LSAppClass performSelector:@selector(defaultWorkspace)];NSArray *appsArray = [workspace performSelector:@selector(allApplications)];

這里面使用了runtime的方法- (id)performSelector:(SEL)aSelector;
,需要引入<objc/runtime.h>
。該方法的作用是給接收者傳遞進去一個方法,返回值就是這個方法執行后的返回值。
由于調用的是私有API,傳入的方法相當于一個字符串,編譯器不會檢測該方法是否正確,相反會一直報警告。例如上面傳遞的方法defaultWorkspace
,這是個私有API的方法。通常還有另一種調用performSelector
方法的寫法:
NSObject *workspace = [LSAppClass performSelector:NSSelectorFromString(@"defaultWorkspace")];

如果傳遞進去的私有API方法名寫錯了,程序就會找不到該方法而崩潰。所以通常會通過下面方法檢測接收者或接收者的父類是否實現了傳遞進去的方法。

  • (BOOL)respondsToSelector:(SEL)aSelector;

使用方法:
if ([LSAppClass respondsToSelector:@selector(defaultWorkspace)]) { NSObject *workspace = [LSAppClass performSelector:@selector(defaultWorkspace)];}

真實情況中,該方法并非必要。傳入的私有API方法名都是固定的,程序崩潰了說明方法名寫錯了,改成正確的即可。使用該方法不會崩潰,反而不易發現錯誤。
獲取每個APP的相關信息
[appsArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { AppsObject *appsObj = [[AppsObject alloc] init]; appsObj.appName = [obj performSelector:@selector(localizedName)]; appsObj.version = [obj performSelector:@selector(shortVersionString)]; appsObj.bundleId = [obj performSelector:@selector(applicationIdentifier)]; appsObj.appFullName = [obj performSelector:@selector(itemName)]; appsObj.appType = [obj performSelector:@selector(applicationType)]; appsObj.appVendorName = [obj performSelector:@selector(vendorName)]; appsObj.appRating = [obj performSelector:@selector(ratingLabel)]; [_appsObjArray addObject:appsObj];}]

遍歷獲取的APP列表,通過私有API獲取每個app的各種信息:
私有API方法名
用途

localizedName
app名字

shortVersionString
版本號

applicationIdentifier
Bundle Identifier

itemName
app在AppStore顯示的名字

applicationType
app類型,分為:System和User

vendorName
app供應商

ratingLabel
app評級

獲取APP圖標
上述中并沒有獲取APP圖標的方法,獲取app圖標比較麻煩。
獲取APP圖標路徑
NSDictionary *dict = [object performSelector:@selector(boundIconsDictionary)];NSString *appIconPath = [NSString stringWithFormat:@"%@/%@.png",[[object performSelector:@selector(resourcesDirectoryURL)] path],[[[dict objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] lastObject]];

iOS10.2親測,該方法只能獲取模擬器上的APP圖標,真機無效。
獲取圖標data數據
appsObj.iconData = [obj performSelector:@selector(iconDataForVariant:) withObject:@(2)];

該data數據并不能直接轉為UIImage,需要對data數據進行截取轉換,方法如下:

  • (UIImage *)getAppIcon:(NSData *)iconData { NSInteger lenth = iconData.length; NSInteger width = 87; NSInteger height = 87; uint32_t *pixels = (uint32_t *)malloc(width * height * sizeof(uint32_t)); [iconData getBytes:pixels range:NSMakeRange(32, lenth - 32)]; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(pixels, width, height, 8, (width + 1) * sizeof(uint32_t), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); CGImageRef cgImage = CGBitmapContextCreateImage(ctx); CGContextRelease(ctx); CGColorSpaceRelease(colorSpace); UIImage *icon = [UIImage imageWithCGImage: cgImage]; CGImageRelease(cgImage); return icon;}

打開APP
在iOS 9以后要想打開其他app需要添加URL Scheme,設置白名單,否則將無法打開,白名單的上限為50個。上文中我們可以獲取APP的Bundle Id
,依靠Bundle Id
使用私有API可以打開其他APP,并沒有數量限制。
Class LSAppClass = NSClassFromString(@"LSApplicationWorkspace");id workSpace = [(id)LSAppClass performSelector:@selector(defaultWorkspace)];[workSpace performSelector:@selector(openApplicationWithBundleID:) withObject:self.appsObj.bundleId];

原文地址:http://mp.weixin.qq.com/s/dAw5fNDpwRKy6ezwlWWvzw

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容

  • API 的分類 iOS 中的 API 大致分為三種:Published API(公開的 API)、UnPublis...
    焚雪殘陽閱讀 27,331評論 39 33
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,755評論 0 9
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,728評論 25 708
  • 轉載請注明出處:仿獵豹垃圾清理(實現原理+源碼)前幾天無意打開獵豹內存大師, 發現它的垃圾清理很強大, 效果也不錯...
    Visitor閱讀 1,059評論 1 4
  • 遇見,在最美好的時刻,沒有早一秒鐘,也沒有晚一秒鐘,在輕風微拂的田野,在霞光初綻的清晨,這是一種最美妙的邂逅。...
    天使6班8組79號楊蕊Mary閱讀 167評論 0 6