46
Evernote iOS SDK introduction GoLater Developer MaoYang Twitter @GoLaterApp E-Mail [email protected]

EverNote iOS SDK introduction & practices

Embed Size (px)

DESCRIPTION

Evernote iOS SDK introduction and provide 5 simple practices for using Evernote SDK

Citation preview

Page 1: EverNote iOS SDK introduction & practices

Evernote iOS SDK introductionGoLater Developer MaoYang

Twitter @GoLaterApp E-Mail [email protected]

Page 2: EverNote iOS SDK introduction & practices

About Me

• 5 years Mac Device Driver/Application developer

• 10 years Enterprise grade software development tools consultant

• Now -> iOS/Android app developer

Page 3: EverNote iOS SDK introduction & practices

Today’s Goal

• iOS App development setup -> Xcode 5.x + Cocoapods

• Evernote iOS SDK introduction

• 5 Evernote iOS SDK practices

Page 4: EverNote iOS SDK introduction & practices

Evernote SDK

• https://github.com/evernote/evernote-sdk-ios

• Evernote Cloud SDK detail spec ->http://dev.evernote.com

Page 5: EverNote iOS SDK introduction & practices

EasyShare for Evernote• Practice-1 : Development environment setup and

using Evernote OAuth API

• Practice-2 : List all of notebooks in your Evernote account

• Practice-3 : List all of notes in a notebook

• Practice-4 : Render note content in UIWebView

• Practice-5 : Share your note to social network

Page 6: EverNote iOS SDK introduction & practices

Practice-1 SDK setup & OAuth

• Xcode 5.x +

• cocoapods installation—> sudo gem install cocoapods

• Create an iOS project named EasyShare by Xcode

Page 7: EverNote iOS SDK introduction & practices

Evernote SDK setup

• create a file named Podfile in your root of project plateform :iOS , ‘7.0’ pod ‘Evernote-SDK-iOS’, ‘1.3.1’

• pod install

• Open EasyShare.xcworkspace in Xcode

Page 8: EverNote iOS SDK introduction & practices

Setup URL Scheme

Page 9: EverNote iOS SDK introduction & practices

Initialize SDK -1#import "EvernoteSDK.h"!!- (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! // Bootstrapping is supported by default with either BootstrapServerBaseURLStringUS or BootstrapServerBaseURLStringCN! // BootstrapServerBaseURLStringSandbox does not support the Yinxiang Biji service! NSString *EVERNOTE_HOST = BootstrapServerBaseURLStringUS; //使⽤用Production Server!! // 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];!}

Page 10: EverNote iOS SDK introduction & practices

Initialize SDK -2

(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;!}

Page 11: EverNote iOS SDK introduction & practices

Initialize SDK-3

- (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];!}

Page 12: EverNote iOS SDK introduction & practices

SingleTon need to know in this practice

• [EvernoteSession sharedSession], responsible for login/logout, login status

Page 13: EverNote iOS SDK introduction & practices

UI would look like

Page 14: EverNote iOS SDK introduction & practices

OAuth

• if(![[EvernoteSession sharedSession] isAuthenticated){}

• [[EvernoteSession sharedSession] authenticateWithViewController:self completionHandler:^(NSError *error){}]

Page 15: EverNote iOS SDK introduction & practices

Sample code

• http://goo.gl/KzUK8W

Page 16: EverNote iOS SDK introduction & practices

Practice-2 List all of your own notebooks

Page 17: EverNote iOS SDK introduction & practices

SingleTon & Class need to know in this practice

!

• [EvernoteStore noteStore] -> For ever note related operation

• EDAMNotebook -> Class of Notebook object

Page 18: EverNote iOS SDK introduction & practices

Query Notebook

• [[EvernoteNotesStore noteStore] listNotebooksWithSuccess:^(NSArray *notebooks){ for(EDAMNotebook *notebook in notebooks){} } failure:^(NSError *error){}];

Page 19: EverNote iOS SDK introduction & practices

Sample code

• http://goo.gl/I9fNpb

Page 20: EverNote iOS SDK introduction & practices

Practice-3 List all of notes in a notebook

Page 21: EverNote iOS SDK introduction & practices

Classes need to know in this practice

• EDAMNoteFilter -> setup filter condition for query notes

• EDAMNotesMetadataResultSpec -> Setup which note metadata fields would return from cloud

• EDAMNoteMetadata -> Class of note metadata!

• EDAMNotesMetadataList , Container for notes object array

Page 22: EverNote iOS SDK introduction & practices

Filter • EDAMNoteFilter *filter = [[EDAMNoteFilter alloc]

initWithOrder:NoteSortOrder_UPDATED ascending:NO words:nil notebookGuid:nil tagGuid:nil timeZone:nil inActive:NO emphasized:NO]

• Filter full api spec doucment—>http://dev.evernote.com/doc/reference/NoteStore.html#Struct_NoteFilter

Page 23: EverNote iOS SDK introduction & practices

Metadata fields • EDAMNotesMetadataResultSpec *resultSpec =

[[EDAMNotesMetadataResultSpec alloc] initWithIncludeTitle:YES includeContentLength:YES includeCreated:YES includeUpdated:YES includeDeleted:YES includeUpdateSequenceNum:YES includeNotebookGuid:YES includeTagGuids:YES includeAttributes:YES includeLargestResourceMime:NO includeLargestResourceSize:YES];

Page 24: EverNote iOS SDK introduction & practices

Query

• [[EvernoteNoteStore noteStore] findNotesMetadataWithFilter:filter offset:0 maxNotes:10 resultSpec:resultSpec success:^(EDAMNotesMetadataList *metalist){if(metalist.notes.count > 0)….}failure:^(NSError *error){ } ];

Page 25: EverNote iOS SDK introduction & practices

Sample code

• http://goo.gl/D2G3G6

Page 26: EverNote iOS SDK introduction & practices

Practice-4 Render note content in UIWebView

Page 27: EverNote iOS SDK introduction & practices

Classes need to know in this practice

• ENMLUtility->Convert ENML to HTML

• EDAMNote -> Class of note object

Page 28: EverNote iOS SDK introduction & practices

Download note content

• [[EDAMNoteStore noteStore] getNoteWithGuid:note.guid withContent:YES withResourcesData:YES withResourceRecognition:NO withResourceAlternateData:NO success:^(EDAMNote *note){} failure:^(NSError *error{}]

Page 29: EverNote iOS SDK introduction & practices

ENML->HTML

• ENMLUtility *utility = [[ENMLUtility alloc] init]

• [utilty convertENMLToHTML:note.content withResources:note.resources completion:^(NSString *html,NSError *error){}

Page 30: EverNote iOS SDK introduction & practices

Sample code

• http://goo.gl/tUzfQH

Page 31: EverNote iOS SDK introduction & practices

Practice-5 Share note to Social network

Page 32: EverNote iOS SDK introduction & practices

setup pod would use in this practice

• pod ‘LINEActivity’, ‘~>0.2’

• pod update

Page 33: EverNote iOS SDK introduction & practices

Classes need to know in this practice

• [EvernoteUserStore userStore], For fetching user related information like shardid

• EDAMUser Class of user object

Page 34: EverNote iOS SDK introduction & practices

Sharing note URL generated by Evernote

• http://www.evernote.com/shard/{shardid}/sh/{noteguid}/{notekey}

Page 35: EverNote iOS SDK introduction & practices

How to get user’s shard id?

• [[EvernoteUserStore userStore] getUserWithSuccess:^(EDAMUser *user){}failure:^(NSError *error){ NSString *shardId = user.shardId}];

Page 36: EverNote iOS SDK introduction & practices

Share note then get note’s sharing key

• [[EvernoteNoteStore noteStore] shareNoteWithGuid:note.guid success:^(NSString *key){} failure:^(NSError *error){}]

Page 37: EverNote iOS SDK introduction & practices

iOS Share Activity for note sharing url

• NSURL *shareURL = [NSURL URLWithString:shareurlstr]

• NSArray *activityItems = @[shareurlstr,shareURL]

• NSArray *applicationActivities = @[[LINEActivity alloc] init]

• UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]

Page 38: EverNote iOS SDK introduction & practices

Sample code

• http://goo.gl/wGXMrb

Page 39: EverNote iOS SDK introduction & practices

Share some of My experience …

Page 40: EverNote iOS SDK introduction & practices

To Sync or not to ?

• Evernote Sync API is another topic, Sync API like Mail IMAP protocol which sync all of cloud changes set to your App

• Do you need all of notebook/notes in your App?

Page 41: EverNote iOS SDK introduction & practices

Rate Limit

• Limit for API calling for each hours

• Implement Cache in your App for reducing Rate Limit exception

• Detail-> http://dev.evernote.com/doc/articles/rate_limits.php

Page 42: EverNote iOS SDK introduction & practices
Page 43: EverNote iOS SDK introduction & practices

Note thumbnails

• Note include in Evernote iOS SDK, Need to use HTTP request to fetch each note’s thumb image

• Please refer to http://dev.evernote.com/doc/articles/thumbnails.php

Page 44: EverNote iOS SDK introduction & practices

Notebook

• User’s own Notebook->EDAMNotebook

• Notebook shared by friend ->EDAMLinkbook

• Business Notebook

• Take care about differences between each notebook interface

Page 45: EverNote iOS SDK introduction & practices

Limitations for Writing to Evernote

• Note content body need to be ENML format, EDAMWriter class could help you

• EDAMLimits.h & EDAMLimits.m has a lot of Regular express for checking your input data

Page 46: EverNote iOS SDK introduction & practices

Q & A