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