2011-08-29 27 views
24

Me gustaría obtener una lista de todas las aplicaciones instaladas (NSArray). Mi aplicación es una aplicación de jailbreak y se encuentra en/Applications, por lo que Sandbox no es problema allí. ¿Hay alguna forma de obtener una lista de aplicaciones de la tienda de aplicaciones? Ya lo he visto en otras aplicaciones (Activator, SBSettings ...). No tengo idea de cómo hacer esto, porque todos los sandboxes de aplicaciones tienen ese código enorme, así que no sé cómo sería posible acceder a la carpeta .app dentro del entorno limitado.Obtener lista de todas las aplicaciones instaladas

Respuesta

13

Puede utilizar este fragmento de código:

#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

¿Esto es una API privada? – iJatrat

+5

Esto no es una API privada, pero tenemos acceso a la carpeta privada. Apple rechazará tu aplicación. Use este código solo para iPhone con jailbreak. – Igor

+2

@Fedorchuk, ¿cómo puedo obtener esta lista de aplicaciones instaladas desde dispositivos iOS normales quiero decir sin iPhones jailbreak, por favor ayúdenme a hacer esto. – maddysan

6

En iPhones jailbroken, puede leer la carpeta /Applications. Todas las aplicaciones instaladas van allí. Basta con enumerar los directorios en los /Applications usando NSFileManager:

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

Que solo lee las aplicaciones preinstaladas y las aplicaciones de cydia, estoy hablando de las aplicaciones de la tienda de aplicaciones. – JonasG

+1

Pruebe la carpeta de aplicaciones del usuario 'mobile' y luego:'/private/var/mobile/Applications' –

+0

@ BjörnMarschollek: Muchísimas gracias. Yo me ayudé mucho – Pushkraj

2

También existe la AppList library, que va a hacer todo el trabajo sucio para usted: rpetrich/AppList Se usa en muchos ajustes de Jailbreak, por lo que no sé por qué no se sugirió antes.

Una forma de obtener solo aplicaciones de AppStore sería comprobar el valor de isSystemApplication para cada aplicación devuelta en la lista. Aquellos con el valor establecido en NO son aplicaciones regulares de AppStore. También hay una función applicationsFilteredUsingPredicate:predicate, por lo que quizás incluso sería posible filtrar la lista de antemano.

Cuestiones relacionadas