[iOS] Firebase Storage上のファイルをダウンロードする
はじめに
こんにちは。モバイルアプリサービス部の平屋です。
前回の記事「[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に用意されていません。ファイル一覧の管理は、以下のような方法で実現できるようです。
- ファイルの情報(URLなど)をFirebase Realtime Databaseなどに保存する
- Google Cloud StorageのAPIを使用する
- Google Cloud Storage: Firebase Storageにアップロードしたファイルの格納先