iOS でファイルをダウンロードする

Cloud Storage を使用すると、デベロッパーは Firebase によって提供、管理される Google Cloud Storage バケットからファイルを迅速かつ容易にダウンロードできます。

参照を作成する

ファイルをダウンロードするには、まずダウンロードするファイルへの Cloud Storage 参照を作成します。

ストレージ ルートに子パスを付加することによって参照を作成することも、Cloud Storage のオブジェクトを参照する既存の gs:// または https:// URL から参照を作成することもできます。

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"];
  

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")

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

参照を作成したら、次の 3 つの方法でファイルを Cloud Storage からダウンロードすることができます。

  1. メモリ内の NSData にダウンロードする
  2. 端末上のファイルを表す NSURL にダウンロードする
  3. オンラインのファイルを表す NSURL を生成する

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

dataWithMaxSize:completion: メソッドを使用して、メモリ内の NSData オブジェクトにファイルをダウンロードします。これは最も簡単にファイルをダウンロードできる方法ですが、ファイルのコンテンツ全体をメモリ内に読み込む必要があります。アプリで使用できるメモリよりも大きなファイルをリクエストすると、アプリがクラッシュします。メモリの問題が発生しないように、アプリで処理できる範囲内で最大サイズを設定するか、別のダウンロード方法を使用してください。

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];
  }
}];
    

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!)
  }
}
    

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

writeToFile:completion: メソッドはファイルをローカル端末に直接ダウンロードします。ユーザーがオフライン中にファイルにアクセスする場合や、別のアプリでファイルを共有する場合は、このメソッドを使用します。writeToFile:completion: から返される FIRStorageDownloadTask を使用して、ダウンロードの管理とダウンロード ステータスの監視を行うことができます。

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
  }
}];
    

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
  }
}
    

ダウンロードを積極的に管理したい場合は、完了ハンドラを使用する代わりに writeToFile: メソッドを使用して、ダウンロード タスクを監視することができます。詳しくは、ダウンロードの管理をご覧ください。

ダウンロード URL を生成する

URL をベースにしたダウンロード インフラストラクチャが既にある場合や、単に共有するための URL が必要な場合は、ストレージ参照で downloadURLWithCompletion: メソッドを呼び出して、ファイルのダウンロード URL を取得することができます。

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'
  }
}];
    

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'
  }
}
    

FirebaseUI による画像のダウンロード

FirebaseUI にはシンプルでカスタマイズ可能な実稼働対応のモバイル バインドが用意されており、ボイラープレート コードではなく Google のおすすめの方法を使うことができるようになります。FirebaseUI では、統合された SDWebImage を使用して、Cloud Storage からすばやく簡単に画像をダウンロード、キャッシュ、表示できます。

最初に FirebaseUI を Podfile に追加します。

pod 'FirebaseUI/Storage'

これでイメージを Storage から UIImageView に直接ロードできます。

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];
    

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)
    

ダウンロードを管理する

ダウンロードを開始するだけでなく、pauseresumecancel メソッドを使用して、ダウンロードを一時停止、再開、キャンセルすることもできます。これらのメソッドにより発生する pauseresumecancel イベントを監視できます。

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];
    

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()
    

ダウンロードの進捗状況を監視する

オブザーバーを FIRStorageDownloadTask に追加して、ダウンロードの進捗状況を監視することができます。オブザーバーを追加すると、オブザーバーを削除するために使用できる FIRStorageHandle が返されます。

Objective-C

// Add a progress observer to a download task
FIRStorageHandle observer = [downloadTask observeStatus:FIRStorageTaskStatusProgress
                                                handler:^(FIRStorageTaskSnapshot *snapshot) {
                                                  // A progress event occurred
                                                }];
    

Swift

// Add a progress observer to a download task
let observer = downloadTask.observe(.progress) { snapshot in
  // 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 スナップショットのタスクです。これを使用してタスクを管理(pauseresumecancel)することができます。
reference FIRStorageReference このタスクの参照元です。

オブザーバーは個別またはステータスごとに削除したり、すべてまとめて削除したりすることもできます。

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];
    

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()
    

メモリリークを防ぐために、FIRStorageTaskStatusSuccess または FIRStorageTaskStatusFailure の発生後にすべてのオブザーバーが削除されます。

エラーを処理する

ダウンロード時にエラーが発生する理由として、ファイルが存在しない、目的のファイルのアクセス権がユーザーにないなど、たくさんの理由が考えられます。エラーについて詳しくは、このドキュメントのエラーの処理のセクションをご覧ください。

ローカル ファイルへのダウンロードとエラー処理の完全な例を以下に示します。

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;
    }
  }
}];
    

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
  }
}
    

Cloud Storage に保存されているファイルのメタデータを取得して更新することもできます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。