Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2011年07月04日

Evernote連携



クラウドサービスEVERNOTEと連携する方法。

1. ポイント
・EVERNOTEと連携し、データをやりとりするにはEVERNOTE APIを使用する。
・EVERNOTE APIにアクセスするには、Thriftと呼ばれるフレームワークのライブラリを使用する。
・開発中はEVERNOTEのSandboxにアクセスしてテストする。
・開発が完了したら、EVERNOTEに本番環境へアクセスできるように要請する。

2. EVERNOTE APIキーの取得
http://www.evernote.com/about/developer/api/ にアクセスして、"Request an API Key" 以下の項目を入力して、APIキーを要求する。

3日間程で、cunsumer keyとconsumer secret、使用方法などが記載された英文のメールが送られてくる。

3. EVERNOTE Sandboxアカウントの登録

メールに記載されたEVERNOTE Sandboxのページにアクセスし、アカウント登録する。


4. ライブラリのダウンロード
(1) http://www.evernote.com/about/developer/api/から、Evernoteのライブラリとドキュメントをダウンロードする。

(2) http://thrift.apache.org/download/から、thriftのライブラリをダウンロードする。
 ※ thriftは、facebookが開発したクロス言語RPCフレームワーク。サーバ間のデータ連携に使用する。


5. プロジェクトへの取り込み
(1) ダウンロードしたEvernoteのライブラリのうち、evernote-api-x.xx/src/cocoa/ をプロジェクトに追加する。
( evernote-api-x.xx のx.xxはバージョン番号で、2011/7/4時点においては、1.19 )

(2) ダウンロードしたthriftのライブラリのうち、 thrift-x.x.x/lib/cocoa/src/ をプロジェクトに追加する。
( thrift-x.x.x のx.x.xはバージョン番号で、2011/7/4時点においては、0.6.1 )

6. Build Settingsで、thriftのヘッダ検索パス(Header Search Paths)を設定する。(これを設定しないとビルド時にエラーとなる)
 Xcodeの左ペインに表示されているTree構造ではなく、Finderで示されるTree構造を登録する。

 例えば、EvernoteApps/Thrift/src の下に、thrift-x.x.x/lib/cocoa/src/をコピーした場合、ヘッダ検索パスは、
./src
とし、再帰的(Recursive)にチェックを入れる。


7. Evernoteライブラリに添付されていたthriftのコードを削除する。
ダウンロードしたファイルをプロジェクトに追加した
evernote-api-x.xx/src/cocoa/thriftフォルダ
以下のファイルを全て削除。

※このオペレーションと、上記4.(2)、5.(2)は、最新バージョンのthriftを使用するときに行う。
Evernoteのライブラリにthriftは付属しているので、特に最新バージョンのthriftを使用しなくてもいい場合は、このオペレーションおよび、thriftライブラリのダウンロード(上記4.(2))と組み込み(上記5.(2))は行わなくてもよい。

※2011/7/7時点において、4(2)でダウンロードしたthriftライブラリを使用すると、テスト時の環境では実行時に
Caught TTransportException: Could not make HTTP request
エラーとなる現象が発生したので、thriftライブラリは4(1)でダウンロードしたEvernoteライブラリに同梱のthriftライブラリを使用した。



8. Evernote APIへのアクセス
APIの取り扱いの概要は下記記事が参考になる。ソースはRubyやJavaだが、考え方は同じ。

http://gihyo.jp/dev/serial/01/evernote_api/0004

※ 下記(1)〜(3)にて引用したコードの記事参照先
http://d.hatena.ne.jp/satoship/20100419/1271687952

(1) UserStoreサービスに接続するためのクライアントを作成(サンドボックスへのアクセスの場合)
(a) ThriftのBinaryProtocolを使用するので、サンドボックスサーバURLを引数としてBinaryProtocolを作成。
(b) BinaryProtocolオブジェクトから、UserStoreのクライアントを作成。
NSURL *userStoreURL = [NSURL URLWithString:@"https://sandbox.evernote.com/edam/user"];
NSString *noteStoreURLBase = @"http://sandbox.evernote.com/edam/note/";

THTTPClient *userStoreHTTPClient = [[[THTTPClient alloc] initWithURL:userStoreURL] autorelease];
TBinaryProtocol *userStoreProtocol = [[[TBinaryProtocol alloc] initWithTransport:userStoreHTTPClient] autorelease];
EDAMUserStoreClient *userStore = [[[EDAMUserStoreClient alloc] initWithProtocol:userStoreProtocol] autorelease];



(2) UserStoreクライアントでのユーザ認証
(a) userStoreのauthenticateで、ユーザ名とパスワードによる認証を行う。このとき、Evernote API使用申請時に取得した、CONSUMER KEY、CONSUMER SECRETを指定する。
BOOL versionOK = [userStore checkVersion:@"EDMATest" :[EDAMUserStoreConstants EDAM_VERSION_MAJOR] :[EDAMUserStoreConstants EDAM_VERSION_MINOR]];
if(versionOK == YES) {
@try {
EDAMAuthenticationResult *authResult = [userStore authenticate:@"USERNAME" :@"PASSWORD" :@"CONSUMER KEY" :@"CONSUMER SECRET"];
EDAMUser *user = [authResult user];
NSString *authToken = [authResult authenticationToken];


}
}



(3) NoteStoreサービスによるユーザデータの操作
ユーザのデータの読み書き操作する場合、NoteStoreを使用する。
UserStoreサービスに接続するためのクライアントを作成したときと同じように、NoteStoreサービスに接続するためのクライアントを作成する。
指定するURLは、認証結果から取得できるユーザ情報のshardIdをnoteStoreURLBaseに付加したものとする。
NSURL *noteStoreURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", noteStoreURLBase, [user shardId]]];

THTTPClient *noteStoreHTTPClient = [[[THTTPClient alloc] initWithURL:noteStoreURL] autorelease];
TBinaryProtocol *noteStoreProtocol = [[[TBinaryProtocol alloc] initWithTransport:noteStoreHTTPClient] autorelease];
EDAMNoteStoreClient *noteStore = [[[EDAMNoteStoreClient alloc] initWithProtocol:noteStoreProtocol] autorelease];



(4) Evernote APIにアクセスしてNotebookを取得する具体的な方法は下記記事を参照。

http://d.hatena.ne.jp/satoship/20100419/1271687952
http://d.hatena.ne.jp/yuum3/20110706/1309926567


(5) Evernote APIにアクセスしてNotebookを作成する具体的な方法。
UserStoreサービスに接続するためのクライアントを作成、UserStoreクライアントでのユーザ認証、NoteStoreサービスによるユーザデータの操作については、上記(1)〜(3)と同じ。
Notebookの作成は、Noteオブジェクトを作り,そこにタイトルとコンテンツをセット、NoteStore.createNoteにNoteオブジェクトを渡すことにより作成できる。

ENML(Evernote Markup Language)としてXML宣言から記述をはじめ、ENMLのルートノードは<en-note>にNotebookとして作成するテキストを記述する。Notebookに添付する画像やPDFなどのファイルは、<en-media>という要素で登録する。

ENMLはXMLなので、正しく記述しないとEvernote側では受け付けてくれないので注意が必要。

※ 下記にて引用したコードの記事参照先
http://digitalpericope.net/?p=27

EDAMNote *note = [[[EDAMNote alloc] init] autorelease];
[note setNotebookGuid:[defaultNotebook guid]];
[note setTitle:@"Test note from Cocoa Test."];
NSMutableString* contentString = [[[NSMutableString alloc] init] autorelease];
[contentString setString: @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"];
[contentString appendString:@"<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml.dtd\">"];
[contentString appendString:@" <en-note>Here is the Olive Tree Test note.<br/>"];
[contentString appendString:@" </en-note>"];
[note setContent:contentString];
[note setCreated:(long long)[[NSDate date] timeIntervalSince1970] * 1000];
EDAMNote *createdNote = [noteStore createNote:authToken :note];
if (createdNote != NULL)
{
NSLog(@"Created note: %@", [createdNote title]);
}






■参考記事
http://d.hatena.ne.jp/satoship/20100419/1271687952
http://digitalpericope.net/?p=27
http://gihyo.jp/dev/serial/01/evernote_api/0004
http://rbxbr.net/archives/501
http://blog.livedoor.jp/tattyamm/archives/1928700.html
http://d.hatena.ne.jp/yshgt/20100412/1271107986
http://d.hatena.ne.jp/yuum3/20110706/1309926567


■下記の書籍にEVERNOTE連携の詳しいコード説明、<en-media>要素で画像やPDFなどのファイルをNotebookに添付するコードの記述があります。

iPhoneSDK開発のレシピ
iPhoneSDK開発のレシピ
posted with amazlet at 11.06.23
高山 恭介 広部 一弥 松浦 晃洋
秀和システム
売り上げランキング: 25253


posted by mobileDeveloper at 22:54 | Comment(0) | TrackBack(0) | 外部連携 はてなブックマーク - Evernote連携 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。