evernote ios sdk introduction & practices
Post on 15-Jan-2015
1.388 Views
Preview:
DESCRIPTION
TRANSCRIPT
Evernote iOS SDK introductionGoLater Developer MaoYang
Twitter @GoLaterApp E-Mail my@esast.com
About Me
• 5 years Mac Device Driver/Application developer
• 10 years Enterprise grade software development tools consultant
• Now -> iOS/Android app developer
Today’s Goal
• iOS App development setup -> Xcode 5.x + Cocoapods
• Evernote iOS SDK introduction
• 5 Evernote iOS SDK practices
Evernote SDK
• https://github.com/evernote/evernote-sdk-ios
• Evernote Cloud SDK detail spec ->http://dev.evernote.com
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
Practice-1 SDK setup & OAuth
• Xcode 5.x +
• cocoapods installation—> sudo gem install cocoapods
• Create an iOS project named EasyShare by Xcode
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
Setup URL Scheme
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];!}
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;!}
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];!}
SingleTon need to know in this practice
• [EvernoteSession sharedSession], responsible for login/logout, login status
UI would look like
OAuth
• if(![[EvernoteSession sharedSession] isAuthenticated){}
• [[EvernoteSession sharedSession] authenticateWithViewController:self completionHandler:^(NSError *error){}]
Practice-2 List all of your own notebooks
SingleTon & Class need to know in this practice
!
• [EvernoteStore noteStore] -> For ever note related operation
• EDAMNotebook -> Class of Notebook object
Query Notebook
• [[EvernoteNotesStore noteStore] listNotebooksWithSuccess:^(NSArray *notebooks){ for(EDAMNotebook *notebook in notebooks){} } failure:^(NSError *error){}];
Practice-3 List all of notes in a notebook
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
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
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];
Query
• [[EvernoteNoteStore noteStore] findNotesMetadataWithFilter:filter offset:0 maxNotes:10 resultSpec:resultSpec success:^(EDAMNotesMetadataList *metalist){if(metalist.notes.count > 0)….}failure:^(NSError *error){ } ];
Practice-4 Render note content in UIWebView
Classes need to know in this practice
• ENMLUtility->Convert ENML to HTML
• EDAMNote -> Class of note object
Download note content
• [[EDAMNoteStore noteStore] getNoteWithGuid:note.guid withContent:YES withResourcesData:YES withResourceRecognition:NO withResourceAlternateData:NO success:^(EDAMNote *note){} failure:^(NSError *error{}]
ENML->HTML
• ENMLUtility *utility = [[ENMLUtility alloc] init]
• [utilty convertENMLToHTML:note.content withResources:note.resources completion:^(NSString *html,NSError *error){}
Practice-5 Share note to Social network
setup pod would use in this practice
• pod ‘LINEActivity’, ‘~>0.2’
• pod update
Classes need to know in this practice
• [EvernoteUserStore userStore], For fetching user related information like shardid
• EDAMUser Class of user object
Sharing note URL generated by Evernote
• http://www.evernote.com/shard/{shardid}/sh/{noteguid}/{notekey}
How to get user’s shard id?
• [[EvernoteUserStore userStore] getUserWithSuccess:^(EDAMUser *user){}failure:^(NSError *error){ NSString *shardId = user.shardId}];
Share note then get note’s sharing key
• [[EvernoteNoteStore noteStore] shareNoteWithGuid:note.guid success:^(NSString *key){} failure:^(NSError *error){}]
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]
Share some of My experience …
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?
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
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
Notebook
• User’s own Notebook->EDAMNotebook
• Notebook shared by friend ->EDAMLinkbook
• Business Notebook
• Take care about differences between each notebook interface
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
Q & A
top related