Hola a todos, soy Vanya, desarrollador de iOS. En este artículo, hablaré sobre cómo crear plantillas de proyecto Xcode y cómo ayudaron a ahorrar tiempo al comienzo del proyecto.

Ahora los desarrolladores de iOS tienen muchas herramientas para automatizar las acciones de rutina. En Surf usamos Generamba, Fastlane, SwiftGen, SwiftLint, Jenkins. Y constantemente buscando formas de automatizar otra cosa. Y si antes pasábamos 1-2 días en la inicialización de un nuevo proyecto, ahora no lleva más de 4 horas.
¿Qué necesitas para comenzar a desarrollar un proyecto grande?
1. Crear un repositorio.
- Configurar derechos de acceso;
- Configurar notificaciones en los desarrolladores de chat.
2. Crear un proyecto.
- Crear una estructura de carpetas;
- Agregue varios archivos auxiliares como todas sus extensiones favoritas;
- Configurar CI / CD;
- Agregue varios linter y generadores (Generamba / SwiftLint / SwiftGen);
- Apriete la adicción;
- ...
Después de 1-2 días de trabajo, puede comenzar el desarrollo completo.
Obviamente, la mayoría de estos pasos se pueden automatizar. De las posibles opciones disponibles fueron:
- XcodeGen;
- Plantillas de proyectos Xcode;
- Proyecto básico de Xcode.
Xcodegen
+ Le permite generar .xcodeproj sobre la marcha utilizando el archivo de configuración, que agrega la capacidad de eliminar conflictos en el archivo del proyecto.
- Se utiliza junto con otros scripts, ya que funciona solo con el archivo del proyecto, sin afectar el resto de los archivos.
Plantillas de proyectos Xcode
+ Puede generar .xcodeproj con todas las configuraciones, así como cualquier otro archivo adicional.
- No hay documentación oficial completa ni descripción de las plantillas en xml.
Proyecto básico de Xcode
+ Configuración rápida e inmediata con todos los archivos y dependencias necesarios.
- Remodelación para un proyecto específico durante mucho tiempo. Y accidentalmente puedes saltarte un paso y dispararte en el pie.
Como resultado, nos decidimos por el uso de proyectos Xcode, esto nos permitió optimizar el proceso y reducir el tiempo para crear un proyecto. El proyecto básico de Xcode parecía una muleta, y no necesitamos la flexibilidad que brindan los scripts personalizados.
Plantillas de proyectos Xcode
Como escribí anteriormente, usando plantillas Xcode puedes crear proyectos iOS / macOS / tvOS / watchOS / multiplataforma y agregar cualquier archivo y configuración. El problema es que Apple no proporciona ninguna documentación para esto. Todo eso es un par de pequeños tutoriales y ejemplos de diferentes entusiastas. Utilicé
este wiki.Lo que está fuera de la cajaLas plantillas de aplicación IOS están aquí:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates/Project Templates/iOS/
y para aplicaciones MacOS aquí:
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/Project Templates/Mac/
Las plantillas de proyecto están representadas por archivos .plist ordinarios. Así es como se ve la conocida aplicación de vista única.

Cada plantilla tiene un nombre único: "Identificador", las plantillas de Apple tienen el prefijo com.apple.dt.unit.
Los antepasados son los padres de la plantilla actual. Las plantillas admiten herencia múltiple, es decir, la aplicación de vista única hereda las propiedades de la aplicación Storyboard y la aplicación Core Data Cocoa Touch.
Así es como se ve la jerarquía de aplicaciones de vista única.
Crea tu propia plantillaLas plantillas personalizadas se agregan mejor a la biblioteca local ~ / Library / Developer / Xcode / Templates, por lo que no las perderemos al actualizar Xcode. Si no existe dicho directorio, créelo.
He preparado una pequeña plantilla que se agregará a nuestro Podfile de proyecto con dependencias predefinidas.
Código de plantilla preparado <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Kind</key> <string>Xcode.Xcode3.ProjectTemplateUnitKind</string> <key>Identifier</key> <string>ru.surfstudio.dt.unit.customTemplate</string> <key>Ancestors</key> <array> <string>com.apple.dt.unit.singleViewApplication</string> </array> <key>Concrete</key> <true/> <key>Description</key> <string></string> <key>Definitions</key> <dict> <key>../Podfile</key> <string>platform :ios, '11.0' pod 'Alamofire' pod 'Crashlytics' pod 'Fabric' </string> </dict> <key>Nodes</key> <array> <string>../Podfile</string> </array> </dict> </plist>
Aquí creamos la sección Definiciones, que contendrá variables y archivos que se pueden agregar al proyecto. Allí y agregó la clave Podfile. La clave indica el archivo que estamos creando o editando. Después de la clave, configure la línea que se escribirá en este archivo. En lugar de escribir líneas manualmente, nos referimos a los archivos del directorio con la plantilla y los tomamos desde allí.
Ahora tome este código y póngalo en un archivo llamado TemplateInfo.plist en la carpeta CustomTemplate.xctemplate del directorio de plantillas.
Veamos que tenemos. Si todo salió según lo planeado, al crear un proyecto en Xcode (Archivo-> Nuevo-> Proyecto (⇧⌘N)), veremos una nueva sección de Plantillas y en ella nuestra nueva plantilla "CustomTemplate".

Lo seleccionamos y creamos un proyecto. Después de la creación, se agregará Prodfile, según sea necesario.
Bombeamos sobre la plantillaAgreguemos la generación Léame para nuestro proyecto. Ahora intentemos agregarlo inmediatamente con un archivo, y no describirlo dentro de la plantilla.
Entonces, agregue el archivo README.md dentro de nuestro CustomTemplate.xctemplate y ahí está:
# ___PROJECTNAME___ Description of my project
Para que nuestra plantilla pueda agregar un archivo a la sección de Nodos, debe agregar:
<string>../README.md</string>
Además, dentro de la sección Definiciones, agregue:
<key>../README.md</key> <dict> <key>Path</key> <string>README.md</string> </dict>
El código de plantilla completo ahora se ve así <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Kind</key> <string>Xcode.Xcode3.ProjectTemplateUnitKind</string> <key>Identifier</key> <string>ru.surfstudio.dt.unit.customTemplate</string> <key>Ancestors</key> <array> <string>com.apple.dt.unit.singleViewApplication</string> </array> <key>Concrete</key> <true/> <key>Description</key> <string></string> <key>Definitions</key> <dict> <key>../Podfile</key> <string> platform :ios, '11.0' pod 'Alamofire' pod 'Crashlytics' pod 'Fabric' </string> <key>../README.md</key> <dict> <key>Path</key> <string>README.md</string> </dict> </dict> <key>Nodes</key> <array> <string>../Podfile</string> <string>../README.md</string> </array> </dict> </plist>
Veamos qué salió de eso.
Intentemos nuevamente crear un proyecto usando nuestro CustomTemplate, y al final veremos que Readme ha sido agregado al proyecto:

Las personas atentas notaron que en README.md agregamos ___PROJECTNAME___ al encabezado, y no "MyNewProject". ___PROJECTNAME___, esta es una constante predefinida que puede usar para sus necesidades.
Por ejemplo, para generar un encabezado para un archivo con código, como suele hacer Xcode para nosotros, use la siguiente plantilla:
// // ___FILENAME___ // ___PACKAGENAME___ // // Created by ___FULLUSERNAME___ on ___DATE___. //___COPYRIGHT___ //
Más información sobre las constantes disponibles está
aquí .
Conclusión
Hoy aprendimos a crear plantillas de proyectos simples. Ahora tenemos una plantilla que puede agregar archivos Podfile y README a nuestro proyecto.
Si desea seguir nuestros pasos y reducir el tiempo para crear un proyecto, le recomiendo:
1. Elija la solución correcta.
Además de las plantillas de Xcode, hay otras: XcodeGen o el proyecto base. En cualquier caso, antes de elegir una herramienta, estudie los pros y los contras y elija la correcta.
2. Describa en detalle los pasos necesarios para crear un proyecto típico. Los proyectos no se inician con mucha frecuencia, por lo que puede olvidar algunos pasos.
3. Intente automatizar los pasos desde el punto 2.
Por ejemplo, algunos de ellos deben transferirse a la plantilla de Xcode y otros a los scripts que se invocarán después de la creación del proyecto.
Información útil: un
artículo de revisión sobre plantillas y
muelles sobre plantillas