获取所有已安装应用的列表

时间:2011-08-29 05:27:12

标签: objective-c ios jailbreak

我想获得所有已安装应用的列表(NSArray)。我的应用程序是一个越狱应用程序,位于/应用程序,所以Sandbox没有问题。有没有办法获得应用商店应用列表?我已经在其他应用程序中看到了这一点(Activator,SBSettings ......)。我不知道如何做到这一点,因为所有的应用程序沙箱都有那么大的代码,所以我不知道如何访问沙箱中的.app文件夹。

4 个答案:

答案 0 :(得分:13)

您可以使用此代码段:

 #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

答案 1 :(得分:7)

在已越狱的iPhone上,您只需阅读/Applications文件夹即可。所有安装的应用程序都在那只需使用/Applications列出NSFileManager中的目录:

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

答案 2 :(得分:2)

经过一番研究,我找到了一个名为iHasApp的框架。这是一个很好的解决方案,可以返回带有应用名称,标识符和图标的字典:Finding out what Apps are installed

答案 3 :(得分:2)

还有AppList library,它将为您完成所有肮脏的工作: rpetrich/AppList 它被用于许多越狱调整,所以我不知道为什么之前没有建议。

获取AppStore应用程序的一种方法是检查列表中返回的每个应用程序的isSystemApplication值。值设置为NO的是常规AppStore应用程序。还有一个函数 applicationsFilteredUsingPredicate:predicate ,所以也许甚至可以预先过滤列表。