korhan bircan
Post on 15-Feb-2017
70 Views
Preview:
TRANSCRIPT
Implementing a Feedback Tool Using Off-the-Shelf Backend ServicesKorhan Bircan, CocoaConf 2016
Auto Loan Tracker- Tool helps customers visualize the status of their loan.- Did you know tips:
- Late payments mean more interest- When you make a payment matters
Auto Loan Tracker
Auto Loan Tracker
Auto Loan Tracker- Shot in the dark
- Do customers read the tips?- Are they useful or confusing?
- How do you know your product actually helps people?- (Almost) No one fills out email surveys- Surveys are not real-time- Twitter really only covers edges of reactions
Feedback Tool
Behind the Scenes
Parse
CloudKit
CloudKit- Easy setup - Web dashboard, analytics - Public and private databases - Users need to enter iCloud credentials for the app
to save data - Push notifications when a record changes
Common Operations- Creating&Saving records:
let feedbackResponse = CKRecord(recordType: "FeedbackResponse") feedbackResponse.setValue(response, forKey: "question") publicDatabase.saveRecord(feedbackResponse) { record, error in // Handle error. }
- Querying&Updating records: let predicate = NSPredicate(format: "...") let query = CKQuery(recordType: "FeedbackResponse", predicate: predicate) publicDatabase.perform(query, inZoneWith: nil) { results, error in // Update and save record.. }
- Deleting records: // Query and find the record. publicDatabase.deleteRecordWithID(record.recordID, completionHandler: { recordID, error in // Handle error. })
Firebase- Standard 3rd party setup - Web dashboard (displays JSON), analytics, crash
reporting, advertising - Authenticate users with OAuth Services, Facebook,
Google, Git and Twitter, email/password, or even your own custom service
- Out-of-the-box disk persistence: FIRDatabase.database().persistenceEnabled = true
Firebase
Common Operations- Creating&Saving records:
let reference = FIRDatabase.database().reference() reference.childByAppendingPath("(user.uid)/response").setValue(response)
- Querying&Updating records: reference.queryOrderedByChild("response").observeEventType(.Value, withBlock: { snapshot in // snapshot.children has the response objects. }
- Getting Change Notifications: reference.observe(.value, with: { snapshot in // Do something with the updated data (snapshot.value). })
- Deleting records: objectReference.remove()
ComparisonParse CloudKit Firebase
Setup 🙂 😄 🙂
Dashboard 😄 🙂 😐
Storage size 😐 😄 😐
Security 🙂 😄 🙂
Ease of use 😄 🙂 😐
Data export 😄 😢 😄
Future proof 😢 😄 🤔
Real life testing 🙂 😄 🙂
Disk Persistence 🙁 🙁 😄
Cross-platform 😄 🙂 😄
What we learned- The feature motivates people to pay on time. - Customers want to request new features. - Feedback went from 1% to 14%. - We now know what works and weave them into
future products - Choose right tool for the specific job. - Decouple modules.
Thank you!
A better feedback experience = A better overall experience
top related