2013/02/25更新

[XCODE] EvernoteAPIをIOSから利用する

このエントリーをはてなブックマークに追加      

こんにちは、@yoheiMuneです。
iOSからEvernoteAPIを利用する方法を、ブログに書きたいと思います。
この記事では、アプリ登録 -> OAuth認証 -> ノートの新規登録を行います。

画像


EvernoteのAPIを利用する

Evernoteは、オンラインノートを作成できるサービスです。
Evernoteは、Webページ・デスクトップアプリ・iPhoneアプリなどをリリースしていて、そのアプリを使うことでノートの作成や参照をすることができます。

ただノートの作成は、色々なアプリからも行いたい(例えば、今見ている記事をEvernoteに入れておきたい)など要望が多いです。
その要望を満たすために、Evernoteが外部に公開しているAPIの一部を利用します。

EvernoteAPIを利用するには、以下の手順が必要となります。
  1. アプリケーションを利用する申請をEvernoteに行う
  2. サンドボックス環境を利用するためのアカウントを作成する
  3. EvernoteAPIの機能をXCODEプロジェクトに追加する
  4. OAuth認証を行う
  5. ノート作成APIを実行する
上記手順も含めたEvernoteAPIの利用方法は、公式にはこちらで解説されています。



アプリケーションの登録を行う

Evernoteは認証にOAuth認証を取り入れており、OAuth認証用のキーを取得するためにもアプリケーションの登録をする必要があります。
以下のURL先のページで必要事項を記入して、アプリ登録を行います。
http://dev.evernote.com/intl/jp/documentation/cloud/



サンドボックス環境を利用するためのアカウントを作成する

続いてEvernoteのサンドボックス環境でEvernoteを利用するアカウントを作成します。
EvernoteAPIは、アプリ開発中にサンドボックスを利用することができ、Evernote APIとの結合テストなどもそちらを利用することができます。
以下でサンドボックス環境でのアカウントを作成します。
https://sandbox.evernote.com/



EvernoteAPIのモジュールを入手し、自分のXCODEに入れる

次にEvernoteAPIを利用するためのモジュールを取得します。
iOS用のライブラリはこちらから入手できます。
https://github.com/evernote/evernote-sdk-ios

git cloneでも良いし、zipファイルのダウンロードでも良いので、入手します。


上記で入手したライブラリを自分のXCODEに追加します。
上記のGithubのREADME.mdでは、以下の方法が紹介されています。
  • Copy the evernote-sdk-ios source code into your Xcode project.
  • Add the evernote-sdk-ios xcodeproj to your project/workspace.
  • Build the evernote-sdk-ios as a static library and include the .h's and .a.
  • Use cocoapods, a nice Objective-C dependency manager. Our pod name is "Evernote-SDK-iOS".
EvenoteSDKはファイル数が多いことと他のSDKもいろいろと利用したいので、今回は3番目のStaticライブラリとして登録してみました。
まずは、ファイル -> Target -> Static Libraryで、Staticライブラリを作成して、ドラッグ&ドロップしてEvernoteSDKのファイルを登録しました。
そしてメインのTargetのLinked Frameworks and Librariesに、Staticライブラリを追加します。
画像

また上記に加え、「Security.framework」もメインのTargetのLibraryに追加しておきます。
これで起動してみてうまく動けば、自分のXCODEプロジェクトに無事にSDKが登録されました。



OAuth認証を行う

続いてOAuth認証を行います。
まずはOAuth認証後にコールバックされるURLをアプリケーションに登録します。
メインのTarget -> Info -> URL Typeに、Evernote用のコールバックURLを登録します。
登録する内容は、以下の感じです。
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string></string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>en-<consumer key></string>
        </array>
    </dict>
</array>	

登録する場所は以下の感じです。
画像

次に、EvernoteSessionの初期化を行います。
「application:didFinishLaunchingWithOptions:」での実装例です。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Initial development is done on the sandbox service
    // Change this to BootstrapServerBaseURLStringUS to use the production Evernote service
    // Change this to BootstrapServerBaseURLStringCN to use the Yinxiang Biji production service
    // BootstrapServerBaseURLStringSandbox does not support the  Yinxiang Biji service
    NSString *EVERNOTE_HOST = BootstrapServerBaseURLStringSandbox;

    // Fill in the consumer key and secret with the values that you received from Evernote
    // To get an API key, visit http://dev.evernote.com/documentation/cloud/
    NSString *CONSUMER_KEY = @"your key";
    NSString *CONSUMER_SECRET = @"your secret";

    // set up Evernote session singleton
    [EvernoteSession setSharedSessionHost:EVERNOTE_HOST
                  consumerKey:CONSUMER_KEY  
                   consumerSecret:CONSUMER_SECRET];
}
さらに続いて、OAuth認証後のコールバックURLの扱いを指定します。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    BOOL canHandle = NO;
    if ([[NSString stringWithFormat:@"en-%@", [[EvernoteSession sharedSession] consumerKey]] isEqualToString:[url scheme]] == YES) {
    canHandle = [[EvernoteSession sharedSession] canHandleOpenURL:url];
    }
    return canHandle;
}
また、アプリがActiveになった場合の実装も指定します。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        [[EvernoteSession sharedSession] handleDidBecomeActive];
}



ここまでEvernoteSDKを利用するための設定が終わりました。
以下では認証を行います。設定が面倒な分、認証は簡単に行うことができていい感じです。
EvernoteSession *session = [EvernoteSession sharedSession];
[session authenticateWithViewController:self completionHandler:^(NSError *error){
    
    if (error || !session.isAuthenticated) {
        NSLog(@"Evernote Auth failed. reason is %@", error);
    
    } else {
        NSLog(@"Evernote Auth Successed.");
    }
}];
これで無事に認証が通れば、Evernote APIを利用できるようになります。
もし認証が通らない場合には、githubのREADME.mdなども確認すると有益な情報を得るかもしれません。



ノート作成APIを実行する

最後に、ノートを作成するAPIを利用する実装を記述します。
ノート作成でいろいろな値を指定できますが、ここではデフォルトノートブックに、タグとか指定せずにノートを作成する方法を記載します。
具体的な実装例は以下となります。
EDAMNote *note = [[EDAMNote alloc] init];
note.title = @"さんぷるTitle";
note.content = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE en-note SYSTEM \"http://xml.evernote.com/pub/enml2.dtd\"><en-note>{{:content}}</en-note>";
note.content = [note.content stringByReplacingOccurrencesOfString:@"{{:content}}" withString:@"サンプルコンテントContents"];

EvernoteNoteStore *store = [[EvernoteNoteStore alloc] initWithSession:[EvernoteSession sharedSession]];
[store createNote:note success:^(EDAMNote *note) {
    NSLog(@"success to save note.");
    
} failure:^(NSError *error) {
    NSLog(@"save note failed. reason = %@", error);
    
}];
上記のconte.contentに指定するXMLがEvernoteのノート記述形式となるのですが、これを調べるのがなかなか面倒でした。
DOCTYPEの指定とか、en-noteタグとか初めてだといろいろと苦労しましたw。



最後に

Evernoteは便利な機能なので、色々なアプリで使えると良いですねー。
今回は投稿機能のみが必要だったのですが、今後も色々なAPIを利用してみたいと思う今日この頃。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。