Не работает ли LSApplicationWorkspace на iOS 11?
У меня есть приложение в закрытом состоянии, которое нужно сканировать все приложения и схемы и получить его с помощью частного API LSApplicationWorkspace defaultWorkspace
с другим функциональным методом, например privateURLSchemes
allInstalledApplications
. Это приложение работает хорошо, и я могу получить все, что мне нужно, от частного API до iOS 11, но в этой версии я получил только предупреждение и пустой массив. Похоже, что Apple ограничивает частный API, который разработчик не может использовать конфиденциально в iOS 11.
Итак, мой вопрос в том, какие альтернативные способы могут достичь моей потребности в iOS 11?
Ответы
Ответ 1
Существует способ найти, установлено ли конкретное приложение, а не список всех приложений, таких как allInstalledApplications
, но полезно для запроса определенного идентификатора пакета
Вот пример, метод получает идентификатор пакета и возвращает true, если он установлен на устройстве:
- (BOOL)checkIfAppInstalled: (NSString*)bundleID {
dlopen("/System/Library/PrivateFrameworks/MobileContainerManager.framework/MobileContainerManager",RTLD_NOW);
Class MBAppManager = NSClassFromString(@"MCMAppDataContainer");
NSError * error ;
id contentApp = [MBAppManager performSelector:@selector(containerWithIdentifier:error:) withObject:bundleID withObject:error];
return contentApp != nil;
}
Ответ 2
Частный API - это только частный API. Использование этого полностью неподдерживается, и поэтому вы не можете полагаться на частный API, который продолжает работать в будущих версиях ОС.
Кроме того, я был бы очень удивлен, если приложение, использующее частный API, могло попасть в App Store, поскольку это одна из вещей, которую сканеры Apple просматривают.
Ответ 3
На предприятии вы можете использовать команды управления Apple Mobile Device Management (MDM) ManagedApplicationList, чтобы получить статус управляемых приложений
Ответ 4
От этот пост. Из комментария @ovo по оригинальному вопросу, кажется, работает.
Используя MobileContainerManager.framework
, можно проверить, установлено ли приложение с помощью идентификатора пакета.
//If the device is iOS11
if ([[UIDevice currentDevice].systemVersion floatValue] >= 11.0) {
NSBundle *container = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/MobileContainerManager.framework"];
if ([container load]) {
Class appContainer = NSClassFromString(@"MCMAppContainer");
id test = [appContainer performSelector:@selector(containerWithIdentifier:error:) withObject:bundleId withObject:nil];
NSLog(@"%@",test);
if (test) {
return YES;
} else {
return NO;
}
}
return NO;
} else {
//Usual way
}
Ответ 5
у меня получился тот же Apple Reject.
Apple говорит
Ваше приложение использует или ссылается на следующие непубличные API:
LSApplicationWorkspace
Использование непубличных API не разрешено в App Store, потому что это может привести к плохому пользовательскому опыту, если эти API изменятся.
Продолжая использовать или скрывать непубличные API в будущих представлениях это приложение может привести к прекращению работы вашего Apple Developer учетной записи, а также удаление всех связанных приложений из App Store.
Решения
Чтобы узнать, какая библиотека или код вызывает эту проблему, используйте приведенный ниже код.
1-) Откройте терминал в macbook (cmd + пробел) и напишите терминал
2-) измените каталог проекта с помощью кода ниже
cd /Users/emreg/Documents/{your project url}
3-) Поиск подходящего слова
grep -r LSApplicationWorkspace .
grep -r allApplications .
в моем случае, Blesh SDK содержит ключевое слово LSApplicationWorkspace и allApplications, которое Apple не разрешает. Когда я обновил SDK, моя проблема решена.
Надеюсь, этот ответ поможет кому-то.