Descarga archivos con Cloud Storage para Unity

Cloud Storage para Firebase te permite descargar archivos con rapidez y facilidad desde un bucket de Cloud Storage proporcionado y administrado por Firebase.

Crea una referencia

Para descargar un archivo, primero crea una referencia de Cloud Storage al archivo que deseas descargar.

Para ello, puedes anexar rutas de acceso secundarias a la raíz de tu bucket de Cloud Storage o puedes crear una referencia a partir de una URL gs:// o https:// existente que haga referencia a un objeto en Cloud Storage.

// Create a reference with an initial file path and name
StorageReference pathReference =
    storage.GetReference("images/stars.jpg");

// Create a reference from a Google Cloud Storage URI
StorageReference gsReference =
    storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
StorageReference httpsReference =
    storage.GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

Descarga archivos

Una vez que tengas una referencia, puedes descargar archivos de Cloud Storage de cuatro maneras diferentes:

  1. Descarga desde una URL
  2. Descarga a un arreglo de bytes
  3. Descarga con una trasmisión continua
  4. Descarga en un archivo local

El método que uses para recuperar los archivos dependerá de cómo quieras usar los datos en tu juego.

Descarga desde una URL

Si quieres usar una URL con las clases WWW o UnityWebRequest de Unity, puedes llamar a GetDownloadUrlAsync() para obtener una URL de descarga de un archivo.

// Fetch the download URL
reference.GetDownloadUrlAsync().ContinueWithOnMainThread(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("Download URL: " + task.Result);
        // ... now download the file via WWW or UnityWebRequest.
    }
});

Descarga a un arreglo de bytes

Puedes descargar el archivo en un búfer de bytes en la memoria mediante el método GetBytesAsync(). Este método carga todo el contenido del archivo en la memoria. Si solicitas la descarga de un archivo más grande que la memoria disponible de tu app, esta fallará. Para brindar protección contra problemas de memoria, asegúrate de configurar el tamaño máximo en un valor que sepas que puede controlar la aplicación, o usa otro método de descarga.

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const long maxAllowedSize = 1 * 1024 * 1024;
reference.GetBytesAsync(maxAllowedSize).ContinueWithOnMainThread(task => {
    if (task.IsFaulted || task.IsCanceled) {
        Debug.LogException(task.Exception);
        // Uh-oh, an error occurred!
    }
    else {
        byte[] fileContents = task.Result;
        Debug.Log("Finished downloading!");
    }
});

Descarga mediante una transmisión continua

Si descargas el archivo mediante una transmisión continua, podrás procesar los datos a medida que se cargan. Esto te permite manejar la descarga con la máxima flexibilidad posible. Llama a GetStreamAsync() y pásale tu propio procesador de transmisión como primer argumento. El llamado a este delegado se realizará en un subproceso en segundo plano con una transmisión, lo cual te permite realizar operaciones con alta exigencia en términos de latencia o cálculos como almacenar el contenido en el disco.

// Download via a Stream
reference.GetStreamAsync(stream => {
    // Do something with the stream here.
    //
    // This code runs on a background thread which reduces the impact
    // to your framerate.
    //
    // If you want to do something on the main thread, you can do that in the
    // progress eventhandler (second argument) or ContinueWith to execute it
    // at task completion.
}, null, CancellationToken.None);

GetStreamAsync() acepta un argumento opcional después del procesador de transmisión que te permite cancelar la operación o recibir notificaciones del progreso.

Descarga en un archivo local

El método GetFileAsync() permite descargar un archivo directamente en un dispositivo local. Úsalo si tus usuarios quieren tener acceso al archivo sin conexión o compartirlo en otra app.

// Create local filesystem URL
string localUrl = "file:///local/images/island.jpg";

// Download to the local filesystem
reference.GetFileAsync(localUrl).ContinueWithOnMainThread(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("File downloaded.");
    }
});

Puedes vincular objetos de escucha a las descargas para supervisar su progreso. El objeto de escucha sigue la interfaz estándar System.IProgress<T>. Puedes usar una instancia de la clase StorageProgress a fin de proporcionar tu propia Action<T> como devolución de llamada para las marcas de progreso.

// Create local filesystem URL
string localUrl = "file:///local/images/island.jpg";

// Start downloading a file
Task task = reference.GetFileAsync(localFile,
    new StorageProgress<DownloadState>(state => {
        // called periodically during the download
        Debug.Log(String.Format(
            "Progress: {0} of {1} bytes transferred.",
            state.BytesTransferred,
            state.TotalByteCount
        ));
    }), CancellationToken.None);

task.ContinueWithOnMainThread(resultTask => {
    if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
        Debug.Log("Download finished.");
    }
});

Soluciona errores

Existen varios motivos por los cuales se pueden producir errores en una descarga: por ejemplo, es posible que el archivo no exista o que el usuario no tenga permiso para acceder al archivo deseado. Para obtener más información sobre los errores, consulta la sección de los documentos denominada Soluciona errores.

Pasos siguientes

También puedes obtener y actualizar metadatos para los archivos almacenados en Cloud Storage.