SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
Evernote iOS SDK
introduction
GoLater 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){}]
Sample code
• http://goo.gl/KzUK8W
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){}];
Sample code
• http://goo.gl/I9fNpb
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){ } ];
Sample code
• http://goo.gl/D2G3G6
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){}
Sample code
• http://goo.gl/tUzfQH
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]
Sample code
• http://goo.gl/wGXMrb
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

Mais conteúdo relacionado

Semelhante a EverNote iOS SDK introduction & practices

Practical JavaScript Programming - Session 8/8
Practical JavaScript Programming - Session 8/8Practical JavaScript Programming - Session 8/8
Practical JavaScript Programming - Session 8/8Wilson Su
 
Formacion en movilidad: Conceptos de desarrollo en iOS (I)
Formacion en movilidad: Conceptos de desarrollo en iOS (I) Formacion en movilidad: Conceptos de desarrollo en iOS (I)
Formacion en movilidad: Conceptos de desarrollo en iOS (I) Mobivery
 
iOS 2 - The practical Stuff
iOS 2 - The practical StuffiOS 2 - The practical Stuff
iOS 2 - The practical StuffPetr Dvorak
 
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)Sarp Erdag
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS DevelopmentJussi Pohjolainen
 
Jaoo - Open Social A Standard For The Social Web
Jaoo - Open Social A Standard For The Social WebJaoo - Open Social A Standard For The Social Web
Jaoo - Open Social A Standard For The Social WebPatrick Chanezon
 
Android Workshop 2013
Android Workshop 2013Android Workshop 2013
Android Workshop 2013Junda Ong
 
How to Build & Develop Responsive Open Learning Environments with the ROLE SDK
How to Build & Develop Responsive Open Learning Environments with the ROLE SDKHow to Build & Develop Responsive Open Learning Environments with the ROLE SDK
How to Build & Develop Responsive Open Learning Environments with the ROLE SDKDominik Renzel
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsMatteo Manchi
 
Google Devfest Singapore - OpenSocial
Google Devfest Singapore - OpenSocialGoogle Devfest Singapore - OpenSocial
Google Devfest Singapore - OpenSocialPatrick Chanezon
 
FI MUNI 2012 - iOS Basics
FI MUNI 2012 - iOS BasicsFI MUNI 2012 - iOS Basics
FI MUNI 2012 - iOS BasicsPetr Dvorak
 
Building Cloud Castles
Building Cloud CastlesBuilding Cloud Castles
Building Cloud CastlesBen Scofield
 
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.WO Community
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsEffie Arditi
 
Cross platform mobile development
Cross platform mobile development Cross platform mobile development
Cross platform mobile development Alberto De Bortoli
 
Android Workshop
Android WorkshopAndroid Workshop
Android WorkshopJunda Ong
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...Sencha
 

Semelhante a EverNote iOS SDK introduction & practices (20)

Practical JavaScript Programming - Session 8/8
Practical JavaScript Programming - Session 8/8Practical JavaScript Programming - Session 8/8
Practical JavaScript Programming - Session 8/8
 
Formacion en movilidad: Conceptos de desarrollo en iOS (I)
Formacion en movilidad: Conceptos de desarrollo en iOS (I) Formacion en movilidad: Conceptos de desarrollo en iOS (I)
Formacion en movilidad: Conceptos de desarrollo en iOS (I)
 
iOS 2 - The practical Stuff
iOS 2 - The practical StuffiOS 2 - The practical Stuff
iOS 2 - The practical Stuff
 
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
Hızlı Cocoa Geliştirme (Develop your next cocoa app faster!)
 
Quick Start to iOS Development
Quick Start to iOS DevelopmentQuick Start to iOS Development
Quick Start to iOS Development
 
Jaoo - Open Social A Standard For The Social Web
Jaoo - Open Social A Standard For The Social WebJaoo - Open Social A Standard For The Social Web
Jaoo - Open Social A Standard For The Social Web
 
appledoc_style
appledoc_styleappledoc_style
appledoc_style
 
Android Workshop 2013
Android Workshop 2013Android Workshop 2013
Android Workshop 2013
 
How to Build & Develop Responsive Open Learning Environments with the ROLE SDK
How to Build & Develop Responsive Open Learning Environments with the ROLE SDKHow to Build & Develop Responsive Open Learning Environments with the ROLE SDK
How to Build & Develop Responsive Open Learning Environments with the ROLE SDK
 
React nativebeginner1
React nativebeginner1React nativebeginner1
React nativebeginner1
 
React Native for multi-platform mobile applications
React Native for multi-platform mobile applicationsReact Native for multi-platform mobile applications
React Native for multi-platform mobile applications
 
Google Devfest Singapore - OpenSocial
Google Devfest Singapore - OpenSocialGoogle Devfest Singapore - OpenSocial
Google Devfest Singapore - OpenSocial
 
FI MUNI 2012 - iOS Basics
FI MUNI 2012 - iOS BasicsFI MUNI 2012 - iOS Basics
FI MUNI 2012 - iOS Basics
 
iOS5 NewStuff
iOS5 NewStuffiOS5 NewStuff
iOS5 NewStuff
 
Building Cloud Castles
Building Cloud CastlesBuilding Cloud Castles
Building Cloud Castles
 
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
Beyond Fluffy Bunny. How I leveraged WebObjects in my lean startup.
 
Real World Asp.Net WebApi Applications
Real World Asp.Net WebApi ApplicationsReal World Asp.Net WebApi Applications
Real World Asp.Net WebApi Applications
 
Cross platform mobile development
Cross platform mobile development Cross platform mobile development
Cross platform mobile development
 
Android Workshop
Android WorkshopAndroid Workshop
Android Workshop
 
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
SenchaCon 2016: Building a Faceted Catalog of Video Game Assets Using Ext JS ...
 

Último

Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 

Último (20)

Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 

EverNote iOS SDK introduction & practices

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