wake-up-neo.com

Funktioniert LSApplicationWorkspace unter iOS 11 nicht?

Ich besitze eine private App, die alle Anwendungen und Schemata scannen und mithilfe der privaten API LSApplicationWorkspace defaultWorkspace mit anderen Funktionsmethoden wie privateURLSchemesallInstalledApplications herunterladen muss. Diese App funktioniert gut und ich kann alles was ich brauche von der privaten API vor iOS 11 bekommen, aber in dieser Version habe ich nur eine Warnung und ein leeres Array. Es scheint, dass Apple die private API einschränkt, die Entwickler in iOS 11 nicht privat verwenden können.

Meine Frage ist also, welche alternativen Möglichkeiten ich in iOS 11 nutzen kann.

14
ovo

UPDATE: Diese Methode funktioniert nicht unter iOS 12 - Berechtigung erforderlich 

Es gibt eine Möglichkeit, herauszufinden, ob eine bestimmte Anwendung installiert ist. Sie enthält keine Liste aller zurückgegebenen Anwendungen, wie allInstalledApplications, sondern die Abfrage einer bestimmten Bundle-ID

Hier ein Beispiel: Die Methode empfängt die Bundle-ID und gibt true zurück, wenn sie auf dem Gerät installiert ist:

- (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

In Unternehmen können Sie mit den Befehlen der ManagedApplicationList-Befehle von Apple Mobile Device Management (MDM) den Status der verwalteten Anwendungen abrufen

0
Sweet.Shi

Aus diesem Beitrag . Aus dem Kommentar von @ovo unter der ursprünglichen Frage scheint es zu funktionieren.

Mit MobileContainerManager.framework können Sie mithilfe der Bundle-ID überprüfen, ob eine App installiert ist.

//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

Private API ist genau das - private API. Die Verwendung wird vollständig nicht unterstützt. Daher können Sie sich nicht darauf verlassen, dass eine private API in zukünftigen Versionen des Betriebssystems weiterhin funktioniert.

Außerdem wäre ich sehr überrascht, wenn eine App, die private APIs verwendet, in den App Store gelangt, da dies eines der Dinge ist, nach denen die Reviewer von Apple suchen.

0
Charles Srstka