プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

SwiftのBox APIでファイルデータを取得する。

この記事は2018年10月09日に投稿しました。

目次

  1. はじめに
  2. 前提
  3. ファイルデータ取得処理
  4. おわりに

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回はSwiftのBox APIでファイルデータを取得する手順の紹介です。

目次へ

2. 前提

iOSアプリからBox APIにアクセスするため、Box iOS SDKライブラリを使用します。
以下の記事を参考に、Box APIを使用する準備をしておいてください。

paveway.hatenablog.com

目次へ

3. ファイルデータ取得処理

SwiftのBox APIでファイルデータを取得するには、クライアントオブジェクトのfileDownloadRequestメソッドを使用します。

以下がファイルデータを取得する手順です。 この手順は、Box iOS SDKライブラリのドキュメントFilesDownload a Box Fileを参考にしました。

  1. Boxのクライアントオブジェクトを取得します。
  2. クライアントオブジェクトのfileDownloadRequestメソッドで、ファイルダウンロードリクエストを生成します。
    fileDownloadRequestメソッドの引数には、

    • ファイルのID
    • ダウンロード先ローカルファイルパス名 Dropbox APIと同様、Boxでファイルデータを取得する場合、ファイルデータだけを取得することはできず、ローカルファイルとしてダウンロードされます。

    を指定します。

  3. ファイルダウンロードリクエストのperformメソッドを実行し、ファイルをダウンロードします。 ファイルダウンロードの進捗状況と結果は、それぞれクロージャーで返却されます。
    ネットワークアクセスしますので、PWEditorではファイルダウンロード中は、処理中ダイアログを表示しています。
  4. エラーがあれば、結果のクロージャーの引数errorが設定されます。

実装例

import BOXContentSDK

/**
 ファイルのデータを取得します。

 - Parameter fileId: ファイルのID
 - Parameter localFilePath: ダウンロード先ファイルパス名
 */
func getFileData(_ fileId: String, localFilePath: String) {
    // 1. クライアントオブジェクトを取得します。
    guard let client = BoxContentClient.default() else {
        // クライアントオブジェ久我取得できない場合、処理を終了します。
        // 必要に応じてエラー処理を行ってください。
        return
    }

    // 2. ファイルダウンロードリクエストを取得します。
    let request = client.fileDownloadRequest(withID: fileId, toLocalFilePath: localFilePath)
    
    // 3. ファイルをダウンロードします。
    request.perform(progress: { (totalBytesTransferred, totalBytesExpectedToTransfer) -> Void in
    }, completion: { (error: Error?) -> Void in
        // 4. エラーかチェックします。
        if let error = error {
            // エラーの場合、処理を終了します。
            // 必要に応じてエラー処理してください。
            return
        }

        // 以降正常終了した場合の処理を記述してください。
        
        // PWEditorでファイルデータは、ファイルではなくメモリ上に保持します。
        // そのためダウンロードされたローカルファイルのデータは、String型に変換します。
        // 変換後、ローカルファイルは削除します。
    })
}

目次へ

4. おわりに

ファイルデータを取得する場合、Dropbox APIも同様にファイルをダウンロードする必要がありました。
Dropbox APIの時はアプリの領域にファイルをダウンロードするようにしました。
そのためファイルデータ取得後にダウンロードしたファイルを削除するにようにしました。
しかしファイルの削除の失敗するとローカルファイル一覧に表示されてしまいました。
今回Boxドキュメントをみると、テンポラリ領域にファイルをダウンロードするようにしていました。
Dropbox APIの時もそのようにすればよかったです。

お仕事決まれば全額キャッシュバック!転職特化型Ruby実践研修【ポテパンキャンプ】

詳解 Swift 第4版

詳解 Swift 第4版

目次へ