SwiftからEvernote APIを使うのが予想外に面倒だったのでまとめました
SwiftでEvernote APIを使うiOSアプリを作ろうとして、なかなか上手く行かなかったので、今回行った手順をまとめておきました。
基本的には Using the Evernote API from Swift に書かれた手順ですが、上手く行かなかったので少し追加しました。
手順
1. Evernote Cloud SDK for iOS の追加
GitHubのEvernote Cloud SDK for iOS を submodule としてプロジェクトに追加します
% git submodule add https://github.com/evernote/evernote-cloud-sdk-ios.git Cloning into 'evernote-cloud-sdk-ios'... ... % git submodule 804c0ff4221a430fa5e9619ca717503abdad92c8 evernote-cloud-sdk-ios (heads/master)
2. プロジェクトへ追加
の2つをプロジェクトに追加します
3. 依存ライブラリーの追加
Getting Started with the Evernote Cloud SDK for iOS に書かれているように、以下の2つのフレームワーク・ライブラリーを追加します。
- MobileCoreServices.framework
- libxml2.dylib
4. ブリッジヘッダーファイルを書く
SwiftからObjective-Cで書かれたライブラリーを呼び出すには、ブリッジヘッダーファイルを作る必要があります。ブリッジヘッダーファイルは半自動で出来るように書かれた ドキュメント もありますが、出来なかったので手動でつくりました。
- EvernoteSample-Bridging-Header.h の内容
#import <ENSDK/ENSDK.h>
- Build Settings
EvernoteSample/EvernoteSample-Bridging-Header.h
5. Header Search Path
ここでコンパイルしてもエラーが出ます。Evernote Cloud SDK for iOS や libxml2 のヘッダーファイルが見つからないからです。設定しましょう
${PROJECT_DIR}/evernote-cloud-sdk-ios/evernote-sdk-ios
/usr/include/libxml2
6. Prefix Header の設定
ここまでで Using the Evernote API from Swift に書かれた設定は全て出来たはずですが、以下のような意味不明なエラーが出て悩みました・・・
そしてGoogle先生にたずねながら理解しました。Evernote Cloud SDK for iOS内には独自のPrefix Header evernote-sdk-ios-Prefix.pch が在るのですが、これが参照されてないようです
そこで Prefix Header を設定。 これでコンパイルエラーが無くなりました ^^)/
${PROJECT_DIR}/evernote-cloud-sdk-ios/evernote-sdk-ios/evernote-sdk-ios-Prefix.pch
サンプルコード
この記事を書くために Evernote Cloud SDK for iOSを使いノートを作成する簡単なテストコードを作りました、コードは GitHub にあります。
import UIKit class ViewController: UIViewController { let CONSUMER_KEY = "YOUR CONSUMER_KEY" let CONSUMER_SECRET = "YOUR CONSUMER_SECRET" override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) postTestNote() } private func postTestNote() { ENSession.setSharedSessionConsumerKey(CONSUMER_KEY, consumerSecret: CONSUMER_SECRET, optionalHost: ENSessionHostSandbox) var session = ENSession.sharedSession() if session.isAuthenticated { var note = ENNote() note.title = "Test" note.content = ENNoteContent(string: "test test test ...") session.uploadNote(note, notebook: nil, completion: { noteRef, error in if error == nil { println("OK") } else { println("Upload note error: \(error)") } }) } else { session.authenticateWithViewController(self, preferRegistration: false, completion: { error in if error == nil { self.postTestNote() } else { println("Authentication error: \(error)") } }) } } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
- CONSUMER_KEY/CONSUMER_SECRET は https://dev.evernote.com/intl/jp/doc/ から取得して下さい
- 作成されるのは sandbox.evernote.com の方です、ノートブックはデフォルトが使われます
- 画面が表示された瞬間(viewDidAppear)にノートをEvernoteに作ります
- 最初に起動した際に認証画面が表示されます