Я хотел бы получить список всех установленных приложений (NSArray). Мое приложение - приложение для джейлбрейка и находится в /Applications, поэтому Sandbox здесь не проблема. Есть ли способ получить список приложений для приложений приложений? Я уже видел это в других приложениях (Activator, SBSettings...). Я понятия не имею, как это сделать, потому что все песочницы приложений имеют этот огромный код, поэтому я не знаю, как можно было бы получить доступ к папке .app внутри песочницы.
Получить список всех установленных приложений
Ответ 1
Вы можете использовать этот фрагмент кода:
#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
Ответ 2
В jailbroken iPhones вы можете просто прочитать папку /Applications
. Все установленные приложения идут туда. Просто перечислите каталоги в /Applications
с помощью NSFileManager
:
NSArray *appFolderContents = [[NSFileManager defaultManager] directoryContentsAtPath:@"/Applications"];
Ответ 3
После некоторых исследований я нашел структуру под названием iHasApp. Вот хорошее решение для возврата словаря с именем приложения, идентификатором и значком: Определение того, какие приложения установлены
Ответ 4
Также есть AppList library
, который сделает для вас всю грязную работу:
rpetrich/AppList
Он использовался во многих трюках с помощью джейлбрейка, поэтому я не знаю, почему это раньше не предлагалось.
Один из способов получить только приложения AppStore - проверить значение isSystemApplication
для каждого приложения, возвращенного в списке. Те, у которых значение NO
установлено, являются обычными приложениями AppStore. Также существует функция applicationsFilteredUsingPredicate:predicate
, поэтому, возможно, даже будет возможно предварительно отфильтровать список.