この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは。モバイルアプリサービス部の平屋です。
前回の記事「[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にアップロードしたファイルの格納先