[iOS SDK] OAuth 認証による Evernote に新規ノートを作成するアプリを書いてみた
以前、iPhone アプリで Evernote と連携する方法を書いたのですが、認証方法が変わって、これからは OAuth 認証をする必要があるみたいです。
関連:認証 - Evernote Developers
今回は、Xcode で作成されるプロジェクトへの、Evernote SDK の導入、そして OAuth 認証、新規ノートを作成するまでの手順をさくっと説明します。
流れは、基本的に以前書いた記事と同じなので、さらっと読んでみて下さいね。
関連:[iOS SDK][Evernote API] Evernote に新規ノートを作成するサンプルコードを動かすまでの手順
1. API キーの取得
赤丸の 1 番「API キーの取得」から、必要な情報を記述して、API キーを取得します。
Consumer Key, Secret を控えておきます。
クラウド API - Evernote Developers
2. iOS 向けの Evernote SDK を Github からダウンロード
以下のリンクから、プロジェクトに追加する Evernote SDK をダウンロードします。
evernote/evernote-sdk-ios · GitHub
3. プロジェクトの作成
では、Xcode で新規プロジェクトを作成していきます。
なんでもいいのですが、ボタンを作成するのが面倒なので、「Master-Detail Application」で作成して、「Use Automatic Reference Counting」だけにチェックを入れて作成します。
4. Evernote SDK の導入
先程、git からダウンロードしたファイルの中に「evernote-sdk-ios」というフォルダがあると思いますので、それを作成したプロジェクトに突っ込みます。
この状態で Build すると ARC Restrictions と怒られるので(突っ込んだファイルが ARC に対応してないので)、次の方法で無効にします。
ARC を有効にしたくないファイルのコンパイルオプションに -fno-objc-arc を入力すれば OK です。
参考:Objective-C で ARC を有効にしたプロジェクトで、一部ファイルのみ ARC を無効にする方法 | Zero4Racer PRO Developer’s Blog
5. Security.framework の追加
今度は、「Security.framework」を追加します。
参考:[iOS SDK][Xcode 4.3] フレームワークをプロジェクトに追加する方法 | ラクイシロク
ここまでで Build してあげると警告は残りますが、 Build に成功するはずです。
6. プログラムを書き換える
新規作成したプロジェクトのコードを書き換えていきましょう。
MasterViewController.h
#import <UIKit/UIKit.h>
@interface MasterViewController : UITableViewController
@end
MasterViewController.m
define の CONSUMER_KEY, CONSUMER_SECRET は、ご自身のに変えて下さい。
#import "MasterViewController.h"
#import "EvernoteSDK.h"
#define EVERNOTE_HOST @"sandbox.evernote.com"
#define CONSUMER_KEY @"XXXXXXX" // Consumer key
#define CONSUMER_SECRET @"XXXXXXXXXXXXXXXX" // Consumer secret
@interface MasterViewController ()
@end
@implementation MasterViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = @"Evernote OAuth";
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewDidUnload
{
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
#pragma mark - Table View
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
switch ([indexPath row]) {
case 0:
cell.textLabel.text = @"Evernote OAuth 認証";
break;
case 1:
cell.textLabel.text = @"Logout";
break;
default:
cell.textLabel.text = @"Evernote にノートを送る";
break;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
switch ([indexPath row]) {
case 0:
[self login];
break;
case 1:
[self logout];
break;
default:
[self sendEvernote];
break;
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
- (void)login
{
[EvernoteSession setSharedSessionHost:EVERNOTE_HOST consumerKey:CONSUMER_KEY consumerSecret:CONSUMER_SECRET];
EvernoteSession *session = [EvernoteSession sharedSession];
[session authenticateWithViewController:self completionHandler:^(NSError *error) {
if (error || !session.isAuthenticated) {
NSLog(@"Error: Could not authenticate");
} else {
NSLog(@"Authenticated!");
}
}];
}
- (void)logout
{
[[EvernoteSession sharedSession] logout];
}
- (void)sendEvernote
{
EDAMNote *note = [[EDAMNote alloc] init];
note.title = @"note.title";
note.content = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\">\n<en-note>note.content</en-note>";
EvernoteNoteStore *noteStore = [EvernoteNoteStore noteStore];
@try {
[noteStore createNote:note success:^(EDAMNote *note) {} failure:^(NSError *error) {
NSLog(@"Error: %@", error);
}];
}
@catch (EDAMUserException *e) {
return;
}
NSLog(@"Note was saved.");
}
@end
ビルドすれば問題なく動くはずです。
認証してノートを送信してみたら、Evernote SandBox アカウントにノートが作成されていることを確認して下さい。