Scaricare file con Cloud Storage per Unity

Cloud Storage for Firebase permette di scaricare in modo facile e veloce file da un Cloud Storage di un bucket fornito e gestito da Firebase.

Creazione di un riferimento

Per scaricare un file, devi prima crea un riferimento Cloud Storage al file che vuoi scaricare.

Puoi creare un riferimento aggiungendo percorsi figlio alla radice del file Cloud Storage bucket oppure puoi creare un riferimento da un bucket esistente URL gs:// o https:// che fa riferimento a un oggetto in 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");

Scarica file

Una volta ottenuto un riferimento, puoi scaricare i file da Cloud Storage in quattro modi:

  1. Scaricare da un URL
  2. Scaricare in un array di byte
  3. Download con stream
  4. Scarica in un file locale

Il metodo che utilizzerai per recuperare i file dipende da come vuoi utilizzare i dati nel tuo gioco.

Scaricare da un URL

Se vuoi utilizzare un URL con WWW o UnityWebRequest di Unity puoi: ottieni l'URL di download di un file chiamando GetDownloadUrlAsync().

// 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.
    }
});

Scarica in un array di byte

Puoi scaricare il file in un buffer di byte in memoria utilizzando il metodo GetBytesAsync(). Con questo metodo l'intero contenuto del file verrà caricato in memoria. Se richiedi un file più grande della memoria disponibile dell'app, l'app avrà un arresto anomalo. Per evitare problemi di memoria, assicurati di impostare una dimensione massima su un valore qualsiasi sai che la tua app è in grado di gestire o utilizza un altro metodo di download.

// 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!");
    }
});

Download tramite stream

Se scarichi il file con uno stream, puoi elaborare i dati man mano che vengono caricati. Questo ti offre la massima flessibilità per quanto riguarda i download. Chiama GetStreamAsync() e passa il tuo processore di streaming come primo argomento. Questo delegato verrà chiamato su un thread in background con uno stream che consente di eseguire operazioni o calcoli che richiedono molta latenza, per archiviare i contenuti su 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() accetta un argomento facoltativo dopo l'elaborazione dello stream che consente di annullare l'operazione o ricevere una notifica sull'avanzamento.

Scarica in un file locale

Il metodo GetFileAsync() scarica un file direttamente su un dispositivo locale. Da utilizzare se gli utenti vogliono avere accesso al file quando sono offline o condividerlo in un un'altra 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.");
    }
});

Puoi associare gli ascoltatori ai download per monitorare l'avanzamento del download. L'ascoltatore segue l'interfaccia System.IProgress<T> standard. Puoi utilizzare un'istanza della classe StorageProgress per fornire il tuo Action<T> come callback per gli indicatori di avanzamento.

// 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.");
    }
});

Gestire gli errori

Esistono diversi motivi per cui potrebbero verificarsi errori durante il download, ad esempio il file non esiste o l'utente non ha l'autorizzazione per accedere al file desiderato. Per ulteriori informazioni sugli errori, consulta il Gestire gli errori sezione dei documenti.

Passaggi successivi

Puoi anche ottenere e aggiornare i metadati per i file archiviati in Cloud Storage.