Не работает ли 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, моя проблема решена.

Надеюсь, этот ответ поможет кому-то.