Ответ 1
Нет, в приложениях iOS нет доступа к информации о других приложениях из-за изолированной среды.
Можно ли программно узнать имена всех приложений, установленных на моем устройстве iOS? Есть ли какой-либо API для этого?
Спасибо за помощь
Нет, в приложениях iOS нет доступа к информации о других приложениях из-за изолированной среды.
Да, возможно получить список всех установленных приложений
-(void) allInstalledApp
{
NSDictionary *cacheDict;
NSDictionary *user;
static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
cacheDict = [NSDictionary dictionaryWithContentsOfFile: path];
user = [cacheDict objectForKey: @"User"];
NSDictionary *systemApp=[cacheDict objectForKey:@"System"];
}
systemApp
Dictionary
содержит список всех связанных с системой приложений
и user
Dictionary
содержит другую информацию о приложении.
Не с устройства. Однако с рабочего стола вы можете заглянуть в библиотеку iTunes.
Есть способы сделать это без взломанного устройства и не отклонить ваше приложение.
1. получить список текущих запущенных процессов см. этот. Вам нужно будет перевести имя процесса в имя приложения.
2. Проверьте, не зарегистрировано ли в каких-либо приложениях уникальная схема URL с UIApplicationDelegate canOpenURL. Есть несколько сайтов, каталогизирующих известные схемы URL, этот является лучшим.
Если приложение в настоящее время не запущено и не регистрирует настраиваемую схему URL-адресов, оно не будет обнаружено этими методами. Мне интересно услышать метод, который будет разрешен в магазине приложений, который работает лучше, чем это.
попробуйте это, он будет работать даже с устройствами без пароля:
#include <objc/runtime.h>
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
SEL selector=NSSelectorFromString(@"defaultWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:selector];
SEL selectorALL = NSSelectorFromString(@"allApplications");
NSLog(@"apps: %@", [workspace performSelector:selectorALL]);//will give you all **Bundle IDS** of user all installed apps
Вы можете сделать это, установив, установлено ли приложение или нет, с помощью метода canOpenURL
или путем проверки фоновых процессов и их сопоставления с именем интересующего вас приложения.
Вы можете использовать цель выполнения c, чтобы получить список всех установленных приложений. Он даст вам массив объектов LSApplicationProxy
.
Ниже приведен фрагмент кода, который печатает имя всех приложений, установленных на вашем устройстве.
Class LSApplicationWorkspace_class = objc_getClass("LSApplicationWorkspace");
NSObject* workspace = [LSApplicationWorkspace_class performSelector:NSSelectorFromString(@"defaultWorkspace")];
NSMutableArray *array = [workspace performSelector:NSSelectorFromString(@"allApplications")];
NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
for (id lsApplicationProxy in array) {
if(nil != [lsApplicationProxy performSelector:NSSelectorFromString(@"itemName")]){
[mutableArray addObject:[lsApplicationProxy performSelector:NSSelectorFromString(@"itemName")]];
}
}
NSLog(@"********* Applications List ************* : \n %@",mutableArray);
Не забудьте включить <objc/runtime.h>
.