2014-10-04 8 views

Antwort

18

Die Methode +mainBundle gibt das Bundle zurück, das die ausführbare Datei der aktuellen Anwendung enthält. Dies ist ein Unterordner Ihrer App, wenn Sie von einer Erweiterung aus aufgerufen werden.

Bei dieser Lösung werden zwei Verzeichnisebenen von der URL des Bundles entfernt, wenn sie mit "appex" endet.

Objective-C

NSBundle *bundle = [NSBundle mainBundle]; 
if ([[bundle.bundleURL pathExtension] isEqualToString:@"appex"]) { 
    // Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex 
    bundle = [NSBundle bundleWithURL:[[bundle.bundleURL URLByDeletingLastPathComponent] URLByDeletingLastPathComponent]]; 
} 

NSString *appDisplayName = [bundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]; 

Swift 2,2

var bundle = NSBundle.mainBundle() 
if bundle.bundleURL.pathExtension == "appex" { 
    // Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex 
    bundle = NSBundle(URL: bundle.bundleURL.URLByDeletingLastPathComponent!.URLByDeletingLastPathComponent!)! 
} 

let appDisplayName = bundle.objectForInfoDictionaryKey("CFBundleDisplayName") 

Swift 3

var bundle = Bundle.main 
if bundle.bundleURL.pathExtension == "appex" { 
    // Peel off two directory levels - MY_APP.app/PlugIns/MY_APP_EXTENSION.appex 
    let url = bundle.bundleURL.deletingLastPathComponent().deletingLastPathComponent() 
    if let otherBundle = Bundle(url: url) { 
     bundle = otherBundle 
    } 
} 

let appDisplayName = bundle.object(forInfoDictionaryKey: "CFBundleDisplayName") 

Dies wird brechen, wenn die Pathé xtension oder die Verzeichnisstruktur für eine iOS-Erweiterung ändert sich je.

+0

Danke dafür! Konnten Sie eine AppStore-App auf diese Weise genehmigen? – ewindsor

+0

Ja, hier werden keine privaten APIs verwendet. Wir haben dies in unserer Erweiterung watchOS 1 verwendet, um das Modell des verwalteten Objekts für ein UIManagedDocument aus dem Hauptpaket der iOS-App zu laden. – phatblat

+0

Ah super. Danke für die Einsicht. – ewindsor