iOSでdropbox連携を行う(第5回ー最終回ー)
あれよあれよと言う間に、いつのまにか2018年も半分過ぎようとしています。
こんにちは、E-kanのラボ主です。
Dropbox連携の連載1回目って、もう1年以上前ですよね。
1年で連載5回(3.5回含む)、しかも完結していないってどうなんでしょうね?
と、そんな訳で、残りはサクッと進めて終わらせてしまいましょう!
Dropbox…に限らずストレージ連携で重要なのは、
・ログイン(認証)
・リストの取得
・ダウンロード
・アップロード
・削除
あたりだと思います。
連載4回までで、ダウンロードまで終わっていますので、今回は『アップロード』と『削除』を実現させて、
連載を終わらせたいと思います。
アップロード
それでは、ファイルのアップロードを実装して行きましょう。
コード実装
まずは、ViewControllerのソースファイルに以下を追加します。
このコードがアップロードを行うコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<small> @IBAction func pushUpload(_ sender: Any){ guard let client = DropboxClientsManager.authorizedClient else { return } let fileData = "testing data example".data(using: String.Encoding.utf8, allowLossyConversion: false)! _ = client.files.upload(path:”/myUploadTestFile.txt”, input: fileData) .response { response, error in if let response = response { print(response) }else if let error = error { print(error) } } .progress { progressData in print(progressData) } }</small> |
今回は、ボタンが押されたらアップロードを行う処理とするので、
@IBAction func pushUpload(_ sender: Any)
としてボタン押下イベントと関連付けできる様にメソッドを作っています。
この中のlet fileDataの部分が、実際にアップロードするファイルデータを作成している部分です。
今回は、文字列を直接テキストデータに見立てていますが、
ここの記述を、アプリ内のデータや写真などにすることで、任意のデータをアップロードすることができます。
client.file.uploadの部分が実際にアップロードをする記述ですね。
pathの部分に“パス&ファイル名”、inputの部分に“アップロードするデータ”を設定します。
サンプルコードは、トップディレクトリに”myUploadTestFile.txt”というファイル名でアップロードします。
アップロードが完了、失敗した時の処理はprint(response)やprint(error)の部分に記載します。
ボタンの配置
次は、アプリの画面にボタンを配置して、コードとの関連付けを行います。
まずは、画面にボタンを配置します。
ボタンのタイトルは適当に”アップロード”としました。
ボタンのサイズとかも適当に調整してしましょう。
次に、ボタンが押された時のイベントと実行メソッドを関連付けます。
1. 左のメニューのViewControllerを選び、
2. 右側のメニューの左端のタブを開きます。
3. 先に実装していた pushUpload: が表示されていますので、
その右側の + をクリックして、先ほど作成したボタンの上までドラッグします。
4. メニューが表示されますので、Touch Up Insideを選びましょう。
これで、イベントの関連付けが完了です。
アップロードの実行
さて、それでは実際に動かしてみましょう。
アプリが立ち上がったら、”アップロード”ボタンを押下してください。
成功したら、以下のログが出てくると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<small><strong>アップロード成功ログ</strong> : Parent: 0x0 / Fraction completed: 1.0000 / Completed: 20 of 20 { "client_modified" = "2018-06-09T09:48:53Z"; "content_hash" = 926f8518aad676605dd0b45a61d0777d73e63123203eefc9ac58336422316cae; id = "id:bLMfqIGYb7MAAAAAAAAOGQ"; name = "myUploadTestFile.txt"; "path_display" = "/myUploadTestFile.txt"; "path_lower" = "/myuploadtestfile.txt"; rev = cf0647110c; "server_modified" = "2018-06-09T09:48:53Z"; size = 20; }</small> |
実際に、ドロップボックスのサイトでトップディレクトリを見ると、”myUploadTestFile.txt”ができあがっているのが確認できます。
やったー。
これでアップロード機能の完成です。
もし、アップロードが失敗する場合は、ログイン認証が出てきていない可能性があるので、先に認証をしてください。
ファイルの削除
続いて、ファイルの削除機能を作ってみましょう。
実装
アップロードと同じ様に、ViewControllerのソースファイルに以下を追加します。
このコードが削除を行うコードになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<small> @IBAction func pushDelete(_ sender: Any){ guard let client = DropboxClientsManager.authorizedClient else { return } _ = client.files.delete(path: "/myUploadTestFile.txt") .response{ response, error in if let response = response { print(response) }else if let error = error { print(error) } } }</small> |
client.files.delete(path: “***”)
の部分が実際に削除を行う部分になります。
pathの部分に削除したいファイルをパス込みで指定します。
アップロードと同じく、print(response)の部分に成功したときの処理、
print(error)の部分に失敗した時の処理を書くことになります。
ボタンの配置
アップロードと同じ様に、削除ボタンを配置して、ボタンの関連付けを行いましょう。
削除の実行
それでは、実際に動かして削除してみましょう。
削除ボタンを押下して、次の様なログが出力されれば成功です。
1 2 3 4 5 6 7 8 9 10 11 |
<small>{ "client_modified" = "2018-06-09T09:48:53Z"; "content_hash" = 926f8518aad676605dd0b45a61d0777d73e63123203eefc9ac58336422316cae; id = "id:bLMfqIGYb7MAAAAAAAAOGQ"; name = "myUploadTestFile.txt"; "path_display" = "/myUploadTestFile.txt"; "path_lower" = "/myuploadtestfile.txt"; rev = cf0647110c; "server_modified" = "2018-06-09T09:48:53Z"; size = 20; }</small> |
実際にドロップボックスのサイトを見ると、ちゃんと削除されていますね。
ちなみに、存在しないファイルを削除しようとした場合は、エラーとなって、次のログが出力されます。
1 2 3 4 5 6 |
[request-id 9b3c89589bd3669b1abbcbaf9b6d2b0e] API route error - { ".tag" = "path_lookup"; "path_lookup" = { ".tag" = "not_found"; }; } |
path_lookupの.tagに”not_found”と出力されているので、エラー内容が分かり易いですね。
まとめ
少し駆け足となりましたが、これで、一通りの機能を使うことができるようになりました。
今までの連載の内容を応用していけば、ドロップボックスを使った色々なアプリが作れるようになると思います。
ぜひ、何か便利アプリを作ってみてください。
最後に … one more
今回でdropbox連携の連載は完結となりますが、後一回だけ。
番外応用編として、カメラで撮影した画像をそのままdropboxにアップロードするアプリを作ってみたいと思います。
どの様なアプリになるか、どのくらいのソース量になるかまだ未定ですが、
お楽しみに。