2011-08-29 6 views
24

Vorrei ottenere un elenco di tutte le app installate (NSArray). La mia app è un'app jailbreak e si trova in/Applicazioni quindi Sandbox non è un problema lì. C'è un modo per ottenere un elenco di app store app? L'ho già visto in altre app (Activator, SBSettings ...). Non ho idea di come fare questo, perché tutte le sandbox delle app hanno quel codice enorme, quindi non so come sarebbe possibile accedere alla cartella .app all'interno della sandbox.Ottieni l'elenco di tutte le app installate

risposta

13

È possibile utilizzare questo frammento di codice:

#import "InstalledAppReader.h" 

static NSString* const installedAppListPath = @"/private/var/mobile/Library/Caches/com.apple.mobile.installation.plist"; 

@interface InstalledAppReader() 

-(NSArray *)installedApp; 
-(NSMutableDictionary *)appDescriptionFromDictionary:(NSDictionary *)dictionary; 

@end 


@implementation InstalledAppReader 

#pragma mark - Init 
-(NSMutableArray *)desktopAppsFromDictionary:(NSDictionary *)dictionary 
{ 
    NSMutableArray *desktopApps = [NSMutableArray array]; 

    for (NSString *appKey in dictionary) 
    { 
     [desktopApps addObject:appKey]; 
    } 
    return desktopApps; 
} 

-(NSArray *)installedApp 
{  
    BOOL isDir = NO; 
    if([[NSFileManager defaultManager] fileExistsAtPath: installedAppListPath isDirectory: &isDir] && !isDir) 
    { 
     NSMutableDictionary *cacheDict = [NSDictionary dictionaryWithContentsOfFile: installedAppListPath]; 
     NSDictionary *system = [cacheDict objectForKey: @"System"]; 
     NSMutableArray *installedApp = [NSMutableArray arrayWithArray:[self desktopAppsFromDictionary:system]]; 

     NSDictionary *user = [cacheDict objectForKey: @"User"]; 
     [installedApp addObjectsFromArray:[self desktopAppsFromDictionary:user]]; 

     return installedApp; 
    } 

    DLOG(@"can not find installed app plist"); 
    return nil; 
} 

@end 
+0

Questa unsing è un'API privata? – iJatrat

+5

Questa non è un'API privata, ma abbiamo accesso alla cartella privata. Apple rifiuterà la tua app. Utilizzare questo codice solo per iPhone jailbroken. – Igor

+2

@Fedorchuk, come posso ottenere questo elenco di applicazioni installate dai normali dispositivi iOS, voglio dire senza iPhone jailbroken, per favore aiutatemi a fare questo. – maddysan

6

Su iPhone jailbroken, è possibile leggere la cartella /Applications. Tutte le applicazioni installate vanno lì. Basta elencare le directory in /Applications utilizzando NSFileManager:

NSArray *appFolderContents = [[NSFileManager defaultManager] directoryContentsAtPath:@"/Applications"]; 
+1

Questo legge solo le app preinstallate e le app cydia, sto parlando delle app dell'app store. – JonasG

+1

Provate quindi la cartella delle applicazioni dell'utente 'mobile':'/private/var/mobile/Applications' –

+0

@ BjörnMarschollek: Grazie mille. Mi ha aiutato molto – Pushkraj

2

C'è anche il AppList library, che farà tutto il lavoro sporco per you: rpetrich/AppList È utilizzato in molte modifiche al jailbreak, quindi non so perché non è stato suggerito qui prima.

Un modo per ottenere solo app AppStore è controllare il valore di isSystemApplication per ogni app restituita nell'elenco. Quelli con il valore impostato su NO sono normali app AppStore. C'è anche una funzione applicationsFilteredUsingPredicate:predicate, quindi forse sarebbe anche possibile filtrare l'elenco in anticipo.