SwiftからEvernote APIを使うのが予想外に面倒だったのでまとめました

SwiftEvernote 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つをプロジェクトに追加します

f:id:yuum3:20141216112243p:plain

3. 依存ライブラリーの追加

Getting Started with the Evernote Cloud SDK for iOS に書かれているように、以下の2つのフレームワーク・ライブラリーを追加します。

  • MobileCoreServices.framework
  • libxml2.dylib

f:id:yuum3:20141216113057p:plain

4. ブリッジヘッダーファイルを書く

SwiftからObjective-Cで書かれたライブラリーを呼び出すには、ブリッジヘッダーファイルを作る必要があります。ブリッジヘッダーファイルは半自動で出来るように書かれた ドキュメント もありますが、出来なかったので手動でつくりました。

f:id:yuum3:20141216143646p:plain

  • EvernoteSample-Bridging-Header.h の内容
#import <ENSDK/ENSDK.h>
  • Build Settings

f:id:yuum3:20141216144030p:plain

EvernoteSample/EvernoteSample-Bridging-Header.h

5. Header Search Path

ここでコンパイルしてもエラーが出ます。Evernote Cloud SDK for iOS や libxml2 のヘッダーファイルが見つからないからです。設定しましょう

f:id:yuum3:20141216144543p:plain

${PROJECT_DIR}/evernote-cloud-sdk-ios/evernote-sdk-ios

/usr/include/libxml2

6. Prefix Header の設定

ここまでで Using the Evernote API from Swift に書かれた設定は全て出来たはずですが、以下のような意味不明なエラーが出て悩みました・・・

f:id:yuum3:20141216145210p:plain

そしてGoogle先生にたずねながら理解しました。Evernote Cloud SDK for iOS内には独自のPrefix Header evernote-sdk-ios-Prefix.pch が在るのですが、これが参照されてないようです

f:id:yuum3:20141216145224p:plain

そこで Prefix Header を設定。 これでコンパイルエラーが無くなりました ^^)/

f:id:yuum3:20141216145732p:plain

${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に作ります
  • 最初に起動した際に認証画面が表示されます