Obtener el package de aplicaciones principales desde dentro de la extensión

¿Es posible get NSBundle la aplicación NSBundle desde una extensión de aplicación? Me gustaría get el nombre para mostrar de la aplicación principal, no el nombre para mostrar de la extensión.

El método +mainBundle devuelve el package que contiene el "ejecutable de la aplicación actual", que es una subcarpeta de su aplicación cuando se llama desde una extensión.

Esta solución implica despegar dos niveles de directory de la URL del package, cuando termina en "appex".

C objective

 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") 

Esto se romperá si la ruta de acceso o la estructura de directory para una extensión de iOS cambian alguna vez.