[iOS] Firebase Storage上のファイルをダウンロードする

2017.05.09

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

前回の記事「[iOS] iOSアプリからFirebase Storageにファイルをアップロードする」に引き続き、Firebase Storageの使用方法を紹介します。

本記事では、iOSアプリでFirebase Storage上のファイルをダウンロードする方法を紹介します。

iOSアプリでFirebase Storageを使用開始するための以下の作業については、前回の記事で解説していますので、あわせてご覧ください。

  • 事前準備
    • Firebase のプロジェクトとInfo.plistを作成する
    • SDKを追加する
    • Storageのルールを変更する
  • 実装
    • FIRApp共有インスタンスを設定する

検証環境

  • macOS Sierra Version 10.12.4
  • Xcode Version 8.3.2

目次

  • FIRStorageReferenceオブジェクトを作成する
  • メモリにダウンロードする
  • ファイルにダウンロードする
  • ダウンロードURLを取得する
  • ダウンロードを管理する

FIRStorageReferenceオブジェクトを作成する

さっそく実装を紹介していきます。

ファイルをアップロードする場合と同様に、まずはファイルへの参照を持つFIRStorageReferenceオブジェクトを作成します。

このオブジェクトはFirebase Storage内のファイルへのポインタのようなものです。

// FIRStorageReferenceを作成
let storage = FIRStorage.storage()
let storageRef = storage.reference(forURL: "gs://<your-firebase-storage-bucket>")
let imageRef = storageRef.child("image.jpg")

メモリにダウンロードする

ファイルをメモリにダウンロードするには、FIRStorageReferenceの、data(withMaxSize:completion:)メソッドを使用します。

1つめの引数には、アプリで処理可能なメモリのサイズを指定します。大きなサイズのファイルは「ファイルにダウンロードする」で解説する方法でダウンロードしたほうがよいでしょう。

ダウンロードが完了すると、2つめの引数で指定するクロージャの引数からDataオブジェクトを取得できます。

// 1MB (1 * 1024 * 1024 bytes) を指定してメモリにダウンロード
imageRef.data(withMaxSize: 1 * 1024 * 1024) { data, error in
    if (error != nil) {
        print("Uh-oh, an error occurred!")
    } else {
        print("download success!!")
        self.imageView.image = UIImage(data: data!)
    }
}

ファイルにダウンロードする

ファイルにダウンロードするには、FIRStorageReferenceの、write(toFile:completion:)メソッド(またはwrite(toFile:)メソッド)を使用します。

1つめの引数にダウンロード先のURLを指定してダウンロードを実行します。

// ダウンロード先のURLを作成
let localURL: URL! = URL(fileURLWithPath: "\(NSTemporaryDirectory())image.jpg")

// ダウンロードを実行
imageRef.write(toFile: localURL) { url, error in
    if (error != nil) {
        print("Uh-oh, an error occurred!")
    } else {
        print("download success!!")
    }
}

ダウンロードURLを取得する

ファイルダウンロード用のURLの取得だけを行いたい場合は、FIRStorageReferenceの、downloadURL(completion:)メソッドを使用します。

imageRef.downloadURL { url, error in
    if (error != nil) {
        print("Uh-oh, an error occurred!")
    } else {
        print("download success!! URL:", url!)
    }
}

ダウンロードを管理する

「メモリにダウンロードする」と「ファイルにダウンロードする」で紹介した以下のメソッドはFIRStorageDownloadTaskオブジェクトを返します。

  • data(withMaxSize:completion:)
  • write(toFile:completion:)
  • write(toFile:)

FIRStorageDownloadTaskオブジェクトの機能を使用すれば、ダウンロードを一時停止させたり、プログレスを取得したりすることができます。

// FIRStorageDownloadTaskを取得する
let downloadTask = imageRef.data(withMaxSize: 1 * 1024 * 1024) { data, error in
    // ...
}

// ダウンロードを一時停止する
downloadTask.pause()

// ダウンロードを再開する
downloadTask.resume()

// ダウンロードをキャンセルする
downloadTask.cancel()

// プログレスを取得する
downloadTask.observe(.progress) { snapshot in
    let completed = Double((snapshot.progress?.completedUnitCount)!)
    let total = Double((snapshot.progress?.totalUnitCount)!)
    let percentComplete = 100.0 * completed / total
    print("download progress:", percentComplete, "%")
}

さいごに

本記事では、iOSアプリでFirebase Storage上のファイルをダウンロードする方法を紹介しました。

ファイルアップロードの場合と同様に、簡単な実装だけでファイルダウンロード処理を実装できます。

なお、アップロード済みのファイル一覧を取得する機能はFirebase Storageに用意されていません。ファイル一覧の管理は、以下のような方法で実現できるようです。

参考資料