2016-01-07 10 views
1

Многие люди используют приложение Launcher. enter image description hereКак Launcher может получить список установленных приложений моего iPhone?

Мне интересно, как Laucher сможет получить список установленных приложений моего iPhone?


Я нашел способ сделать подобное, но все они не идеальны.

1.use canOpenUrl :, для этого api требуется много url-схем приложений.

2.search файл plist /private/var/mobile/Library/Caches/com.apple.mobile.installation.plist, который недоступен в iPhone без нарушения безопасности. Также этот файл plist больше не существует в ios9.

3.search/Приложения, которые недоступны в iPhone без нарушения безопасности.


Вопрос в том, как Launcher сможет искать мой iPhone и получать список установленных приложений?

ответ

4

Итак, я загрузил Launcher в iTunes и посмотрел на его info.plist. Оказалось, что он делает то, что вы впервые предложили, много раз задавайте вопросы, чтобы выяснить, что вы установили.

Вот содержимое LSApplicationQuerySchemes с версии 1.3.6:

https://gist.github.com/liamnichols/53069b01da032498bd04

Все 4561 из них

+0

Nice судебно-медицинской экспертизы. – trojanfoe

+0

developer.apple.com/videos/play/wwdc2015-703 говорит, что LSApplicationQuerySchemes имеет максимальное число 50, так как могут работать схемы 4561? – pinchwang

+0

Я считаю, что предел 50 - это то, что вы все еще компилируете против SDK iOS 8, но запустите свое приложение на iOS 9 (и не ставьте никаких схем в info.plist). Я не смотрел видео, хотя я точно не знаю, что они сказали. Это то, что делает приложение Launcher, хотя, если оно работает, должно быть хорошо ¯ \ _ (ツ) _/¯ – liamnichols

0

Недавно я узнал, что решение, используя предопределенные Apple, классы LSApplicationWorkspace_class и LSApplicationProxy мы можем добиться этого.

Класс LSApplicationWorkspace_class = objc_getClass ("LSApplicationWorkspace");

NSObject * workspace = [LSApplicationWorkspace_class performSelector: @selector (defaultWorkspace)];

for (LSApplicationProxy *apps in [workspace performSelector:@selector(allApplications)]) 
{ 
    NSString *localizedName = apps.localizedName; 

    if([apps.applicationType isEqualToString:@"User"]) 
    { 
     NSLog(@"\nlocalizedName: %@",localizedName); 
     NSLog(@"minimumSystemVersion: %@",apps.minimumSystemVersion); 
     NSLog(@"fileSharingEnabled: %d",apps.fileSharingEnabled); 
     NSLog(@"sdkVersion: %@",apps.sdkVersion); 
    } 
}