分3種情況:
1.越獄之後的裝置,可以擷取完整的列表,擷取也比較方便,方法如下:
http://stackoverflow.com/questions/3878197/is-it-possible-to-get-information-about-all-apps-installed-on-iphone/3878220#3878220
http://www.iphonedevsdk.com/forum/iphone-sdk-development/22289-possible-retrieve-these-information.html
也有如下代碼可以擷取:
NSFileManager* fileManager = [NSFileManager defaultManager]; NSMutableArray* applist = [[NSMutableArray alloc] init]; NSString *appPath = @"/var/mobile/Applications"; for (NSString *path in [fileManager contentsOfDirectoryAtPath:appPath error:nil]) { for (NSString *subpath in [fileManager contentsOfDirectoryAtPath:[NSString stringWithFormat:@"%@/%@",appPath,path] error:nil]) { if ([subpath hasSuffix:@".app"]) { NSString* infoplist = [NSString stringWithFormat:@"%@/%@/%@/Info.plist",appPath, path, subpath]; NSLog(@"info.plist的路徑%@",infoplist); NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:infoplist]; NSLog(@"這個app的設定檔內容%@",dict); [applist addObject:[dict objectForKey:@"CFBundleDisplayName"]]; } } } NSLog(@"applist:%@",applist); [applist release];
住:代碼啟動並執行目錄為/Applications/
2.沒有越獄的裝置,官方沒有提供api,所以只能用一些技巧,但是擷取內容不全。
http://developer.apple.com/library/ios/#featuredarticles/iPhoneURLScheme_Reference/Introduction/Introduction.html
http://forrst.com/posts/UIDevice_Category_For_Processes-h1H
大概解釋一下2種方法:
方法一:利用URL scheme,看對於某一應用特有的url scheme,有沒有響應。如果有響應,就說明安裝了這個特定的app。
方法二:利用一些方法獲得當前正在啟動並執行進程資訊,從進程資訊中獲得安裝的app資訊。
還有個方法應該也是可行的,就是判斷有沒有安裝某些軟體,這個方法參考這篇文章:
http://www.iloss.me/?p=835但是總體來說,沒有越獄想要擷取完整的安裝列表是不太容易實現。
3
首先本文所研究的必須在越獄的前提下。
ios中要列出已安裝的軟體目前有3中方法:(據我所知)
1.我之前的文章有2種方法擷取,詳情請移步:
http://www.iloss.me/?p=844
2.用系統提供的函數,應該比上面2種方法要方便,安全,高效。(但據我測試系統的也是讀取com.apple.mobile.installation.plist檔案)
Mobile Installation 是 iOS 中負責安裝,卸載,更新等 IPA 的 Framework,我們丟進 IDA分析
得到以下API
__MobileInstallationRebuildMap __text 000011EF 00000072 R . . . B . .
_MobileInstallationCheckCapabilitiesMatch __text 00001261 0000008C R . . . B . .
_MobileInstallationSetDeviceCapabilities __text 000012ED 00000089 R . . . B . .
_MobileInstallationCopySafeHarbors __text 00001376 0000007B R . . . B . .
_MobileInstallationRemoveSafeHarbor __text 000013F1 00000089 R . . . B . .
_MobileInstallationRegisterSafeHarbor __text 0000147A 000000E4 R . . . B . .
_MobileInstallationProcessRestoredContainer __text 0000155E 00000087 R . . . B . .
_MobileInstallationLookupArchives __text 000015E5 0000007B R . . . B . .
_MobileInstallationRemoveArchive __text 00001660 00000087 R . . . B . .
_MobileInstallationRestore __text 000016E7 00000087 R . . . B . .
_MobileInstallationArchive __text 0000176E 00000087 R . . . B . .
_MobileInstallationBrowse __text 000017F5 00000076 R . . . B . .
_MobileInstallationLookup __text 0000186B 0000007B R . . . B . .
_MobileInstallationUninstall __text 000018E6 00000087 R . . . B . .
_MobileInstallationUpgrade __text 0000196D 00000087 R . . . B . .
我這裡只分析今天用到的_MobileInstallationBrowse
最後直接貼上最終的分析結果:
int (*MobileInstallationBrowse)(NSDictionary *options, int (*callback)(NSDictionary *dict, id value), id value);
調用方法:
static int callback(NSDictionary *dict, id result) { NSArray *currentlist = [dict objectForKey:@"CurrentList"]; if (currentlist) { for (NSDictionary *appinfo in currentlist) { [(NSMutableArray*)result addObject:[[appinfo copy] autorelease]]; } } return 0; } +(id)browse{ NSMutableArray *result = [NSMutableArray new]; MobileInstallationBrowse( [NSDictionary dictionaryWithObject:@"Any" forKey:@"ApplicationType"],&callback, result); //Any 代表所有程式,這裡可以用 “System” “User”來區分系統和普通軟體} |
最終result數組將是我們擷取到的程式列表,結構是plist形式,如下:
這個和第一種方法得到的結果是一樣的,最後來一張最終