web-dev-qa-db-fra.com

LSApplicationWorkspace ne fonctionne-t-il pas sur iOS 11?

J'ai une application en privé qui doit analyser toutes les applications et tous les schémas et l'obtenir à l'aide de l'API privée LSApplicationWorkspace defaultWorkspace avec une autre méthode fonctionnelle, telle que privateURLSchemesallInstalledApplications. Cette application fonctionne bien et je peux obtenir tout ce dont j'ai besoin de l'API privée avant iOS 11, mais dans cette version, je n'ai que quelques avertissements et un tableau vide. Il semble que Apple limite les API privées que les développeurs ne peuvent pas utiliser en privé dans iOS 11.

Ma question est donc de savoir quelles autres solutions peuvent répondre à mes besoins dans iOS 11?

14
ovo

UPDATE: Cette méthode ne fonctionne pas sur iOS 12 - droit requis 

Il existe un moyen de rechercher si une application spécifique est installée, ce n'est pas une liste de toutes les applications comme celle retournée par allInstalledApplications mais son utile pour interroger un identifiant de bundle

Voici un exemple, la méthode reçoit l'id du bundle et renvoie true s'il est installé sur le périphérique:

- (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;
}
3
inspector_60

En entreprise, vous pouvez utiliser les commandes ManagedApplicationList du protocole MDM (Apple Mobile Device Management) pour obtenir le statut des applications gérées.

0
Sweet.Shi

De ce post . D'après le commentaire de @ovo sous la question initiale, il semble que cela fonctionne.

En utilisant MobileContainerManager.framework, il est possible de vérifier si une application est installée en utilisant bundle id.

//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
    }
0
strano

L'API privée, c'est ça: l'API privée. Son utilisation est totalement non prise en charge et vous ne pouvez donc pas compter sur une API privée qui continuera à fonctionner dans les versions futures du système d'exploitation.

En outre, je serais très surpris qu'une application utilisant une API privée puisse accéder à l'App Store, car c'est l'une des choses que les réviseurs d'Apple recherchent.

0
Charles Srstka