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



2015年07月17日

Evernote Cloud SDK for iOSの導入



クラウドプラットフォーム Evernoteより従来提供されていた、Evernote SDKはEvernote Cloud SDKにバージョンアップされた。

64bitアーキテクチャであるARM64に対応させる場合、Evernote SDKを導入しているとビルド時に警告メッセージが表示される。警告となった部分のコードを手直しすれば、とりあえず動作するが、32bitのARMV7、ARMV7s搭載のデバイスで動作させると、クラッシュする頻度が高く、クラッシュする箇所も一定しない現象に出くわす。
従って、ARM64対応が必須となった現在では、Evernote Cloud SDKを利用する必要がある。

Evernote Cloud SDK for iOSの日本語ドキュメントは現在整備されていないため、GitHubのSDK提供ページの英文リリースノートと、提供されているSDK及びサンプルプロジェクトを直接読んで理解する必要がある。

1. GitHubより、Evernote Cloud SDK for iOS をダウンロードする
https://github.com/evernote/evernote-cloud-sdk-ios

2. Evernote SDKからの移行の場合、既存プロジェクトからEvernote SDKを削除する。

3. ダウンロードした、Evernote Cloud SDK for iOSをFinderからプロジェクトにコピーする。

コピーするファイル
・ENSDKResources.bundle
・evernote-sdk-iosフォルダ直下のファイルをフォルダごと

Evernote SDKからの移行の場合、Evernote SDKを完全に削除したつもりでも、コピー時にリポジトリが残っている状態になっていることがある。

この場合は、コピー時にDestination : Copy items if neededのチェックを外し、プロジェクトへの実体コピーではなくSDKを参照する形にしておく。

4. 依存フレームワークをプロジェクトに追加する。
・MobileCoreServices.framework
・libxml2.dylib

5. コードの修正
(1) 利用準備
Evernote SDKからEvernote Cloud SDK への移行は、クラス名称をいくつか変更(EvernoteSession→ ENSession、EvernoteNoteStore→ ENNoteStoreClient など)した上で、若干のコード修正が必要となる。

Evernoteにアクセスするクラスのヘッダファイルに記述
#import <ENSDK/Advanced/ENSDKAdvanced.h>


AppDelegate.mまたは、Evernoteにアクセスするクラスに、Evernoteにアクセスするコンシューマキーなどを定義する。
NSString *CONSUMER_KEY = @"your key";
NSString *CONSUMER_SECRET = @"your secret";

[ENSession setSharedSessionConsumerKey:CONSUMER_KEY
consumerSecret:CONSUMER_SECRET
optionalHost:nil];

sandboxに接続する場合は、optionalHost に ENSessionHostSandbox を設定する。

(2) ログイン
[[ENSession sharedSession] authenticateWithViewController:self preferRegistration:NO completion:^(NSError *authenticateError) {
if (!authenticateError) {
// 認証OK
} else {
// 認証NG
}


(3) ログアウト
[[ENSession sharedSession] unauthenticate];


(4) ログイン状態の確認
// LOGIN状態の確認
ENSession *session = [ENSession sharedSession];

if([session isAuthenticated]){
// 認証済
} else {
// 未認証
}


(5) ノートにファイルを添付してアップロード
ENNote * note = [[ENNote alloc] init];
note.content = [ENNoteContent noteContentWithString:@"hoge hoge data"];
note.title = @"hoge hoge Note";
ENResource * resource = [[ENResource alloc] initWithImage:myImage]; // myImage is a UIImage object.
[note addResource:resource];
[[ENSession sharedSession] uploadNote:note notebook:nil completion:^(ENNoteRef * noteRef, NSError * uploadNoteError) {
if (noteRef) {
// アップロード成功
} else {
// アップロード失敗
NSLog(@"uploadNoteError : %@",uploadNoteError);
}
}];


(6) ノート一覧、ノート件数、条件に合致するノートの取得
[[ENSession sharedSession].primaryNoteStore listNotebooksWithSuccess:^(NSArray *notebooks) {
// ノート一覧取得成功
for (EDAMNotebook *notebook in notebooks) {
// フィルターの編集
EDAMNoteFilter *filter = [[EDAMNoteFilter alloc] init];
[filter setNotebookGuid:[notebook guid]];
[filter setWords:@"hoge"];
[filter setAscending:NO];
[filter setInactive:NO];

// 条件に合致するノート件数の取得
[[ENSession sharedSession].primaryNoteStore findNoteCountsWithFilter:filter withTrash:NO success:^(EDAMNoteCollectionCounts *counts) {
// ノート件数取得成功
NSNumber *notecount = (NSNumber *) [[counts notebookCounts] objectForKey:[notebook guid]];
NSLog(@"notecount %@",notecount);
} failure:^(NSError *error) {
// ノート件数取得失敗
NSLog(@"error %@", error);
}

// 条件に合致するノートの取得
[[ENSession sharedSession].primaryNoteStore findNotesWithFilter:filter offset:0 maxNotes:[EDAMLimitsConstants EDAM_USER_NOTES_MAX] success:^(EDAMNoteList *list) {
// ノート取得成功
for (EDAMNote *note in list.notes) {
NSLog(@"note.title %@",note.title);
}
} failure:^(NSError *error) {
// ノート取得失敗
NSLog(@"error %@", error);
}
}
} failure:^(NSError *error) {
// ノート一覧取得失敗
NSLog(@"error %@", error);
}];


(7) ノート検索
[[ENSession sharedSession] findNotesWithSearch:[ENNoteSearch noteSearchWithSearchString:@"hoge"
inNotebook:nil
orScope:ENSessionSearchScopeDefault
sortOrder:ENSessionSortOrderRecentlyCreated
maxResults:20
completion:^(NSArray * findNotesResults, NSError * findNotesError) {

if (findNotesResults) {
// 取得成功
for (ENSessionFindNotesResult * result in findNotesResults) {
// ノートに添付されたファイルのダウンロード
[[ENSession sharedSession] downloadNote:result.noteRef progress:nil completion:^(ENNote * note, NSError * error) {
if (note) {
// ダウンロード成功
for (ENResource *resourceInfo in [note resources]) {
NSString *body= [[NSString alloc] initWithData:[resourceInfo data] encoding:NSUTF8StringEncoding];
}
} else {
// ダウンロード失敗
NSLog(@"error %@", error);
}
}];
}
} else {
// 取得失敗
NSLog(@"findNotesError %@", findNotesError);
}
}];


参考記事:
https://github.com/evernote/evernote-cloud-sdk-ios/blob/master/Getting_Started.md
https://github.com/evernote/evernote-cloud-sdk-ios/blob/master/Migration_from_SDK_1_x.md#import-the-advanced-headers
http://www.studio-marble.jp/blog/blog_entry_011.htm
http://yuumi3.hatenablog.com/entry/2014/12/16/153229
タグ:Mac apple iPAD IOS iPhone
posted by mobileDeveloper at 21:26 | Comment(0) | TrackBack(0) | 外部連携 はてなブックマーク - Evernote Cloud SDK for iOSの導入 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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

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