iOS

[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 アカウントにノートが作成されていることを確認して下さい。