iphone - NSBundle, plist y otros recursos en una biblioteca estática Obj-c
(3)
He creado una biblioteca estática en Xcode, que puedo usar con éxito en otros proyectos. Sin embargo, con recursos como plists, encuentro que debo incluir cualquier plists referenciado en mi biblioteca en el proyecto principal donde se usa el proyecto.
En mi proyecto de biblioteca estática, tengo mi lista incluida en la fase de "Copiar los recursos del paquete" del objetivo. En mi código, esto es lo que estoy haciendo:
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
Si uso mainBundle y MyClassParams.plist está incluido en el proyecto principal, todo está bien. Si MyClassParams.plist está incluido en el proyecto de la biblioteca, no funciona.
En el supuesto de que [NSBundle mainBundle] hacía referencia al método estático incorrecto a utilizar, lo reemplacé con:
NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]];
Esto no funcionó bien.
Entonces, ¿es posible incluir un plist o cualquier otro recurso con una biblioteca estática, o tengo que incluir lo que necesite en el proyecto donde se usa la biblioteca?
Las bibliotecas estáticas no están en paquetes, cuando se vinculan a una aplicación forman parte de ese paquete de aplicaciones. En el iPhone, efectivamente, todo el código que escriba estará en el mainBundle ya que no puede incluir marcos incrustados.
Entonces, sí, necesita copiar todos los recursos en el proyecto al que está vinculando el marco estático.
Sé que no puede incluir archivos de recursos en una biblioteca estática (eso es lo que hacen los marcos). Utilizo otra solución en mis proyectos:
Dentro del proyecto de la biblioteca estática "YYY":
- Agrego un destino de "Paquete de carga" a mi proyecto de biblioteca estática (Agregar destino, Cocoa, Paquete de carga)
- Añado este objetivo como una dependencia del objetivo de la biblioteca estática.
Dentro del proyecto principal:
- Enlace el
libYYY.a
- Agregue el paquete
YYY.bundle
a los archivos de recursos copiados
De esta manera, los archivos de recursos utilizados en la biblioteca estática no se administran en el proyecto principal. Digamos que tengo una imagen foo.png
en la biblioteca estática, yo uso
[UIImage imageNamed:@"YYY.bundle/foo.png"]
A continuación, podría obtener su lista de esta manera:
NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]];
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
A continuación, dos capturas de pantalla:
- izquierda : proyecto de biblioteca estática con destino de paquete cargable
- derecha : muestra el binario de la biblioteca estática agregado a "Vincular binario con bibliotecas" y el paquete de recursos agregado a "Copiar recursos del paquete".
Seguí todo lo que sugirió @Jilouc, sin embargo, puedo obtener el paquete pero no pude obtener archivos dentro de él. @"yyy.bundle/image"
ambas formas ( @"yyy.bundle/image"
o staticlib pathforresource...
)
Luego usé el método de abajo y funcionó!
NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]];
NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName];
NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];