¿Cómo hacer un paquete de activos de iOS?


Vi un paquete de activos personalizados en un proyecto de iOS que evalué, así que al menos sé que es posible.

Mi problema es que estoy usando un CATiledLayer con aproximadamente 22,000 tiles para una imagen dada y toma mucho tiempo compilar (media hora de construcción limpia, 5-10 minutos para la construcción regular). Por lo tanto, quiero tomar todas las imágenes y hacer un paquete personalizado para hacerlo portátil y con suerte no recompilar en el paquete de aplicaciones cada vez.

¿Cómo lo hago? Revisé los documentos, pero no vi una explicación sobre cómo crear realmente el paquete.

Author: michael, 2011-02-03

5 answers

La respuesta es estúpidamente simple

Hacer una carpeta en finder, añadir archivos a ella, cambiarle el nombre a bundlename.paquete

Arrastra a Xcode-success!

Para acceder, use la forma de PathToMainBundle+"/bundlename.paquete"

 86
Author: michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-11 19:32:39

Cómo crear un paquete

  1. Cree una carpeta en finder.
  2. Añadir archivos a la carpeta
  3. Cambie el nombre de la carpeta para que su extensión sea .bundle (por ejemplo, "Nueva carpeta" -> "BundleName.paquete")

PD: Puede en cualquier momento hacer clic derecho en la carpeta y presionar "Mostrar contenido del paquete" para agregar, eliminar o modificar cualquiera de los archivos.

Cómo agregar el paquete a Xcode

  1. Arrástrelo a Xcode

Cómo usar el paquete

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; 
NSString *resource = [bundle pathForResource:@"fileName" ofType:@"fileType"];

(Reemplazar BundleName, fileName y fileType con nombres apropiados)

 31
Author: hfossli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 12:23:53

Otros dos consejos útiles:

Primero, para ver el contenido del paquete en XCode, debe establecer su tipo en el Panel de utilidad del Inspector de archivos, en "Paquete de aplicaciones". Usted todavía no será capaz de copiar hacia y desde a través de XCode. Necesitará usar Terminal, pero XCode lo actualizará inmediatamente.

En segundo lugar, para usar los recursos en el paquete, aquí hay un fragmento útil...

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"AquarianHarp" ofType:@"bundle"];
NSString *imageName = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"trebleclef2" ofType:@"png"];
UIImage *myImage = [[UIImage alloc] initWithContentsOfFile:imageName];

Como mencioné en mi comentario anterior, en realidad no necesitas cargar el paquete (no se puede, ya que no es ejecutable) y el ofType necesita coincidir con el caso de su archivo real para que funcione en el dispositivo. Funcionará de cualquier manera en el simulador, así que no se deje engañar por este arenque falso!

Finalmente, no necesita poner sus recursos en la subcarpeta "Recursos" dentro del paquete. Parece que puede usar un diseño arbitrario, pero puede haber implicaciones de rendimiento desconocidas.

 25
Author: Hari Karam Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-02 14:49:50

Así es como hice que esto funcionara: En XCode cree un nuevo paquete de archivo | Recurso | Configuración. Luego, en el Finder, seleccione ese paquete y elija Mostrar contenido del paquete, y agregue los archivos de imagen que desee.

Luego en el código de referencia una imagen de esta manera:

NSString *imgName = @"bundlename.bundle/my-image.png";
UIImage *myImage = [UIImage imageNamed:imgName]; 
 10
Author: LandedGently,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-10 05:17:36

Mis notas sobre la agrupación y lectura de archivos en un proyecto XCode

Pasos:

  1. Crear una prueba.txt y agregue el texto "testing testing️" a él y luego póngalo en una carpeta llamada test.paquete
  2. Arrastrar y soltar junto a su .archivo de aplicación en xcode (copy)
  3. print(Bundle.main.resourcePath!+"/temp.bundle/test.txt") Salida: /Users/James/Library/Developer/Xcode/DerivedData/GitSyncMac-heiwpdjbtaxzhiclikjotucjguqu/Build/Products/Debug/GitSyncMacApp.app / Contents / Resources / temp.bundle/prueba.txt

Ejemplo:

print(content(Bundle.main.resourcePath!+"/temp.bundle/test.txt"))// testing✌️
static func content(_ path:String)->String?{
    do {
        let content = try String(contentsOfFile:path, encoding:String.Encoding.utf8) as String//encoding: NSUTF8StringEncoding
        return content
    } catch {
        return nil
    }
}
 0
Author: eonist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-31 20:41:12