Acceso al sistema de archivos en Xamarin.iOS

Ejemplo de descarga Descarga del ejemplo

Puede usar Xamarin.iOS y las clases de la biblioteca de clases System.IOSystem.IO para acceder al sistema de archivos iOS. La clase File le permite crear, eliminar y leer archivos, mientras que la clase Directory le permite crear, eliminar o enumerar el contenido de directorios. También puede usar subclases, que pueden proporcionar un mayor grado de control sobre las operaciones de archivo (como la compresión o la búsqueda de posición Stream dentro de un archivo).

iOS impone algunas restricciones sobre lo que una aplicación puede hacer con el sistema de archivos para conservar la seguridad de los datos de una aplicación y para proteger a los usuarios de las aplicaciones más importantes. Estas restricciones forman parte del espacio aislado de la aplicación, un conjunto de reglas que limita el acceso de una aplicación a archivos, preferencias, recursos de red, hardware, etc. Una aplicación se limita a leer y escribir archivos dentro de su directorio principal (ubicación instalada); no puede acceder a los archivos de otra aplicación.

iOS también tiene algunas características específicas del sistema de archivos: algunos directorios requieren un tratamiento especial con respecto a las copias de seguridad y las actualizaciones, y las aplicaciones también pueden compartir archivos entre sí y la aplicación Files (desde iOS 11) y a través de iTunes.

En este artículo se de abordan las características y restricciones del sistema de archivos iOS e incluye una aplicación de ejemplo que muestra cómo usar Xamarin.iOS para ejecutar algunas operaciones sencillas del sistema de archivos:

Un ejemplo de iOS que ejecuta algunas operaciones sencillas del sistema de archivos

Acceso general a archivos

Xamarin.iOS permite usar las clases de .NET System.IO para las operaciones del sistema de archivos en iOS.

Los fragmentos de código siguientes ilustran algunas operaciones de archivo comunes. Los encontrará todos a continuación en el archivo SampleCode.cs, en la aplicación de ejemplo de este artículo.

Trabajar con directorios

Este código enumera los subdirectorios del directorio actual (especificado por el parámetro "./"), que es la ubicación del ejecutable de la aplicación. La salida será una lista de todos los archivos y carpetas que se implementan con la aplicación (que se muestran en la ventana de consola durante la depuración).

var directories = Directory.EnumerateDirectories("./");
foreach (var directory in directories) {
      Console.WriteLine(directory);
}

Lectura de archivos

Para leer un archivo de texto, solo necesita una sola línea de código. En este ejemplo se mostrará el contenido de un archivo de texto en la ventana Salida de la aplicación.

var text = File.ReadAllText("TestData/ReadMe.txt");
Console.WriteLine(text);

serialización XML

Aunque trabajar con el espacio de nombres completo está fuera del ámbito de este artículo, puede deserializar fácilmente un documento XML desde el sistema de archivos mediante un Objeto StreamReader como este fragmento System.Xml de código:

using (TextReader reader = new StreamReader("./TestData/test.xml")) {
      XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
      var xml = (MyObject)serializer.Deserialize(reader);
}

Para obtener más información, vea la documentación de System.Xmly serialización. Consulte la documentación de Xamarin.iOS en el vinculador: a menudo tendrá que agregar el atributo a las clases que pretende serializar.

Creación de archivos y directorios

En este ejemplo se muestra cómo usar la clase para acceder a la carpeta Documents, donde Environment se pueden crear archivos y directorios.

var documents =
 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments); 
var filename = Path.Combine (documents, "Write.txt");
File.WriteAllText(filename, "Write this text into a file");

La creación de un directorio es un proceso similar:

var documents =
 Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var directoryname = Path.Combine (documents, "NewDirectory");
Directory.CreateDirectory(directoryname);

Para obtener más información, consulte la referencia System.IO API .

Serialización de JSON

Json.NET es un marco JSON de alto rendimiento que funciona con Xamarin.iOS y está disponible en NuGet. Agregue el paquete NuGet al proyecto de aplicación mediante Agregar NuGet en Visual Studio para Mac:

Agregar el paquete NuGet al proyecto de aplicaciones

A continuación, agregue una clase para que actúe como modelo de datos para la serialización o deserialización (en este Account.cs caso):

using System;
using System.Collections.Generic;
using Foundation; // for Preserve attribute, which helps serialization with Linking enabled

namespace FileSystem
{
    [Preserve]
    public class Account
    {
        public string Email { get; set; }
        public bool Active { get; set; }
        public DateTime CreatedDate { get; set; }
        public List<string> Roles { get; set; }

        public Account() {
        }
    }
}

Por último, cree una instancia de la clase , deserialice en Account datos JSON y escríbala en un archivo:

// Create a new record
var account = new Account(){
    Email = "monkey@xamarin.com",
    Active = true,
    CreatedDate = new DateTime(2015, 5, 27, 0, 0, 0, DateTimeKind.Utc),
    Roles = new List<string> {"User", "Admin"}
};

// Serialize object
var json = JsonConvert.SerializeObject(account, Newtonsoft.Json.Formatting.Indented);

// Save to file
var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "account.json");
File.WriteAllText(filename, json);

Para más información sobre cómo trabajar con datos JSON en una aplicación .NET, consulte la documentación de Json.NET.

Consideraciones especiales

A pesar de las similitudes entre las operaciones de archivos de Xamarin.iOS y .NET, iOS y Xamarin.iOS difieren de .NET de algunas maneras importantes.

Hacer que los archivos de proyecto se puedan acceder en tiempo de ejecución

De forma predeterminada, si agrega un archivo al proyecto, no se incluirá en el ensamblado final y, por tanto, no estará disponible para la aplicación. Para incluir un archivo en el ensamblado, debe marcarlo con una acción de compilación especial, denominada Contenido.

Para marcar un archivo para su inclusión, haga clic con el botón derecho en los archivos y elija Compilar contenido de acción en Visual Studio para Mac. También puede cambiar la acción de compilación en la hoja Propiedades del archivo.

Distinción entre mayúsculas y minúsculas

Es importante comprender que el sistema de archivos iOS distingue mayúsculas de minúsculas. La diferencia entre mayúsculas y minúsculas significa que los nombres de archivo y directorio deben coincidir exactamente:README.txty readme.txt se considerarían nombres de archivo diferentes.

Esto podría resultar confuso para los desarrolladores de .NET que están más familiarizados con el sistema de archivos de Windows, que no tiene en cuenta mayúsculas de minúsculas: los archivos,losarchivos y los archivos hacen referencia al mismo directorio.

Advertencia

El simulador de iOS NO distingue mayúsculas de minúsculas. Si el nombre de archivo difiere entre el propio archivo y las referencias a él en el código, el código puede seguir funcionando en el simulador, pero se producirá un error en un dispositivo real. Este es uno de los motivos por los que es importante implementar y probar en un dispositivo real de forma temprana y a menudo durante el desarrollo de iOS.

Separador de ruta de acceso

iOS usa la barra diagonal '/' como separador de ruta de acceso (que es diferente de Windows, que usa la barra diagonal inversa '\').

Debido a esta diferencia confusa, es una buena práctica usar el método , que se ajusta para la plataforma actual, en lugar de codificar de forma segura un separador de ruta System.IO.Path.Combine de acceso determinado. Se trata de un paso sencillo que hace que el código sea más portátil para otras plataformas.

Espacio aislado de la aplicación

El acceso de la aplicación al sistema de archivos (y otros recursos, como las características de red y hardware) está limitado por motivos de seguridad. Esta restricción se conoce como espacio aislado de la aplicación. En cuanto al sistema de archivos, la aplicación se limita a crear y eliminar archivos y directorios en su directorio principal.

El directorio principal es una ubicación única en el sistema de archivos donde se almacenan la aplicación y todos sus datos. No puede elegir (ni cambiar) la ubicación del directorio principal de la aplicación; sin embargo, iOS y Xamarin.iOS proporcionan propiedades y métodos para administrar los archivos y directorios dentro de .

El conjunto de aplicaciones

La agrupación de aplicaciones es la carpeta que contiene la aplicación. Se distingue de otras carpetas al agregar el sufijo .app al nombre del directorio. La agrupación de aplicaciones contiene el archivo ejecutable y todo el contenido (archivos, imágenes, etc.). necesario para el proyecto.

Al ir a la agrupación de aplicaciones en Mac OS, aparece con un icono diferente al que se ve en otros directorios (y el sufijo .app está oculto). sin embargo, es solo un directorio normal en el que el sistema operativo se muestra de forma diferente.

Para ver el paquete de aplicaciones para el código de ejemplo, haga clic con el botón derecho en el proyecto en Visual Studio para Mac seleccione Reveal en Finder. A continuación, vaya al directorio bin/, donde debería encontrar un icono de aplicación (similar a la captura de pantalla siguiente).

Navegue por el directorio bin para buscar un icono de aplicación similar a esta captura de pantalla.

Haga clic con el botón derecho en este icono y elija Mostrar contenido del paquete para examinar el contenido del directorio paquete de aplicaciones. El contenido aparece igual que el contenido de un directorio normal, como se muestra aquí:

Contenido de la agrupación de aplicaciones

El paquete de aplicaciones es lo que se instala en el simulador o en el dispositivo durante las pruebas y, en última instancia, es lo que se envía a Apple para su inclusión en el App Store.

Directorios de aplicaciones

Cuando la aplicación se instala en un dispositivo, el sistema operativo crea un directorio principal para la aplicación y crea una serie de directorios dentro del directorio raíz de la aplicación que están disponibles para su uso. A partir de iOS 8, los directorios accesibles para el usuario NO se encuentran dentro de la raíz de la aplicación, por lo que no puede derivar las rutas de acceso para el conjunto de aplicaciones desde los directorios de usuario, o viceversa.

Estos directorios, cómo determinar su ruta de acceso y sus propósitos se enumeran a continuación:

 

Directorio Descripción
[ApplicationName].app/ En iOS 7 y versionesanteriores, este es el directorio donde se almacena el ejecutable de la aplicación. La estructura de directorios que crea en la aplicación existe en este directorio (por ejemplo, imágenes y otros tipos de archivo que ha marcado como Recursos en el proyecto Visual Studio para Mac aplicación).

Si necesita acceder a los archivos de contenido dentro de la agrupación de aplicaciones, la ruta de acceso a este directorio está disponible a través de la NSBundle.MainBundle.BundlePath propiedad .
Documentos/ Use este directorio para almacenar documentos de usuario y archivos de datos de aplicación.

El contenido de este directorio puede estar disponible para el usuario a través del uso compartido de archivos de iTunes (aunque está deshabilitado de forma predeterminada). Agregue una UIFileSharingEnabled clave booleana al archivo Info.plist para permitir que los usuarios accedan a estos archivos.

Incluso si una aplicación no habilita inmediatamente el uso compartido de archivos, debe evitar colocar archivos que se deben ocultar a los usuarios en este directorio (por ejemplo, archivos de base de datos, a menos que tenga previsto compartirlos). Siempre que los archivos confidenciales permanezcan ocultos, estos archivos no se exponen (y iTunes puede mover, modificar o eliminar archivos potencialmente) si el uso compartido de archivos está habilitado en una versión futura.

Puede usar el método Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments) para obtener la ruta de acceso al directorio Documentos de la aplicación.

ITunes hace una copia de seguridad del contenido de este directorio.
Biblioteca/ El directorio Library es un buen lugar para almacenar archivos que el usuario no crea directamente, como bases de datos u otros archivos generados por la aplicación. El contenido de este directorio nunca se expone al usuario a través de iTunes.

Puede crear sus propios subdirectorios en Biblioteca; sin embargo, aquí ya hay algunos directorios creados por el sistema que debe tener en cuenta, incluidas las preferencias y las memorias caché.

ITunes hace una copia de seguridad del contenido de este directorio (excepto el subdirectorio Cachés). Se realizará una copia de seguridad de los directorios personalizados que cree en la biblioteca.
Biblioteca/Preferencias/ Los archivos de preferencia específicos de la aplicación se almacenan en este directorio. No cree estos archivos directamente. En su lugar, use la NSUserDefaults clase .

iTunes hace una copia de seguridad del contenido de este directorio.
Library/Caches/ El directorio Cachés es un buen lugar para almacenar archivos de datos que pueden ayudar a ejecutar la aplicación, pero que se pueden volver a crear fácilmente. La aplicación debe crear y eliminar estos archivos según sea necesario y poder volver a crear estos archivos si es necesario. iOS 5 también puede eliminar estos archivos (en situaciones de almacenamiento bajo), pero no lo hará mientras se ejecuta la aplicación.

iTunes NO hace una copia de seguridad del contenido de este directorio, lo que significa que no estará presente si el usuario restaura un dispositivo y es posible que no esté presente después de instalar una versión actualizada de la aplicación.

Por ejemplo, en caso de que la aplicación no pueda conectarse a la red, puede usar el directorio Cachés para almacenar datos o archivos para proporcionar una buena experiencia sin conexión. La aplicación puede guardar y recuperar estos datos rápidamente mientras espera respuestas de red, pero no es necesario realizar copias de seguridad y se pueden recuperar o volver a crear fácilmente después de una restauración o actualización de la versión.
tmp/ Las aplicaciones pueden almacenar archivos temporales que solo son necesarios durante un breve período en este directorio. Para ahorrar espacio, los archivos deben eliminarse cuando ya no sean necesarios. El sistema operativo también puede eliminar archivos de este directorio cuando una aplicación no se está ejecutando.

ITunes NO hace una copia de seguridad del contenido de este directorio.

Por ejemplo, el directorio tmp podría usarse para almacenar archivos temporales que se descargan para mostrarse al usuario (como avatares de Twitter o datos adjuntos de correo electrónico), pero que podrían eliminarse una vez que se hayan visto (y descargados de nuevo si son necesarios en el futuro).

En esta captura de pantalla se muestra la estructura de directorios en una ventana de Finder:

En esta captura de pantalla se muestra la estructura de directorios en una ventana de Finder.

Acceso a otros directorios mediante programación

Los ejemplos anteriores de archivos y directorios accedieron al Documents directorio. Para escribir en otro directorio, debe construir una ruta de acceso con la sintaxis "..", como se muestra aquí:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var library = Path.Combine (documents, "..", "Library");
var filename = Path.Combine (library, "WriteToLibrary.txt");
File.WriteAllText(filename, "Write this text into a file in Library");

La creación de un directorio es similar:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var library = Path.Combine (documents, "..", "Library");
var directoryname = Path.Combine (library, "NewLibraryDirectory");
Directory.CreateDirectory(directoryname);

Las rutas de acceso a los directorios y Caches se pueden construir de esta tmp forma:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var cache = Path.Combine (documents, "..", "Library", "Caches");
var tmp = Path.Combine (documents, "..", "tmp");

Uso compartido con la aplicación Files

iOS 11 introdujo la aplicación Files, un explorador de archivos para iOS que permite al usuario ver e interactuar con sus archivos en iCloud y también almacenarlo cualquier aplicación que lo admita. Para permitir que el usuario acceda directamente a los archivos de la aplicación, cree una nueva clave booleana en el archivo Info.plist y establa en , como true aquí:

Establecer LSSupportsOpeningDocumentsInPlace en Info.plist

El directorio Documentos de la aplicación ahora estará disponible para examinar en la aplicación Archivos. En la aplicación Archivos, vaya a En mi iPhone y cada aplicación con archivos compartidos estará visible. En las capturas de pantalla siguientes se muestra el aspecto de la aplicación de ejemplo FileSystem:

Aplicación archivos de iOS 11 Examinarmis archivos iPhone archivos deejemplo deaplicación

Uso compartido de archivos con el usuario a través de iTunes

Los usuarios pueden acceder a los archivos del directorio Documentos de la aplicación editando y creando una entrada Aplicación que admita el uso compartido de iTunes ( ) en la vista Origen, como se muestra Info.plistInfo.plistUIFileSharingEnabled aquí: UIFileSharingEnabled

Agregar la aplicación admite la propiedad de uso compartido de iTunes

Se puede acceder a estos archivos en iTunes cuando el dispositivo está conectado y el usuario elige la Apps pestaña. Por ejemplo, en la captura de pantalla siguiente se muestran los archivos de la aplicación seleccionada que se comparten a través de iTunes:

En esta captura de pantalla se muestran los archivos de la aplicación seleccionada que se comparten a través de iTunes.

Los usuarios solo pueden acceder a los elementos de nivel superior de este directorio a través de iTunes. No pueden ver el contenido de ningún subdirectorio (aunque pueden copiarlos en su equipo o eliminarlos). Por ejemplo, con GoodReader, los archivos PDF y EPUB se pueden compartir con la aplicación para que los usuarios puedan leerlos en sus dispositivos iOS.

Los usuarios que modifican el contenido de su carpeta Documentos pueden causar problemas si no tienen cuidado. La aplicación debe tener esto en cuenta y ser resistente a las actualizaciones destructivas de la carpeta Documentos.

El código de ejemplo de este artículo crea un archivo y una carpeta en la carpeta Documentos (en SampleCode.cs)y habilita el uso compartido de archivos en el archivo Info.plist. En esta captura de pantalla se muestra cómo aparecen en iTunes:

En esta captura de pantalla se muestra cómo aparecen los archivos en iTunes

Consulte el artículo Trabajar con imágenes para obtener información sobre cómo establecer iconos para la aplicación y para cualquier tipo de documento personalizado que cree.

Si la clave es falsa o no está presente, el uso compartido de archivos está deshabilitado de forma predeterminada y los usuarios no podrán interactuar UIFileSharingEnabled con el directorio Documentos.

Copia de seguridad y restauración

Cuando iTunes hace una copia de seguridad de un dispositivo, se guardarán todos los directorios creados en el directorio principal de la aplicación, excepto los directorios siguientes:

  • [ApplicationName].app: no escriba en este directorio, ya que está firmado y, por tanto, debe permanecer sin cambios después de la instalación. Puede contener recursos a los que se accede desde el código, pero no requieren copia de seguridad, ya que se restaurarían al volver a descargar la aplicación.
  • Biblioteca/cachés: el directorio de caché está pensado para archivos de trabajo de los que no es necesario realizar una copia de seguridad.
  • tmp: este directorio se usa para los archivos temporales que se crean y eliminan cuando ya no se necesitan, o para los archivos que elimina iOS cuando necesita espacio.

La copia de seguridad de una gran cantidad de datos puede tardar mucho tiempo. Si decide que necesita realizar una copia de seguridad de cualquier documento o dato determinado, la aplicación debe usar las carpetas Documentos y Biblioteca. Para los datos transitorios o los archivos que se pueden recuperar fácilmente de la red, use las memorias caché o el directorio tmp.

Nota:

iOS "limpiará" el sistema de archivos cuando un dispositivo se ejecute de forma críticamente bajo en el espacio en disco. Este proceso quitará todos los archivos de la carpeta Library/Caches y tmp de las aplicaciones que no se están ejecutando actualmente.

Cumplimiento de las restricciones de copia de seguridad de iCloud de iOS 5

Nota:

Aunque esta directiva se introdujo por primera vez con iOS 5 (que parece hace mucho tiempo), la guía sigue siendo pertinente para las aplicaciones de hoy en día.

Apple introdujo la funcionalidad de copia de seguridad de iCloud con iOS 5. Cuando la copia de seguridad de iCloud está habilitada, todos los archivos del directorio principal de la aplicación (excepto los directorios de los que normalmente no se hace una copia de seguridad, por ejemplo, el paquete de aplicaciones, y ) se copian en los servidores Cachestmp de iCloud. Esta característica proporciona al usuario una copia de seguridad completa en caso de pérdida, robo o daño del dispositivo.

Dado que iCloud solo proporciona 5 Gb de espacio libre a cada usuario y para evitar innecesariamente el uso de ancho de banda, Apple espera que las aplicaciones solo realicen copias de seguridad de los datos esenciales generados por el usuario. Para cumplir con las directrices de Storage de datos de iOS, debe limitar la cantidad de datos de los que se hace una copia de seguridad mediante la adhesión a los siguientes elementos:

  • Almacene solo los datos generados por el usuario, o los datos que no se puedan volver a crear de otro modo, en el directorio Documentos (del que se ha hecho una copia de seguridad).
  • Almacene cualquier otro dato que se pueda volver a crear o volver a descargar fácilmente en o (del que no se ha hecho una copia de seguridad y se podría Library/Cachestmp "limpiar").
  • Si tiene archivos que podrían ser adecuados para la carpeta o pero no quiere que se "limpien", almacéne los archivos en otro lugar (por ejemplo, ) y aplique el atributo "no hacer copia de seguridad" para evitar que los archivos utilicen el ancho de banda y el espacio de almacenamiento de Library/CachestmpLibrary/YourData iCloud Backup. Estos datos todavía consumen espacio en el dispositivo, por lo que debe administrarlos cuidadosamente y eliminarlos cuando sea posible.

El atributo "no hacer copia de seguridad" se establece mediante la NSFileManager clase . Asegúrese de que la clase using Foundation es y llame de la siguiente SetSkipBackupAttribute manera:

var documents = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine (documents, "LocalOnly.txt");
File.WriteAllText(filename, "This file will never get backed-up. It would need to be re-created after a restore or re-install");
NSFileManager.SetSkipBackupAttribute (filename, true); // backup will be skipped for this file

Cuando es , no se realizará la copia de seguridad del archivo, independientemente del directorio en el que SetSkipBackupAttributetrue se almacene (incluso el Documents directorio). Puede consultar el atributo mediante el método y puede restablecerlo llamando GetSkipBackupAttribute al método con , de la siguiente SetSkipBackupAttributefalse manera:

NSFileManager.SetSkipBackupAttribute (filename, false); // file will be backed-up

Uso compartido de datos entre aplicaciones iOS y extensiones de aplicación

Dado que las extensiones de aplicación se ejecutan como parte de una aplicación host (en lugar de su aplicación independiente), el uso compartido de datos no se incluye automáticamente, por lo que se requiere trabajo adicional. Los grupos de aplicaciones son el mecanismo que usa iOS para permitir que distintas aplicaciones compartan datos. Si las aplicaciones se han configurado correctamente con los derechos y el aprovisionamiento correctos, pueden acceder a un directorio compartido fuera de su espacio aislado normal de iOS.

Configurar un grupo de aplicaciones

La ubicación compartida se configura mediante un grupo de aplicaciones ,que se configura en la sección Certificates, Identifiers Profiles (Certificados, perfiles de identificadores) en iOS Centro de desarrollo. También se debe hacer referencia a este valor en Entitlements.plistde cada proyecto.

Para obtener información sobre cómo crear y configurar un grupo de aplicaciones, consulte la guía Funcionalidades del grupo de aplicaciones.

Archivos

La aplicación iOS y la extensión también pueden compartir archivos mediante una ruta de acceso de archivo común (dado que se han configurado correctamente con los derechos y el aprovisionamiento correctos):

var FileManager = new NSFileManager ();
var appGroupContainer =FileManager.GetContainerUrl ("group.com.xamarin.WatchSettings");
var appGroupContainerPath = appGroupContainer.Path

Console.WriteLine ("Group Path: " + appGroupContainerPath);

// use the path to create and update files
...

Importante

Si la ruta de acceso de grupo devuelta es , compruebe la configuración de los derechos y el perfil de aprovisionamiento y asegúrese null de que son correctos.

Actualizaciones de la versión de la aplicación

Cuando se descarga una nueva versión de la aplicación, iOS crea un nuevo directorio principal y almacena el nuevo paquete de aplicaciones en él. Después, iOS mueve las siguientes carpetas de la versión anterior del paquete de aplicaciones al nuevo directorio principal:

  • Documentos
  • Library

También se pueden copiar otros directorios y colocarse en el nuevo directorio principal, pero no se garantiza que se copien, por lo que la aplicación no debe basarse en este comportamiento del sistema.

Resumen

En este artículo se ha mostrado que las operaciones del sistema de archivos con Xamarin.iOS son similares a cualquier otra aplicación .NET. También se introdujo el espacio aislado de aplicaciones y se examinaron las implicaciones de seguridad que provoca. A continuación, exploró el concepto de un paquete de aplicaciones. Por último, enumera los directorios especializados disponibles para la aplicación y explica sus roles durante las actualizaciones y copias de seguridad de la aplicación.