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 privateURLSchemes
allInstalledApplications
. 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?
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;
}
En entreprise, vous pouvez utiliser les commandes ManagedApplicationList du protocole MDM (Apple Mobile Device Management) pour obtenir le statut des applications gérées.
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
}
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.