iOSでdropbox連携を行う(第2回)

数回に渡ってお送りしているiOSでのdropbox連携。その2回目です。

前回は、SwiftyDropboxを新規プロジェクトに組み込むところまで行いました。
今回は、実際にライブラリを使ってDropboxにログインして見たいと思います。

1. DropboxClientの初期化

Dropbox連携はDropboxClientというクラスを使用して行いますが、その初期化を行います。
まずは、Application delegeteあたりに下のコードを記述しましょう。
基本的にはどこで初期化をしても良いのですが、アプリ起動時に初期化してしまうのが楽だと思いますので、そのタイミングで呼ばれる application:didFinishLaunchingWithOptions: で記述しちゃいます。
“”の部分には、前回のアプリ登録で確認したAppKeyに置き換えてください。
また、SwiftyDropboxライブラリを使いますので、import文も追加するのを忘れずに。

import UIKit
import SwiftyDropbox

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?
    …

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        DropboxClientsManager.setupWithAppKey(“”)
        return true
    }

これでクライアントに固有キーを設定できるようになりました。

2. ログイン認証の準備(認証ボタンの作成)

次にdropboxの認証を行います。 …が。
アプリが起動したら勝手に認証するのでは、ユーザーがビックリするので、
認証用のボタンを用意することにします。

まずは、左側のMain.storyboardをクリックして、InterfaceBuilderを開きます。(①)
そして、左下のウィンドウからButtonを画面レイアウトの上にドラッグします。(②)

次にボタンの位置を左下で固定するための設定を行います。
左下の方にあるアイコンをクリックして、設定画面を出します。(③)

設定画面の上側にある上下左右のスペースの設定で、下と右に16を入力します。(④)
ついでにその下にあるチェックボックスもチェックを外します。(⑤)
これがチェックされていると、思ったよりスペースが空いて表示されたりします。

次に右上の方に並んでいるアイコンの左から2つ目をクリックします。(⑥)

すると画面が分割されてコードが出てきます。
次に配置したボタンの上で”control”キーを押しながらクリックします。(⑦)
黒いメニューが出てきたら、”Touch Up Inside”という項目の右側にある”+”をソースコードにドラッグします。(⑧)

追加するメソッド名を入力して、”connect”をクリックします。
今回は、”pushAuthentication” というメソッド名にしました。
これで、ボタンが押されたら”pushAuthentication”が呼ばれるように設定できたことになります。

3. ログイン認証

さて、今度は右上に並んでいるアイコンの一番左をクリックしてから、ソースに戻りましょう。
それでは、認証コードを記述します。
追加されたpushAuthenticationメソッドに下記を書きましよう。
ここでもSwiftyDropboxライブラリを使いますので、import文も追加するのを忘れずに。

import UIKit
import SwiftyDropbox

class ViewController: UIViewController {
    ……
    @IBAction func pushAuthentication(_ sender: Any) {
        DropboxClientsManager.authorizeFromController(UIApplication.shared,
                                                      controller: self,
                                                      openURL: { (url: URL) -> Void in
                                                        UIApplication.shared.openURL(url)
        })
    }

これだけで、ログインの認証画面が出るようになりました。
試しに実行してみると…
※ ネットワークに繋がっていないと、エラーダイアログが出ますので、インターネットに繋がっている状態で実行してください。

こんな感じでログインしたような感じがありますね。
ただ、これではちゃんとログインができたのかよくわからないので、
最後に結果を受け取れるようにしましょう。

4. 結果の受け取り

次のコードをApplication delegeteに追加します。

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    if let authResult = DropboxClientsManager.handleRedirectURL(url) {
        switch authResult {
        case .success:
            print("Success! User is logged into Dropbox.")
        case .cancel:
            print("Authorization flow was manually canceled by user!")
        case .error(_, let description):
            print("Error: \(description)")
        }
    }
    return true
}

これで、認証の成功、キャンセル、エラーがログに出力されるようになります。
では、もう一度実行して見ましょう。
下のようにログが出れば、認証が成功しています。

2017-05-25 16:25:22.479267+0900 dropboxtest[24899:9093631] [MobileAssetError:29] Unable to copy asset information from https://mesu.apple.com/assets/ for asset type com.apple.MobileAsset.TextInput.SpellChecker
Success! User is logged into Dropbox.

ちなみに、ログイン画面でキャンセルすると、次のようになります。

017-05-25 16:28:05.973 dropboxtest[24899:9093044] -canOpenURL: failed for URL: "dbapi-2://1/connect" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"
2017-05-25 16:28:05.974 dropboxtest[24899:9093044] -canOpenURL: failed for URL: "dbapi-8-emm://1/connect" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"
Authorization flow was manually canceled by user!

エラーは発生のさせ方が分からなかったので、発生させることができたら、追記しようと思います。

さ〜、これでやっとログイン完了まできました。
次はいよいよ、Dropboxからデータを取ってくる部分となります。
それでは、また次回をお楽しみに!

Posted in システム開発 and tagged .