SlideShare una empresa de Scribd logo
1 de 46
Descargar para leer sin conexión
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

Más contenido relacionado

Similar 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
 

Similar 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

Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
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
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
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
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 

Último (20)

Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.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 .
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
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
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 

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