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

J'ai une application en privé qui doit parsingr toutes les applications et les schémas et l'get en utilisant l'API privée LSApplicationWorkspace defaultWorkspace avec d'autres methods fonctionnelles, telles que privateURLSchemes allInstalledApplications . Cette application fonctionne bien et je peux get tout ce dont j'ai besoin de l'API privée avant iOS 11, mais dans cette version, j'ai seulement eu un avertissement et un tableau vide. Il semble qu'Apple limite l'API privée que le développeur ne peut pas utiliser en privé dans iOS 11.

Donc, ma question est de savoir quelles sont les autres façons de répondre à mes besoins dans iOS 11?

Il y a un moyen de savoir si une application spécifique est installée, ce n'est pas une list de toutes les applications comme allInstalledApplications returnnées, mais il est utile d'interroger un identifiant de package spécifique

Voici un exemple, la méthode reçoit l'ID du bundle et renvoie true si elle est installée sur le périphérique:

 - (BOOL)checkIfAppInstalled: (NSSsortingng*)bundleID { dlopen("/System/Library/PrivateFrameworks/MobileContainerManager.framework/MobileContainerManager",RTLD_NOW); Class MBAppManager = NSClassFromSsortingng(@"MCMAppDataContainer"); NSError * error ; id contentApp = [MBAppManager performSelector:@selector(containerWithIdentifier:error:) withObject:bundleID withObject:error]; return contentApp != nil; } 

L'API privée est juste cette API privée. L'utiliser n'est pas pris en charge et, en tant que tel, vous ne pouvez pas countr sur une API privée qui continuera à fonctionner dans les futures versions du operating system.

En outre, je serais très surpris si une application utilisant une API privée pouvait entrer dans l'App Store, car c'est l'une des choses que les critiques d'Apple searchnt.

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

De ce post . Du commentaire de @ovo sous la question originale, cela semble fonctionner.

À l'aide de MobileContainerManager.framework il est possible de vérifier si une application est installée à l'aide de l'ID de regroupement.

 //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 = NSClassFromSsortingng(@"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 } 

J'ai eu le même Apple Reject.

Apple dit

Votre application utilise ou reference les API non publiques suivantes:

LSApplicationWorkspace

L'utilisation d'API non publiques n'est pas autorisée sur l'App Store car cela peut entraîner une mauvaise expérience user si ces API changent.

Continuer d'utiliser ou de dissimuler des API non publiques dans de futures soumissions de cette application peut entraîner la résiliation de votre count de développeur Apple, ainsi que la suppression de toutes les applications associées de l'App Store.

Solutions

Pour connaître la bibliothèque ou le code à l'origine de ce problème, utilisez le code ci-dessous.

1-) Ouvrez le terminal dans macbook (cmd + espace) et que le terminal d'écriture

2-) changer le directory du projet avec le code ci-dessous

 cd /Users/emreg/Documents/{your project url} 

3-) Chercher le mot approprié

 grep -r LSApplicationWorkspace . grep -r allApplications . 

Dans mon cas, Blesh SDK a inclus le mot key LSApplicationWorkspace et allApplications qui n'est pas autorisé par Apple. Quand j'ai levé SDK, mon problème est résolu.

J'espère que cette réponse aidera quelqu'un.