SwiftUIでEvernoteの認証をする

2022年4月15日

前回の続き

今回は、EvernoteのAPIで認証するまでをやっていきます。

前提

すでにEvernoteのAPIキーを取得済みで話を進めていきます。
サンドボックスで実験していくのですが、以下でAPIキーの取得ができます。

https://dev.evernote.com/doc/

一年以上前にすでにAPIキーを取得していたのでここどうやってやったか忘れた。

一応こちらでざっくりとした内容を書いておきます。

以下を参考にすれば問題なくできるはずです。

https://qiita.com/r-wakatsuki/items/42ff5e52c819fc7a02d5#api-key%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88

実装

まずは認証に必要なConsumer KeyとConsumer Secretをセットする。

ENSession.setSharedSessionConsumerKey(<Consumer Key>, consumerSecret:<Consumer Secret>, optionalHost: ENSessionHostSandbox)

// using a developer token:
// ENSession.setSharedSessionDeveloperToken(<Dev Token>, noteStoreUrl: <Note Store URL>)

その後に以下認証を実行したい。

NSession.shared.authenticate(with: self, preferRegistration: false, completion: { (_error: Error?) in
})

ただ、中身を確認してみるとwithのところでUIViewControllerが必要となっている。

- (void)authenticateWithViewController:(UIViewController *)viewController
                    preferRegistration:(BOOL)preferRegistration
                            completion:(ENSessionAuthenticateCompletionHandler)completion;

というわけで、UIViewControllerを用意する。
UIViewControllerRepresentableを使って認証時のみUIKitに依存するような作りを用意する。

import UIKit
import SwiftUI
import EvernoteSDK

/**
 SwiftUIでviewControllerを表示する際に必要なコード
 */
struct EvernoteViewControllerWrapper: UIViewControllerRepresentable {
    typealias UIViewControllerType = EvernoteViewController
    func makeUIViewController(context: Context) -> UIViewControllerType {
        return EvernoteViewController()
    }

    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {
    }
}

/**
 従来のViewControllerでviewの作成
 */
class EvernoteViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // Do any additional setup after loading the view.
        // このタイミングならOK
        initENSession()
    }

    fileprivate func initENSession() {
        ENSession.setSharedSessionConsumerKey("your key", consumerSecret: "your secret", optionalHost: ENSessionHostSandbox)
        if (ENSession.shared.isAuthenticated) {
            print("Authenticated")
            return
        }
        print(ENSession.shared.isAuthenticated)
        ENSession.shared.authenticate(with: self, preferRegistration: false, completion: { (_error: Error?) in
            print("Authenticate Completion")
        })
    }
}

以下のようにして使う。
これで画面が立ち上がったタイミングで認証しにいくようになる。

 var body: some View {
        EvernoteViewControllerWrapper().frame(height: 0)
}