Cloud Storage for Firebase を使用すると、Firebase によって提供、管理される Cloud Storage バケットからファイルを迅速かつ容易にダウンロードできます。
参照を作成する
ファイルをダウンロードするには、まずダウンロードするファイルへの Cloud Storage 参照を作成します。
参照は、Cloud Storage バケットのルートに子パスを付加して作成することも、Cloud Storage のオブジェクトを参照する既存の gs://
または https://
URL から作成することもできます。
Swift
// Create a reference with an initial file path and name let pathReference = storage.reference(withPath: "images/stars.jpg") // Create a reference from a Google Cloud Storage URI let gsReference = storage.reference(forURL: "gs://<your-firebase-storage-bucket>/images/stars.jpg") // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! let httpsReference = storage.reference(forURL: "https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg")
Objective-C
// Create a reference with an initial file path and name FIRStorageReference *pathReference = [storage referenceWithPath:@"images/stars.jpg"]; // Create a reference from a Google Cloud Storage URI FIRStorageReference *gsReference = [storage referenceForURL:@"gs://<your-firebase-storage-bucket>/images/stars.jpg"]; // Create a reference from an HTTPS URL // Note that in the URL, characters are URL escaped! FIRStorageReference *httpsReference = [storage referenceForURL:@"https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg"];
ファイルをダウンロードする
参照を作成したら、次の 3 つの方法でファイルを Cloud Storage からダウンロードできます。
- メモリ内の
NSData
にダウンロードする - デバイス上のファイルを表す
NSURL
にダウンロードする - オンラインのファイルを表す
NSURL
を生成する
メモリにダウンロードする
dataWithMaxSize:completion:
メソッドを使用して、メモリ内の NSData
オブジェクトにファイルをダウンロードします。これは最も簡単にファイルをダウンロードできる方法ですが、ファイルのコンテンツ全体をメモリ内に読み込む必要があります。アプリで使用できるメモリよりも大きなファイルをリクエストすると、アプリがクラッシュします。メモリの問題が発生しないように、アプリで処理できる範囲内で最大サイズを設定するか、別のダウンロード方法を使用してください。
Swift
// Create a reference to the file you want to download let islandRef = storageRef.child("images/island.jpg") // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) islandRef.getData(maxSize: 1 * 1024 * 1024) { data, error in if let error = error { // Uh-oh, an error occurred! } else { // Data for "images/island.jpg" is returned let image = UIImage(data: data!) } }
Objective-C
// Create a reference to the file you want to download FIRStorageReference *islandRef = [storageRef child:@"images/island.jpg"]; // Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes) [islandRef dataWithMaxSize:1 * 1024 * 1024 completion:^(NSData *data, NSError *error){ if (error != nil) { // Uh-oh, an error occurred! } else { // Data for "images/island.jpg" is returned UIImage *islandImage = [UIImage imageWithData:data]; } }];
ローカル ファイルにダウンロードする
writeToFile:completion:
メソッドは、ファイルをローカル デバイスに直接ダウンロードします。ユーザーがオフライン中にファイルにアクセスしたい場合や、別のアプリでファイルを共有したい場合は、このメソッドを使用します。writeToFile:completion:
から返される FIRStorageDownloadTask
を使用して、ダウンロードの管理とアップロード ステータスのモニタリングを行うことができます。
Swift
// Create a reference to the file you want to download let islandRef = storageRef.child("images/island.jpg") // Create local filesystem URL let localURL = URL(string: "path/to/image")! // Download to the local filesystem let downloadTask = islandRef.write(toFile: localURL) { url, error in if let error = error { // Uh-oh, an error occurred! } else { // Local file URL for "images/island.jpg" is returned } }
Objective-C
// Create a reference to the file you want to download FIRStorageReference *islandRef = [storageRef child:@"images/island.jpg"]; // Create local filesystem URL NSURL *localURL = [NSURL URLWithString:@"path/to/image"]; // Download to the local filesystem FIRStorageDownloadTask *downloadTask = [islandRef writeToFile:localURL completion:^(NSURL *URL, NSError *error){ if (error != nil) { // Uh-oh, an error occurred! } else { // Local file URL for "images/island.jpg" is returned } }];
ダウンロードを積極的に管理したい場合は、完了ハンドラの代わりに writeToFile:
メソッドを使用してダウンロード タスクをモニタリングできます。詳しくは、ダウンロードの管理をご覧ください。
ダウンロード URL を生成する
URL をベースにしたダウンロード インフラストラクチャがすでにある場合や、単に URL を共有したい場合は、Cloud Storage 参照に対して downloadURLWithCompletion:
メソッドを呼び出してファイルのダウンロード URL を取得できます。
Swift
// Create a reference to the file you want to download let starsRef = storageRef.child("images/stars.jpg") // Fetch the download URL starsRef.downloadURL { url, error in if let error = error { // Handle any errors } else { // Get the download URL for 'images/stars.jpg' } }
Objective-C
// Create a reference to the file you want to download FIRStorageReference *starsRef = [storageRef child:@"images/stars.jpg"]; // Fetch the download URL [starsRef downloadURLWithCompletion:^(NSURL *URL, NSError *error){ if (error != nil) { // Handle any errors } else { // Get the download URL for 'images/stars.jpg' } }];
FirebaseUI によって画像をダウンロードする
FirebaseUI にはシンプルかつカスタマイズ可能で本番環境に対応したネイティブのモバイル バインドが用意されているため、ボイラープレート コードをなくし、Google のベスト プラクティスの採用を促進できます。FirebaseUI では、統合された SDWebImage を使用して、Cloud Storage からすばやく簡単に画像をダウンロード、キャッシュに保存、表示できます。
最初に FirebaseUI を Podfile
に追加します。
pod 'FirebaseStorageUI'
次に、Cloud Storage から UIImageView
へ直接、画像を読み込みます。
Swift
// Reference to an image file in Firebase Storage let reference = storageRef.child("images/stars.jpg") // UIImageView in your ViewController let imageView: UIImageView = self.imageView // Placeholder image let placeholderImage = UIImage(named: "placeholder.jpg") // Load the image using SDWebImage imageView.sd_setImage(with: reference, placeholderImage: placeholderImage)
Objective-C
// Reference to an image file in Firebase Storage FIRStorageReference *reference = [storageRef child:@"images/stars.jpg"]; // UIImageView in your ViewController UIImageView *imageView = self.imageView; // Placeholder image UIImage *placeholderImage; // Load the image using SDWebImage [imageView sd_setImageWithStorageReference:reference placeholderImage:placeholderImage];
ダウンロードを管理する
ダウンロードを開始するだけでなく、pause
、resume
、cancel
メソッドを使用してダウンロードを一時停止、再開、キャンセルできます。これらのメソッドにより発生する pause
、resume
、cancel
イベントをモニタリングできます。
Swift
// Start downloading a file let downloadTask = storageRef.child("images/mountains.jpg").write(toFile: localFile) // Pause the download downloadTask.pause() // Resume the download downloadTask.resume() // Cancel the download downloadTask.cancel()
Objective-C
// Start downloading a file FIRStorageDownloadTask *downloadTask = [[storageRef child:@"images/mountains.jpg"] writeToFile:localFile]; // Pause the download [downloadTask pause]; // Resume the download [downloadTask resume]; // Cancel the download [downloadTask cancel];
ダウンロードの進捗状況を監視する
オブザーバーを FIRStorageDownloadTask
に追加して、ダウンロードの進捗状況をモニタリングできます。オブザーバーを追加すると、オブザーバーを削除するために使用できる FIRStorageHandle
が返されます。
Swift
// Add a progress observer to a download task let observer = downloadTask.observe(.progress) { snapshot in // A progress event occurred }
Objective-C
// Add a progress observer to a download task FIRStorageHandle observer = [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // A progress event occurred }];
オブザーバーは FIRStorageTaskStatus
イベントに登録できます。
「FIRStorageTaskStatus」イベント | 一般的な使用方法 |
---|---|
FIRStorageTaskStatusResume |
タスクの開始時またはダウンロードの再開時に発生し、多くの場合 FIRStorageTaskStatusPause イベントと併せて使用されます。 |
FIRStorageTaskStatusProgress |
データが Cloud Storage からダウンロードされると発生し、ダウンロードの進捗インジケーターを埋め込むために使用できます。 |
FIRStorageTaskStatusPause |
ダウンロードが一時停止されると発生し、多くの場合 FIRStorageTaskStatusResume イベントと併せて使用されます。 |
FIRStorageTaskStatusSuccess |
ダウンロードが正常に完了したときに発生します。 |
FIRStorageTaskStatusFailure |
ダウンロードが失敗したときに発生します。エラーを調べて失敗した理由を判断します。 |
イベントが発生すると、FIRStorageTaskSnapshot
オブジェクトが返されます。このスナップショットは、イベントが発生したときのタスクの不変的なビューです。このオブジェクトには次のプロパティが含まれています。
プロパティ | 型 | 説明 |
---|---|---|
progress |
NSProgress |
ダウンロードの進捗状況を含む NSProgress オブジェクトです。 |
error |
NSError |
ダウンロード中に発生したエラーです(エラーが存在する場合)。 |
metadata |
FIRStorageMetadata |
ダウンロードの nil です。 |
task |
FIRStorageDownloadTask |
スナップショットのタスクです。これを使用してタスクを管理(pause 、resume 、cancel )できます。 |
reference |
FIRStorageReference |
このタスクの参照元です。 |
オブザーバーは個別またはステータスごとに削除したり、すべてまとめて削除したりすることもできます。
Swift
// Create a task listener handle let observer = downloadTask.observe(.progress) { snapshot in // A progress event occurred } // Remove an individual observer downloadTask.removeObserver(withHandle: observer) // Remove all observers of a particular status downloadTask.removeAllObservers(for: .progress) // Remove all observers downloadTask.removeAllObservers()
Objective-C
// Create a task listener handle FIRStorageHandle observer = [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // A progress event occurred }]; // Remove an individual observer [downloadTask removeObserverWithHandle:observer]; // Remove all observers of a particular status [downloadTask removeAllObserversForStatus:FIRStorageTaskStatusProgress]; // Remove all observers [downloadTask removeAllObservers];
メモリリークを防ぐため、FIRStorageTaskStatusSuccess
または FIRStorageTaskStatusFailure
の発生後にすべてのオブザーバーが削除されます。
エラーを処理する
ダウンロード時にエラーが発生する理由としては、ファイルが存在しない、目的のファイルへのアクセス権がないなど、多くの理由が考えられます。エラーの詳細については、このドキュメントのエラーを処理するのセクションをご覧ください。
例
ローカル ファイルへのダウンロードとエラー処理の完全な例を以下に示します。
Swift
// Create a reference to the file we want to download let starsRef = storageRef.child("images/stars.jpg") // Start the download (in this case writing to a file) let downloadTask = storageRef.write(toFile: localURL) // Observe changes in status downloadTask.observe(.resume) { snapshot in // Download resumed, also fires when the download starts } downloadTask.observe(.pause) { snapshot in // Download paused } downloadTask.observe(.progress) { snapshot in // Download reported progress let percentComplete = 100.0 * Double(snapshot.progress!.completedUnitCount) / Double(snapshot.progress!.totalUnitCount) } downloadTask.observe(.success) { snapshot in // Download completed successfully } // Errors only occur in the "Failure" case downloadTask.observe(.failure) { snapshot in guard let errorCode = (snapshot.error as? NSError)?.code else { return } guard let error = StorageErrorCode(rawValue: errorCode) else { return } switch (error) { case .objectNotFound: // File doesn't exist break case .unauthorized: // User doesn't have permission to access file break case .cancelled: // User cancelled the download break /* ... */ case .unknown: // Unknown error occurred, inspect the server response break default: // Another error occurred. This is a good place to retry the download. break } }
Objective-C
// Create a reference to the file we want to download FIRStorageReference *starsRef = [storageRef child:@"images/stars.jpg"]; // Start the download (in this case writing to a file) FIRStorageDownloadTask *downloadTask = [storageRef writeToFile:localURL]; // Observe changes in status [downloadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) { // Download resumed, also fires when the download starts }]; [downloadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) { // Download paused }]; [downloadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) { // Download reported progress double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount); }]; [downloadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) { // Download completed successfully }]; // Errors only occur in the "Failure" case [downloadTask observeStatus:FIRStorageTaskStatusFailure handler:^(FIRStorageTaskSnapshot *snapshot) { if (snapshot.error != nil) { switch (snapshot.error.code) { case FIRStorageErrorCodeObjectNotFound: // File doesn't exist break; case FIRStorageErrorCodeUnauthorized: // User doesn't have permission to access file break; case FIRStorageErrorCodeCancelled: // User canceled the upload break; /* ... */ case FIRStorageErrorCodeUnknown: // Unknown error occurred, inspect the server response break; } } }];
Cloud Storage に保存されているファイルのメタデータを取得して更新することもできます。